切換
舊版
前往
大廳
主題

Tiled shading

Lumi | 2017-01-24 19:26:36 | 巴幣 5 | 人氣 380

最近把動態光源功能加回Vulkan程式裡,以前的OpenGL程式是使用Deferred lighting(又稱Light Pre-Pass)。這方法可以方便處理大量光源,某些特效也容易實作。但總有些效果得在處理光照時需要GBuffer以外的資料,所以這回打算做個撒尿牛丸,把Forward和Deferred兩種方法合併起來。

原本的繪圖流程在輸出GBuffer後增加一個Light Culling步驟,將螢幕切割成許多小方格(Tile),每一個Tile都有一個光源列表用於紀錄自己被那些光源照射。此處使用了Nvidia的方案,將depthmap縮小,然後繪出light geometry來加速Culling,但是省略了找出Camera是否位在光源影響範圍內的步驟。光源列表的儲存方式則參考了惡靈古堡7,存成bit mask比實作link list簡單多了,同時還能避開兩個三角形出現在同一個pixel,同一個光源記錄在列表兩次的情況。


▲Tile中的光源數越多則越紅,反之偏藍色


▲110個sphere light

Deferred lighting中累積光線能量的步驟就不需要了,第二次geometry pass就比照forward shading處理,著色的時候一口氣計算tile中的所有光源。不過像上圖光源數這麼多的情形下,即使光源的影響範圍已經設定成比以前小了點,GTX 750Ti還是撐不太住,FPS只有50左右。範圍再縮小下去就像下圖:



▲同樣是110個光源,FPS升高到69,但是明顯變暗

雖然設計成畫面中最多出現512個光源,但看來沒甚麼發揮的機會。以後有時間應該會升級成clustered shading,將Z方向也切割成好幾塊,讓2D的Tile變成3D的Cluster,說不定效能可以再稍微進步一點。

創作回應

更多創作