精選文章

SmallBurger Asset Home

  SmallBurger

2018年10月8日 星期一

我的MobileSRP

本來一開始想說直接使用LightWeightSRP就好,但越研究之後,發現有許多架構覺得不太適
合,於是開啟了設計自己的MobileSRP之路。

首先我們先來看看基本架構:


原則上,跟LWSRP幾乎是一樣的,比較大的差別是捨棄了IRendererSetup的架構,主要的考量
是目前的需求是不太需要每個Camera有不同的PassContainer,為了這個還要在每個
Frame做GetComponent來增加GC覺得不值得,所以採用固定式PassContainer的方式,儲存在
MobileForwardRendererProcessor裡面。

再來看一下MobileForwardRendererProcessor的架構:
我覺得LightWeightSRP最好的部份,就是在Shadow處理採用了ScreenSpaceShadow的架構,
雖然這樣需要先做一次RenderDepthOnly,但這樣一來可以大幅減少
Receive Shadow Over drawing的部份。
另外在Multi Light的部份,也改成用One pass for loop的方式來處理,不再像之前的Forward是
採Multi pass(其實我之前就覺得這部份很奇怪),所這部份目前就保留了下來,其他
像SetupCameraProperties、CreateColorOrDepthTexture及SetupLightConstants不用來畫圖的Pass
,主要是為了順序性及Pass處理的架構,所以不是所有的Pass都是用來畫圖的。
還有最重要的,就是FinalBlt及CreateColorOrDepthTexture的部份,這是為了處理
Scale Render,一般來說都是直接把3D物件畫入FrameBuffer,但這樣一來處理的像素就過多
,利用這個方式可以將降低3D繪圖處理的像素量,另外在GUI的部份又可以採取原生解析
度的方式,其實在沒有SRP的時候,我早就這樣做了,所以這一部份當然保留下來。

最後來看一下PostEffect的部份:
LWSRP的處理方式,是在每個Frame去call GetComponent抓取PostProcessLayer,以達到每個
Camera都可以有不同的Post特效,但為了這個目的卻要每個Frame抓取Component,所以這裡
捨棄了這樣的做法,採取Interface的方式,由PostEffect主動跟Pass註冊(PostEffexct打錯了
是PostEffect)Interface,來避免perframe call GetComponent,雖然這樣一來,每個Camera的
後置特效都一樣,但對目前的狀況來說夠用了。

相關影片:特別加入了繪圖處理流程的除錯資訊,以方便除錯,由左而右依次是AfterRenderDepthOnly=>AfterRenderOpaques=>AfterRenderSky=>AfterRenderTaransparents
=>AfterRenderFogPostEffect。



總結:
  1. 保留了Object Light list及One Pass Multi Light架構。
  2. 保留了Screen Space Shadow架構。
  3. 保留了Scale Render架構。
  4. 捨棄了Custom Render Setup架構,避免Perframe GetComponent。
  5. 捨棄了跟PostProcessLayer整合的架構,自行設計自己的PostEffect架構,避免
    Perframe GetComponent。
  6. 目前在重排LightList的部份,仍需透過GetLightIndexMap(),而這個函式回傳值是
    int[],有GC的問題,有熱心的網友提供Unity預計在2019會修正這個問題。

Dream continues in...

沒有留言:

張貼留言