2014-11-29 2 views
1

Я хотел бы реализовать трассировку лучей в opengl и glsl для рендеринга моделей, загруженных из файлов .obj, но я не понимаю, как именно это сделать. Я использовал файлы obj раньше, но я использовал растеризацию для их рендеринга. До сих пор я реализовал простой трассировщик лучей с использованием фрагментарного шейдера, который отображает некоторые простые формы (плоскости, сферы, прямоугольники). Дело в том, что в трассировке лучей я вычисляю пересечения с объектами, но они также определены в шейдере фрагментов.raytracing obj file в opengl/glsl

Вот как я сделал рендеринг с использованием растеризации: После загрузки данных вершин (положение, нормаль, увс) Я храню их в VBO и привязываю их к VAO. Они посылают в вершинный шейдер и преобразуют их, умножая их на матрицы MVP. Затем я отправляю преобразованные вершины в фрагментарный шейдер, когда я их затушевываю. Но это та часть, которую я не понимаю, как реализовать трассировку лучей, потому что теперь я преобразовал вершины в качестве входов в шейдер фрагмента, а это значит, что я не знаю, как рассчитать пересечения лучей с треугольниками сетки. Итак, как это сделать?

+0

см. [Трассировщик луча GLSL во фрагменте с использованием текстуры как геометрия сцены] (https://stackoverflow.com/a/45140313/2521214) – Spektre

ответ

1

Ну, по сути, для каждого фрагмента вы выполняете тест пересечения лучей со всей сценой. Таким образом, задача заключается в кодировании сцены в некоторой структуре данных, к которой можно получить доступ из шейдера фрагментов и для этого достаточно места. Непосредственным выбором будет три 1D-текстуры с 3-компонентами одинакового размера, где для каждого индекса текселя тройка трех текстур представляет треугольник. Затем для каждого луча, сбрасываемого в сцену (т. Е. Для каждого фрагмента), итерации по треугольникам.

Если вы хотите получить немного больше внимания, вы можете использовать три 3D-текстуры вместо этого, помещая данные треугольника в нужную область текстуры, чтобы ограничить тексели, чтобы перебрать их, использовать их уровни mipmap для LOD и использовать разреженное хранилище текстур для уменьшения объема памяти.