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,一次性進行所有光照與著色計算。