Получение абсурдных размышлений о сфере в Raytracing - PullRequest
2 голосов
/ 06 октября 2019

Я пытаюсь реализовать простой процессор на основе процессора Raytracer в C ++. Но при реализации Reflections в сцене я получаю некоторые абсурдные результаты, отражения не покрывают весь объект, от которого я пытаюсь получить отражения. Я приложил изображение для справки.

Вот алгоритм отражения, который я использую.

//reflected ray
                  Vec3 ref =(dir - 2*((dir.dot(Normal))*Normal)).normalized();
                  Vec3 reflect_orig;

                  if(depth < MAX_DEPTH && figurelist[figureHit]->reflectness>0.0f ){
                      if(ref.dot(Normal)<0.0f){

                          reflect_orig = p0 - (Normal*0.001f);

                      }
                      else{
                          reflect_orig = p0 + (Normal*1e-3f);
                      }
                      reflectcolour = reflectcolour+ray_trace(reflect_orig,ref,depth+1);
                      return Pixelcolour = reflectcolour;
                  }
                  else{
                     Pixelcolour = diffuse+specular;
                  }

, где "dir" - это направление луча.

The output image

1 Ответ

0 голосов
/ 07 октября 2019

изображение выглядит не так плохо . Когда я пытался воссоздать вашу сцену в моем GLSL ray tracer , я получил такой результат:

result

Как вы можете видеть, этоне так уж сильно отличается друг от друга освещения. Я только угадал позиции, размеры, цвета, коэффициенты отражения и преломления, поэтому моя сцена не точно такая же, как ваша:

ray.beg();
//                 r   g   b rfl rfr   n                               x     y     z   rx   ry   rz
ray.add_material(0.8,0.8,0.6,0.0,0.0,_n_glass); ray.add_box       (  0.0,  0.0,-10.0,10.0,10.0, 0.1);
ray.add_material(0.8,0.8,0.6,0.0,0.0,_n_glass); ray.add_box       (  0.0,  0.0,+10.0,10.0,10.0, 0.1);
ray.add_material(1.0,0.1,0.1,0.0,0.0,_n_glass); ray.add_box       (-10.0,  0.0,  0.0, 0.1,10.0,10.0);
ray.add_material(0.1,1.0,0.1,0.0,0.0,_n_glass); ray.add_box       (+10.0,  0.0,  0.0, 0.1,10.0,10.0);
ray.add_material(0.8,0.6,0.8,0.0,0.0,_n_glass); ray.add_box       (  0.0,-10.0,  0.0,10.0, 0.1,10.0);
ray.add_material(0.8,0.6,0.8,0.0,0.0,_n_glass); ray.add_box       (  0.0,+10.0,  0.0,10.0, 0.1,10.0);
//                 r   g   b rfl rfr   n                               x     y     z   r
ray.add_material(0.7,0.0,0.0,0.0,0.0,_n_glass); ray.add_sphere    (+ 1.5,- 1.5,+ 0.5,1.5);
ray.add_material(0.0,0.0,0.7,0.8,0.0,_n_glass); ray.add_sphere    (- 1.5,+ 1.5,- 0.5,1.5);
ray.end();

Я использую следующие индексы:

const GLfloat _n_glass=1.561;
const GLfloat _n_vacuum=1.0;

Искажение(отсутствие отражения) на краях вашей синей сферы может быть вызвано низкой точностью, вы использовали double с? Я не знаю, какие библиотеки вы используете, но Vec3 обычно означает только поплавки, попробуйте dVec3 или что-нибудь еще ... проблема может быть связана с этим:

, которые на чистых float s имеют тенденцию вызывать подобные артефакты, даже шум на краях отражающих / преломляющих сфер. Здесь тот же мой двигатель, но на float с:

float noise

, как вы можете видеть, шум чаще в тех областях, где ваш выход невообще не отражайте, что указывает на аналогичную причину ...

Однако я вижу на вашем изображении некоторые искажения соотношения сторон , как вы ожидали квадратное окно и вместо этого получили прямоугольник 640x480, так что вынет коррекции соотношения сторон или нет. Это может слегка испортить направление наведенных лучей и еще больше исказить изображение после отражения / преломления ...

...