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

Я пытаюсь разработать базовый 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?


person Abhishek Bansal    schedule 20.12.2011    source источник


Ответы (2)


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

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

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

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

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

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

person datenwolf    schedule 20.12.2011
comment
что, если я жестко запрограммирую описание сцены только во фрагментном шейдере? например, для плоскости я могу сохранить точку и нормаль только во фрагментном шейдере!! Пока я просто хочу реализовать трассировку лучей на экспериментальной основе. Позже я смогу передать описание сцены из OpenGL во фрагментный шейдер в едином массиве. Моя сцена будет содержать только сферы и плоскости. - person Abhishek Bansal; 20.12.2011
comment
@AbhishekBansal: Жесткое кодирование сцены — это обычный подход для этого, так что вы в безопасности. - person datenwolf; 20.12.2011

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

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

Путешествие по Тору: http://glsl.heroku.com/e#794.0

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

Модутрополис: http://glsl.heroku.com/e#327.0

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

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

person emackey    schedule 27.12.2011
comment
Raymarching != Raytracing - person tigrou; 04.09.2013