最近把動態(tài)光源功能加回Vulkan程式裡,以前的OpenGL程式是使用Deferred lighting(又稱Light Pre-Pass)。這方法可以方便處理大量光源,某些特效也容易實作。但總有些效果得在處理光照時需要GBuffer以外的資料,所以這回打算做個撒尿牛丸,把Forward和Deferred兩種方法合併起來。
原本的繪圖流程在輸出GBuffer後增加一個Light Culling步驟,將螢?zāi)磺懈畛稍S多小方格(Tile),每一個Tile都有一個光源列表用於紀錄自己被那些光源照射。此處使用了Nvidia的方案,將depthmap縮小,然後繪出light geometry來加速Culling,但是省略了找出Camera是否位在光源影響範(fàn)圍內(nèi)的步驟。光源列表的儲存方式則參考了惡靈古堡7,存成bit mask比實作link list簡單多了,同時還能避開兩個三角形出現(xiàn)在同一個pixel,同一個光源記錄在列表兩次的情況。
雖然設(shè)計成畫面中最多出現(xiàn)512個光源,但看來沒甚麼發(fā)揮的機會。以後有時間應(yīng)該會升級成clustered shading,將Z方向也切割成好幾塊,讓2D的Tile變成3D的Cluster,說不定效能可以再稍微進步一點。
原本的繪圖流程在輸出GBuffer後增加一個Light Culling步驟,將螢?zāi)磺懈畛稍S多小方格(Tile),每一個Tile都有一個光源列表用於紀錄自己被那些光源照射。此處使用了Nvidia的方案,將depthmap縮小,然後繪出light geometry來加速Culling,但是省略了找出Camera是否位在光源影響範(fàn)圍內(nèi)的步驟。光源列表的儲存方式則參考了惡靈古堡7,存成bit mask比實作link list簡單多了,同時還能避開兩個三角形出現(xiàn)在同一個pixel,同一個光源記錄在列表兩次的情況。
▲Tile中的光源數(shù)越多則越紅,反之偏藍色
▲110個sphere light
Deferred lighting中累積光線能量的步驟就不需要了,第二次geometry pass就比照forward shading處理,著色的時候一口氣計算tile中的所有光源。不過像上圖光源數(shù)這麼多的情形下,即使光源的影響範(fàn)圍已經(jīng)設(shè)定成比以前小了點,GTX 750Ti還是撐不太住,F(xiàn)PS只有50左右。範(fàn)圍再縮小下去就像下圖:▲同樣是110個光源,F(xiàn)PS升高到69,但是明顯變暗
雖然設(shè)計成畫面中最多出現(xiàn)512個光源,但看來沒甚麼發(fā)揮的機會。以後有時間應(yīng)該會升級成clustered shading,將Z方向也切割成好幾塊,讓2D的Tile變成3D的Cluster,說不定效能可以再稍微進步一點。