最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Unity--Unity--URP渲染管線核心機(jī)制分析(4)URP渲染管線Shader機(jī)制剖析

2022-08-31 16:26 作者:博毅創(chuàng)為  | 我要投稿

上一節(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)容。



Unity--Unity--URP渲染管線核心機(jī)制分析(4)URP渲染管線Shader機(jī)制剖析的評論 (共 條)

分享到微博請遵守國家法律
广饶县| 略阳县| 静宁县| 吉木乃县| 兰考县| 东乡族自治县| 兴安县| 贵南县| 大同市| 墨玉县| 扬州市| 中宁县| 兰溪市| 阿鲁科尔沁旗| 宜良县| 会理县| 麦盖提县| 贵港市| 霍邱县| 海门市| 乡城县| 囊谦县| 称多县| 社旗县| 全南县| 永胜县| 定陶县| 上犹县| 兴义市| 泽州县| 北川| 江达县| 屯昌县| 张家港市| 天峨县| 平安县| 富川| 监利县| 朝阳县| 巴马| 沁源县|