Forward+ = Tile based Light Culling + Tile based Forward Rendering
整体渲染架构分为如下3大步骤:
1、PrePass
将场景的min z、max z渲染至z-buffer。
2、Tile based Light Culling
需要用到CS及其并行数据同步机制,是最复杂的一步。
- 将屏幕划分为8px x 8px的多个tile,每个tile对应一个thread group
- 针对每个thread group,结合其四个角与摄像机位置,并行计算其在viewer空间下的frustum多面体的4个面;每个group计算一次
- 针对每个thread group,发起8x8个thread,每个thread求得所在像素位置的max z与min z。然后利用group share数据同步机制,存储到group share data里。至此每个tile所对应的frustum构造完毕(共6个面)
- 针对每个thread group,利用其8x8个thread,每个thread承载一盏light的culling,可并行实现64盏灯的culling。Culling实现采用分离轴定律来判定tile frustum与light是否相交。并利用group share数据同步机制,将所有与tile frustum相交的light索引号存储到group share data中,形成tile所对应的light列表
- 针对每个thread group,发起1个thread,利用全局数据同步机制,将其tile所对应的light列表统一存入某全局数据区域。至此,所有tile所对应的light culling操作执行完毕。
3、Tile based Forward Shading
在ps中,根据像素位置判断出当前所属的tile,然后根据tile所对应的light列表,索引所有与tile相交的light,一次性进行所有光照与着色计算。