1,multi-light with single pass (farcry 1.2及之后的版本在ps3.0中使用这种方式,其实ps2.0也能使用这种方式)
每个对象最多能计算3-4 (3灯光/ps 2.0, 4灯光/ps 3.0)个灯光,
这样就限制了每个受光照的对象不能太大。
适用于室外/地形场景
2,multi-pass (DOOM3,farcry 1.2之前的版本使用这种方式)
每light要渲染一个pass, 多light的情况下DP的次数会过高。
适用于室内/三角形数量较少的场景
3,deferred rendering (killzone2,stalker使用这种方式)
G-Buffer点的显存大,耗的带宽高,DX9下不能实现MSAA(dx9下MRT不支持MSAA)
材质受限制(因为是在后处理阶段计算光照,shader算法没办法针对不同的对象区分实现)
4,light indexed deferred rendering
DP次数比1,3高,比2低,显存带宽适中, 每个对象的shader中必须固定该对象的每个fragment计算的最大灯光数量.
5,light pre-pass rendering (cryengine3使用这种方式,还有若干制作中的游戏/引擎使用这种方式)
DP次数比1,3高,比2低,显存带宽适中,材质受限制
(1) 渲染场景,输出depth和normal到一个rendertarget
rendertarget的格式:R8G8B8A8,R8G8存depth,B8A8存normal.xy
R16G16B16A16,R16B16存depth,B16存normal.xy,A16存材质信息(specular power?)
(2)使用第一个pass生成的depth和normal数据,渲染所有的灯光到light texture, RGB存计算后的光照值,
A分量存每个象素的specular intensity
(3)整个场景再渲染一次,使用(2)中生成的light texture,采样纹理(diffuse,specular mask...),计算光照。