G-buffer

Материал из SkyXEngine wiki
Перейти к: навигация, поиск

G-buffer (geometry buffer) - набор render targets (текстуры, в которые можно рисовать) хранящих в себе информацию о текущей сцене. Размеры всех render targets одинаковые и как правило равны размеру окна рендера. G-buffer используется в технике deferred shading. На основании информации в G-buffer можно произвести полноценное освещение с учетом всех материалов. Преимуществом deferred shading является неограниченное количетсво источников света в сцене, так как этапы рендера геометрии и освещения отделены.

G-buffer в SkyXEngine

В SkyXEngine G-buffer введен с версии 0.9.0 и состоит из 4 render targets:

  • color - albedo цвет сцены
  • normals - нормали и слои
  • parameters - параметры освещения
  • depth - линейная глубина
G-buffer SkyXEngine
Render target Формат Компоненты
color rgba8 rgb - красный/зеленый/синий цвета сцены, a - прозрачность, если имеется
normals rgba8 xyz - нормаль, w - содержит в себе упакованное значение типа освещаемости материала (если освещается то значение больше 0.5 иначе меньше 0.5) и идентификатора материала, в дальнейшем преобразуется [0, 128]
parameters rgba8 r - шероховатость (roughness), g - отражательная способность (f0), b - просвечиваемость (thickness), a - затенение (fake occlusion)
depth r16/r32 (предпочтительно) r - линейная глубина

Color render target

Color render target содержит только albedo цвета сцены, а именно всех сущностей обладающих материалами.

Normals render target

Нормали хранятся вместе с дополнениями (микрорельеф и прочее).

Упаковка нормалей простая:

vNormal * 0.5 + 0.5

Распаковка тоже простая:

vNormal * 2.0 - 1.0

Код упаковки/распаковки w компоненты находится в shaders/mtrl.h в функциях LayerEncode/LayerDecode

Хранение глубины

Глубина храниться линейная, причем с некоторой модификацией. Глубина записывается как:

(z + near) / far

Код расчета глубины находится в shaders/mtrl.h в функции ComDepthByPos. Использование такой глубины аналогично использованию линейной.

Предпочтительно использование R32 глубины для большей точности.

См. также: