Проблема реализации отражений в трассировке лучей - PullRequest
0 голосов
/ 03 мая 2020

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

        ray* reflected = new ray();
        reflected->direction = rayIn.direction - (2 * glm::dot(rayIn.direction, normal)) * normal;
        reflected->origin = int_point + epsilon * normal;
        outColor += ((int_object->reflectivity)*intersectray(*reflected, depth - 1));

Вот изображения с кодом:

img

Без кода:

img

Я отредактирую сообщение, если потребуется больше кода.

Редактировать : Кажется, проблема в том, что я перебираю объекты на сцене , Я вставляю объекты как

    scene->add(sphere1);
    scene->add(sphere2);

Но когда я изменяю это на:

    scene->add(sphere2);
    scene->add(sphere1);

, вывод выводится правильно. Сфера 1 находится ближе к камере, чем сфера 2, и они не перекрываются.

1 Ответ

0 голосов
/ 03 мая 2020

Проблема была в этой части кода

for (objects in scene){
    double intersection = (*objIterator)->intersect(rayIn,normal);

    if (intersection < minDistance && intersection > epsilon  )
    {
        minDistance = intersection;
        int_object = *objIterator;
        int_point = rayIn.origin + intersection * rayIn.direction + (epsilon * normal);
    }}

Здесь нормаль используется позже для других вычислений, но первая строка обновляет нормаль для пересечения текущего объекта (даже если она не закрыта). Поэтому я добавил вектор для хранения нормали объекта пересечения и использовал его позже.

...