合,於是開啟了設計自己的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。
總結:
- 保留了Object Light list及One Pass Multi Light架構。
- 保留了Screen Space Shadow架構。
- 保留了Scale Render架構。
- 捨棄了Custom Render Setup架構,避免Perframe GetComponent。
- 捨棄了跟PostProcessLayer整合的架構,自行設計自己的PostEffect架構,避免
Perframe GetComponent。 - 目前在重排LightList的部份,仍需透過GetLightIndexMap(),而這個函式回傳值是
int[],有GC的問題,有熱心的網友提供Unity預計在2019會修正這個問題。
Dream continues in...
沒有留言:
張貼留言