Unity--Unity--URP渲染管線核心機(jī)制分析(4)URP渲染管線Shader機(jī)制剖析
上一節(jié)通過剖析URP 光源機(jī)制,本節(jié)來分析URP的Shader機(jī)制,不同的渲染管線渲染處理的基礎(chǔ)與策略是不一樣的,所以Shader的寫法是不同的,在URP渲染管線下不能使用之前的標(biāo)準(zhǔn)向前渲染管線的Shader,當(dāng)然向前渲染管線也不能使用URP的shader。URP 渲染管線的Shader采用的是HLSL開發(fā),普通標(biāo)準(zhǔn)的Shader是采用Cg來開發(fā)。URP Shader實現(xiàn)了游戲開發(fā)中常用的一些Shader,并提供源碼,方便我們參考學(xué)習(xí)URP Shader開發(fā)。URP渲染管線的Shader源碼在Packages/Universal RP/Shaders目錄下,如圖1.4-1所示:
?

圖1.4-1 URP Shader
URP 渲染管線實現(xiàn)了內(nèi)置的PBR, Unlit , 地形等游戲開發(fā)中常用的Shader。
1: URP Ulit Shader
我們先來分析一下URP 的Unlit Shader的模板,創(chuàng)建一個材質(zhì)球,選“Universal Render Pipeline/Unlit” Shader模板,在場景中創(chuàng)建一個Cube,把材質(zhì)球關(guān)聯(lián)到Cube上。如圖1.4-2所示:

Unlit Shader還是采用的Unity經(jīng)典的ShaderLab語法,還是熟悉的配方熟悉的味道。主要結(jié)構(gòu)依然是Shader{ SubShader { pass{} pass{} }, SubShader {}, FallBack }與標(biāo)準(zhǔn)的Unity Shader開發(fā)不同的是 URP Shader內(nèi)嵌HLSL的代碼,標(biāo)準(zhǔn)的是Cg的代碼,其它的差不多。

對于Unlit Shader有兩個SubShader,通過”ShaderModel”的版本來進(jìn)行區(qū)分 (我這邊的版本是4.5與2.0)。每個SubShader有3個Pass, Unlit Pass, Depth Only Pass, Meta Pass
Unlit Pass:?Unlit Shader用來繪制3D物體的主要pass;
Depth Only Pass:?Unlit Shader 用來做深度測試的Pass;
Meta Pass:?繪制物體的時候不會執(zhí)行,只有在做靜態(tài)光照烘焙的時候才會執(zhí)行;
?
2: URP PBR Shader 如何處理光照
分析完URP的Unlit Shader后,接下來分析PBR Shader, PBR Shader基于物理的光照,支持金屬度與粗超度美術(shù)工作流,反射與光澤度工作流,這些參數(shù)和標(biāo)準(zhǔn)PBR Shader一樣,來看下URP的PBR Shader。如圖1.4-4:

相比標(biāo)準(zhǔn)的PBR Shader而言,他整理的更清晰和規(guī)范,參數(shù)的意義都和標(biāo)準(zhǔn)的PBR一樣。和標(biāo)準(zhǔn)PBR Shader不同的是,它把兩種美術(shù)工作流放一起了。Workflow Mode來設(shè)置。接下來看下PBR Shader的結(jié)構(gòu),打開Lit.shader, 仍然也是ShaderLab語法內(nèi)嵌HLSL的Shader編程語言,結(jié)構(gòu)如下,如圖1.4-5所示:

圖1.4-5
與Unlit一樣Lit也是根據(jù)ShaderModel版本來選擇SubShader。Lit 每一個SubShader里面有7個pass, 作用如下:
ForwardLit Pass:?渲染3D物體, UniversalRenderPipeline.cs里面會根據(jù)名字來調(diào)用該P(yáng)ass, 所有的光照計算都會在這個Pass里面調(diào)用(GI + emission + Fog);
ShadowCaster Pass:?陰影投射Pass, 主要是用來做陰影計算;
GBuffer Pass:?當(dāng)采用延時渲染的時候會走的Pass, UniversalRenderPipeline.cs里面會根據(jù)名字來調(diào)用該P(yáng)ass。
Depth Only Pass:?Lit Shader 用來做深度測試的Pass;
DepthNormals Pass:?用戶繪制_CameraNormalTexture紋理的Pass;
Meta Pass:?繪制物體的時候不會執(zhí)行,只有在做靜態(tài)光照烘焙的時候才會執(zhí)行;
Universal2D Pass:?用于2D的向前渲染Pass;
?
URP 渲染管線內(nèi)部實現(xiàn)了(向前+延時)渲染管線,每次繪制的時候,來走不同的Pass,從這里看出來,和標(biāo)準(zhǔn)渲染管線不同,所有的光照都在一個pass里面計算完成了。接下來看下PBR Shader中的光照計算的代碼,打開LitForwardPass.hlsl, 主要PBR邏輯如下:
Step1: 初始化雙向分布函數(shù)BRDF:
Step2: 計算主光源MainLight 光照;

Step3: 計算處理GI;
Step4: 計算處理附加光源光照;

Step5: 處理自發(fā)光;

具體代碼大家可以到源碼中閱讀,本期的URP的干貨內(nèi)容暫時告一段落,更多的URP實戰(zhàn)與底層原理,我們會在VIP的視頻教程中有消息講解。關(guān)注我們,持續(xù)給大家分享一些架構(gòu)師進(jìn)階,渲染管線進(jìn)階的干貨內(nèi)容。