Сомнения в RayTracing с GLSL - PullRequest
       85

Сомнения в RayTracing с GLSL

1 голос
/ 20 декабря 2011

Я пытаюсь разработать базовый Ray Tracer. До сих пор я рассчитал пересечение с плоскостью и затенением blinn-phong. Я работаю над окном 500 * 500, и мой основной код генерации лучей выглядит следующим образом

vec3 rayDirection  =   vec3( gl_FragCoord.x-250.0,gl_FragCoord.y-250.0 , 10.0);

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

У меня также есть сомнения, нужно ли нам строить геометрию в коде OpenGL при трассировке лучей в GLSL. например, если я пытаюсь проследить трассировку плоскости, мне нужно построить плоскость в коде OpenGL, используя glVertex2f?

Ответы [ 2 ]

2 голосов
/ 20 декабря 2011
vec3 rayDirection  =   vec3( gl_FragCoord.x-250.0,gl_FragCoord.y-250.0 , 10.0);

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

Нет никаких правильных или неправильных прогнозов.Вы также можете сопоставить пиксели области просмотра с азимутом и углом места.На самом деле ваш способ сделать это не так уж плохо.Я просто передал бы размеры области просмотра в дополнительной униформе вместо жесткого кодирования и нормализовал вектор.Компонент Z буквально работает как фокусное расстояние.

У меня также есть сомнения, нужно ли нам строить геометрию в коде OpenGL при трассировке лучей в GLSL.например, если я пытаюсь проследить трассировку плоскости, мне нужно построить плоскость в коде OpenGL, используя glVertex2f?

Трассировка лучей работает с глобальным описанием, содержащим полную сцену.Примитивы OpenGL, однако, являются чисто локальными, то есть просто отдельными треугольниками, линиями или точками, и OpenGL не поддерживает базу данных сцены.Таким образом, геометрия, переданная с использованием обычной функции рисования OpenGL, не может быть трассирована лучом (по крайней мере, не так).

Это самое большое препятствие для трассировки лучей с помощью GLSL: каким-то образом вам нужно реализовать способ доставки целогосцена как некоторый свободно доступный буфер.

1 голос
/ 27 декабря 2011

Можно использовать Ray Marching для визуализации определенных типов сложных сцен в одном фрагментном шейдере.Вот несколько примеров: (используйте Chrome или FireFox, требуется WebGL)

Подарочные коробки: http://glsl.heroku.com/e#820.2

Torus Journey: http://glsl.heroku.com/e#794.0

Рождественская елка: http://glsl.heroku.com/e#729.0

Modutropolis: http://glsl.heroku.com/e#327.0

Ключом к созданию этой вещи является написание «функций расстояния», которые сообщают лучнику, как далеко он находится от поверхности объекта.Для получения дополнительной информации о функциях расстояния см .:

http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm

...