Как я могу визуализировать отражения в OpenGL ES на iPhone без буфера трафарета?

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

Чтобы уточнить, проблема не в отображении самих отражений, а в их скрытии, когда они не были бы видны.

Любые идеи?

Ответов (2)

Решение

Сначала визуализируйте отраженную сцену; скопировать в текстуру с помощью glCopyTexImage2D ; очистить фреймбуфер; нарисуйте сцену, применив скопированную текстуру к отражающей поверхности.

У меня нет ответа на отражение, но вот как я делаю тени без буфера трафарета, возможно, это даст вам представление:

Я выполняю базовое определение передней / задней поверхности меша с точки зрения источника света. Затем я получаю список всех ребер, которые соединяют передний треугольник с задним треугольником. Я отношусь к этому списку краев как к "петле" линии. Я проецирую вершины этой петли вдоль луча объектного света, пока он не пересечет землю. Эти точки пересечения затем используются для расчета двухмерного многоугольника на той же плоскости, что и земля. Затем я использую алгоритм тесселяции, чтобы превратить этот многоугольник в треугольники. (Это прекрасно работает, если источники света или объекты не двигаются слишком часто.)

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