Как сделать трассировку лучей в современном OpenGL? - PullRequest
28 голосов
/ 08 сентября 2010

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

Нос чего начать?

Предположим, что я никогда не выполнял освещение в старом OpenGL, поэтому я бы обратился непосредственно к не устаревшим методам.

Приложение в настоящее время правильно настроило объекты буфера вершин,ввод вершин, нормалей и цветов, и он правильно рисует и преобразует модели в пространстве, в плоский цвет.

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

Ответы [ 3 ]

28 голосов
/ 08 сентября 2010

Я бы не советовал пробовать реальную трассировку лучей в OpenGL, потому что для этого нужно много хаков и хитростей, и, если вы спросите меня, больше нет смысла делать это вообще. Если вы хотите выполнять трассировку лучей в графическом процессоре, вам следует использовать любой язык GPGPU, например CUDA или OpenCL, потому что он делает вещи намного проще (но все же далеко не тривиальными).

Чтобы проиллюстрировать проблему немного дальше: Для трассировки лучей необходимо проследить вторичные лучи и проверить их на пересечение с геометрией. Следовательно, вам необходим доступ к геометрии каким-то хитрым способом внутри вашего шейдера, однако внутри фрагментного шейдера вы не сможете получить доступ к геометрии, если не сохраните ее «закодировано» в какой-либо текстуре. Вершинный шейдер также не предоставляет вам эту информацию о геометрии изначально, а геометрические шейдеры знают только соседей, поэтому проблема уже начинается. Далее, вам нужны ускоряющие структуры данных, чтобы получить любую разумную частоту кадров. Однако, например, прохождение Kd-Tree внутри шейдера довольно сложен, и, если я правильно помню, есть несколько статей, посвященных исключительно этой проблеме. Если вы действительно хотите пойти по этому пути, тем не менее, есть много статей на эту тему, их не должно быть слишком сложно найти.

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

Еще один момент, на который следует обратить внимание: по крайней мере, насколько мне известно, трассировка лучей в реальном времени на графических процессорах в основном ограничена статическими сценами, например kd-деревья работают (хорошо) только для статических сцен. Если вы хотите иметь динамические сцены, вам нужны другие структуры данных (например, BVHs, iirc?), Но вам необходимо постоянно поддерживать их. Если я ничего не пропустил, то сейчас еще много исследований по этому вопросу.

20 голосов
/ 08 сентября 2010

Возможно, вы путаете некоторые вещи.

OpenGL - растеризатор. Заставить его сделать трассировку лучей возможно, но сложно. Вот почему raytracing не «идеален для графики в реальном времени через несколько лет». Через несколько лет будут работать только гибридные системы.

Итак, у вас есть три возможности.

  • Чистая трассировка лучей. Визуализируйте только полноэкранный четырехугольник, и в своем фрагментном шейдере прочитайте описание сцены, упакованное в буфер (например, текстуру), пройдите по иерархии и вычислите пересечения лучей и треугольников.
  • Гибридная трассировка лучей. Растеризуйте вашу сцену обычным способом и используйте трассировку лучей в вашем шейдере в некоторых частях сцены, которые действительно в этом нуждаются (преломление, ... но это может быть симулировано при растеризации)
  • Чистая растеризация. Фрагментный шейдер выполняет свою обычную работу.

Чего именно вы хотите достичь? Я могу улучшить ответ в зависимости от ваших потребностей.

В любом случае, этот ТАК вопрос тесно связан. Даже если эта конкретная реализация имеет ошибку, это определенно путь. Другая возможность - openCL, но концепция та же самая.

0 голосов
/ 17 марта 2019

Что касается 2019, трассировка лучей - это опция для рендеринга в реальном времени, но для нее требуются высокопроизводительные графические процессоры, которых у большинства пользователей нет. Некоторые из этих графических процессоров разработаны специально для трассировки лучей. OpenGL в настоящее время не поддерживает аппаратное усиление трассировки лучей. DirectX 12 на Windows имеет поддержку для этого. Рекомендуется подождать еще несколько лет, прежде чем создавать средство визуализации только с трассировкой лучей, хотя это возможно при использовании DirectX 12 с текущим оборудованием для настольных компьютеров и ноутбуков. Поддержка с мобильного может занять десятилетия. Я не вижу, чтобы openGL поддерживала трассировку лучей, но в будущем вулкан мог бы это поддержать.

...