精選文章

SmallBurger Asset Home

  SmallBurger

2023年1月9日 星期一

簡單的FragmentShader light culling forward plus(面向行動平台)

最近Forward plus成為比較熱門的渲染管線之一,連Unity在新版本也在開發中,他採用的方式是用Job來做culling,我自己實作的方式是用ComputeShader來做culling,相關連結如下:
AkilarLiao / ForwardPlusURP
但目前這些主流的做法,幾乎都會用到SSBO,另外內存的使用也比較大,想一想其實上帝視角Z值的疊合狀況不是那麼嚴重,所以在想有沒什麼簡單的方式,可以單純使用一個FragmentShader來處理像素等級的剃除,於是開啟了FragmentShader light culling forward plus之旅…

步驟如下:

  1. PreDepthPass,這是Forward plus常規的處理流程之一,對行動平台不是很友善,之後看看是不是可以少這個步驟,使用上一偵的深度貼圖來處理,感覺有點麻煩。
  2. 寫一個FragmentLightCullingPass,主要是用來生成LightIndexTexture,裡面只是很簡單地把Unity的回傳回來的visibleLights進行相關的燈光資料蒐集,填入相關的UBO,並把主光排除掉,然後把深度貼圖傳入到相關的FragmentShader中,並運行來做燈光蒐集。
  3. FragmentShader裡,跑了一個燈光的清單的檢查,目前一個像素最多存入二個燈光,蒐集的方式是比對燈光位置及目前的深度紋理的世界座標位置的距離,只存最近的兩盞光,另外這邊也有做降貼圖的尺吋,就像Tile一樣,不用這麼細,以提升燈光culling的性能。
  4. 最後光照處理的部份,會存取這張LightIndexTexture,取出相對應的燈光索引及數量,之後就做常規的BRDF打光處理。

目前這樣做最大的好處,就是避免使用SSBO及ComputeShader,對跨平台的部份比較友好,缺點就是每一個像素支持的燈光數量比較少,不過至少比原生的URP light weight以Object相關做為燈光索引的部份,優化了不少,尤其是大面積的地表或物件,相關的視頻如下:


Dream continues in...


沒有留言:

張貼留言