Рассмотрим отложенное освещение. В двух словах, отложенное освещение - это метод, который использует сокращенную версию отложенного затенения для расчета карты освещения пространства экрана. Во втором проходе геометрия снова отображается с использованием карты освещения пространства экрана в качестве информации о освещении.
Этот метод используется для уменьшения размера G-буфера, так как требуется меньше атрибутов. Это также дает вам преимущество в том, что G-Buffer и карта пространства экрана могут иметь более низкое разрешение, чем экран.
Я реализовал строгий рендерер, основанный на GLES 2.0 (хотя и экспериментальный), и мне удалось свести G-буфер к одной RGBA-текстуре (да, я использовал texture2D вместо рендеринга буфера). Он содержал карту нормалей экранного пространства + буфер глубины в альфа-канале (насколько я помню, был сжат с использованием логарифма).
Атрибуты положения (называемые здесь миром ) можно вычислить во время прохода освещения, используя тот факт, что в перспективной проекции .xy делится на .z , так что:
х уег у с т у м= х уш о г л д/ zвесо г л д
Я приблизил xy атрибута позиции, выполнив:
х уш о г л д= х уег у с т у м∗ zш о г л д
Примечание: мне пришлось делать дальнейшие настройки в зависимости от настроек матрицы проекции.
Также стоит отметить, что я был в состоянии опустить компонент .z нормальных векторов, так как я мог восстановить .z из .xy, поскольку вектор нормализован так, чтобы:
Икс2+ у2+ z2----------√= 1Икс2+ у2+ z2= 1Z2= 1 - ( х2+ у2)Z= 1 - ( х2+ у2)-----------√
Используя эту технику, я смог освободить другой канал в моем G-буфере RGBA и использовал его для хранения зеркальной карты экранного пространства (или, если хотите, глянца).