G-buffer
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 - линейная глубина
Render target | Формат | Компоненты |
---|---|---|
color | rgba8 | rgb - красный/зеленый/синий цвета сцены, a - коэффициент освещенности (1 - полное освещение; 0 - не принимает свет) |
normals | rgba8 | xyz - нормаль, w - коэффициент f0 |
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 в функциях NormalEncode/NormalDecode.
Хранение глубины
Глубина хранится линейная с инверсией
1 - z / near
Предпочтительно использование R32 глубины для большей точности.