opengl — возможность зеркального шейдера?

До сегодняшнего дня, когда я хотел создать отражения (зеркало) в openglЯ визуализировал вид текстуры и отобразил ее на зеркальной поверхности.

То, что я хочу знать, есть ли другие способы создать зеркало в опенгл?

И 2. можно ли это сделать одинокий в шейдерах (например, геометрия шейдера)?

3

Решение

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

  • Плоские отражения: Это то, что вы уже делаете.
    Обратите внимание, что ваше зеркало должно быть плоским, и вы должны обрезать его так, чтобы что-нибудь ближе, чем зеркало, не отображалось в текстуре.
  • Старый добрый cubemaps: прикрепите кубическую карту к каждому зеркалу, затем выберите образец в направлении отражения. Это работает для любой поверхности, но вам нужно будет визуализировать кубические карты (что можно сделать только один раз, если вас не волнует отражение движущихся объектов). Я не думаю, что вы можете сделать это без шейдеров, но только зеркало понадобится. Это очень распространенный метод, так как его легко реализовать, он может быть динамичным и довольно дешевым, а также легко интегрироваться в существующий движок.
  • Экран космический лучевой: Это что Danny-ruijters предложил. Вроде как SSAO : для каждого пикселя выбирайте буфер глубины вдоль вектора отражения, пока не дойдете до чего-нибудь. Это имеет то преимущество, что оно применимо в любом месте (на произвольных сложных поверхностях), однако оно может отражать только то, что появляется на экране, что может привести к множеству мелких артефактов, но оно полностью динамично и очень просто в реализации. Обратите внимание, что вам потребуется дополнительный проход (или отображение нормалей в буфер), чтобы получить доступ к финальному цвету вашей сцены при вычислении отражений. Для этого вам абсолютно необходимы шейдеры, но это пост-процесс, поэтому он не будет мешать визуализации сцены, если вы боитесь этого.
    Некоторые современные игровые движки Используйте это, чтобы добавить мелкие детали к отражающим поверхностям без необходимости вычислять / хранить кубические карты.

Это, вероятно, много других способов визуализации зеркал, но это основной (по крайней мере, насколько я знаю) способ создания отражений.

5

Другие решения

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

Вы можете найти пример OpenGL Вот и пример WebGL, включая зеркалирование Вот.

6

По вопросам рекламы [email protected]