從內(nèi)置著色器到通用渲染管線,釋放你的創(chuàng)意潛能!

來源:Unity官方平臺
作者:Unity官方平臺
時間:2023-02-22
2048
隨著Unity支持的平臺數(shù)量不斷增加,內(nèi)置渲染管線的局限也日益明顯。由此,Unity發(fā)布兩款新的可編程渲染管線(SRP):HDRP和URP,為用戶提供高靈活度和豐富的自定義空間,增強性能、加速迭代以釋放創(chuàng)意潛能。目前,圖形團隊正努力還原用戶所熟悉的所有功能,并在此基礎(chǔ)上加上更好的性能、更廣的定制空間和更多的工作流程。

隨著Unity支持的平臺數(shù)量不斷增加,內(nèi)置渲染管線的局限也日益明顯。由此,Unity發(fā)布兩款新的可編程渲染管線(SRP):HDRP和URP,為用戶提供高靈活度和豐富的自定義空間,增強性能、加速迭代以釋放創(chuàng)意潛能。目前,圖形團隊正努力還原用戶所熟悉的所有功能,并在此基礎(chǔ)上加上更好的性能、更廣的定制空間和更多的工作流程。

URP是Unity預(yù)先打造好的可編程渲染管線(SRP)應(yīng)用。它的工作流程十分便于美術(shù)創(chuàng)作,還可在大部分平臺上呈現(xiàn)高度優(yōu)化的圖形。通過使用Shader Graph和VFX Graph等工具,沒有編程經(jīng)驗的創(chuàng)作者也可以在URP上編寫著色器和GPU渲染效果。

640.png

URP能幫助創(chuàng)作者實現(xiàn)性能與質(zhì)量的平衡,管線的特色功能能將具備高質(zhì)量圖像的游戲和應(yīng)用部署到多種移動設(shè)備上。如果想把項目從內(nèi)置渲染管線移植到URP,用戶首先需要手動改寫著色器。

本文由Arm公司的Roberto Lopez Mendez聯(lián)合撰寫,討論了基于內(nèi)置渲染管線打造的Arm項目向URP的移植,涵蓋了內(nèi)置著色器到URP的自動轉(zhuǎn)換、自定義著色器轉(zhuǎn)換、LightMode標(biāo)簽的使用以及好處、如何用自定義著色器實現(xiàn)基于本地Cubemap的動態(tài)軟陰影。

640 (1).png

移植著色器到URP:基礎(chǔ)篇

首先,將URP包添加到用戶的項目中。選擇Window>Package Manager來打開Package Manager,從列表中安裝Universal RP。要想升級著色器,找到Edit>Render Pipeline>Universal Render Pipeline>Upgrade Project Materials to URPipeline Materials選項。這一步能將Unity內(nèi)置著色器自動轉(zhuǎn)換成一套URP著色器,幾乎所有的舊版著色器都會轉(zhuǎn)換成Universal Render Pipeline/Simple Lit著色器。

舊版著色器與URP著色器源碼比較

要想了解轉(zhuǎn)換過程“底層”流程,一個快速的方法是查看舊版與URP著色器的源碼。請先從Unity下載庫中下載內(nèi)置著色器。選擇Windows或Mac平臺,再選擇Built-in shaders。解開文件可以看到280多個著色器被分組在不同的文件夾里。

以Mobile-Diffuse著色器為例,該著色器將被轉(zhuǎn)換為URP/Simple Lit著色器。很多URP著色器都來自URP GitHub倉庫的Shader文件夾,以及Unity工程師Felipe Lira放在GitHub上的UniversalShaderExamples。

對于這個項目,Arm的開發(fā)者們決定使用URP Template中的示例場景。他們將“Drywall panel”游戲?qū)ο蟮闹鲝腢RP/Lit改成了URP/Simple Lit,然后在Edit選項里打開了源碼。

在比較URP SimpleLit.shader和Mobile-Diffuse.shader時,首先要注意到SubShader標(biāo)簽上的"RenderPipeline"="UniversalPipeline"鍵值對:

1677051789(1).pngSubShader的標(biāo)簽"RenderPipeline"將告訴Unity哪些渲染管線使用這個SubShader。值是"UniversalPipeline"表示Unity應(yīng)在URP上使用這個SubShader。

在Render Pass(渲染通道)的代碼里,你可以看到著色器的代碼是使用HLSLPROGRAM/ENDHLSL宏來分隔的:

1677051814(1).png

這些宏表明,原本的CG著色器編程語言(C for Graphics)已經(jīng)被High-Level Shading Language(高級著色語言,HLSL)取代,盡管著色器的語法和功能基本相同。Unity的著色器文件使用ShaderLab語法來定義著色器屬性、SubShader和Pass。對于URP來說,這些Pass里面的著色器代碼是用HLSL寫的。

大部分ShaderLab內(nèi)容與內(nèi)置渲染管線相比并無不同,但由于兩個管線內(nèi)部的光照生成流程有所不同,為內(nèi)置渲染管線編寫的ShaderLab著色器將自動被URP禁用。這表示URP著色器對光照的處理不同于內(nèi)置渲染管線。

內(nèi)置渲染管線會對每一束照射到物體上的光單獨進行著色,而URP則在一個Pass里將所有光照和著色任務(wù)排列成組完成。這種差異使得URP會以不同的結(jié)構(gòu)存儲光照數(shù)據(jù),并使用全新標(biāo)準(zhǔn)的著色庫。

在渲染時,Unity會調(diào)取第一段受GPU支持的SubShader代碼塊。如果這段SubShader代碼不包含"RenderPipeline"="UniversalPipeline"標(biāo)簽,則著色器就不會運行于URP中。而Unity將繼續(xù)運行下一個SubShader(如果有的話)。如果所有SubShader均不受GPU支持,則Unity會用大家熟悉的洋紅色進行著色并標(biāo)示錯誤。

一個SubShader可以包含多個Pass渲染通道,且每個通道都必須標(biāo)記上一個具體的光照模式(LightMode)。由于URP使用的是單通道前向渲染器(Forward Renderer),管線只會將GPU支持的第一個"UniversalForward"通道用于渲染。

著色器升級程序能自動將內(nèi)置著色器升級為URP著色器,幫用戶解決了繁雜的部分。那么自定義著色器又要怎樣升級呢?

自定義著色器

用戶需要采取額外的步驟才能將自定義著色器升級為URP著色器。第一步是用HLSL替代.cginc include文件。

640 (3).png

其他實用HLSL include

內(nèi)置著色器函數(shù)是著色器編程的基礎(chǔ)。它們不僅能節(jié)省用戶的時間,還能優(yōu)化常見的運算。以這個include文件為例。它所包含的功能函數(shù)主要有平臺特定功能、常見數(shù)學(xué)函數(shù)、紋理實用程序、紋理格式采樣、深度編碼/解碼、空間變形、地形/筆刷高度圖編碼/解碼以及其他實用程序。

移植著色器到URP:高級步驟

LightMode標(biāo)簽

LightMode標(biāo)簽定義了Pass在光照管線上的作用。在內(nèi)置渲染管線中,大多數(shù)與光照互動的著色器都會被寫成十分詳細的Surface Shader(表面著色器)。不過,自定義的內(nèi)置著色器需要用LightMode標(biāo)簽來指明Pass在光照管線上的處理方法。

下表標(biāo)出了內(nèi)置渲染管線每個LightMode標(biāo)簽對應(yīng)的URP標(biāo)簽。部分舊版內(nèi)置渲染管線的標(biāo)簽不受URP支持:

·MovtionVectors

·PrepassBase

·PrepassFinal

·Vertex

·VertexLMRGBM

·VertexLM

同時,有些URP中的標(biāo)簽也沒有對應(yīng)的內(nèi)置渲染管線標(biāo)簽。

關(guān)于內(nèi)置渲染管線了解更多:

https://docs.unity3d.com/Manual/SL-PassTags.html

關(guān)于URP了解更多:

https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal 10.3/manual/urp-shaders/urp-shaderlab-pass-tags.html

替換著色器

URP目前不支持替換著色器。Dynamic Soft Shadows Based on Local Cubemaps項目原本是為內(nèi)置渲染管線編寫的。如下圖所示,項目使用了簡單的Custom/ctShadowMap著色器來替代棋子的原著色器進行渲染。

陰影攝像機被放在光照的位置,并借助著色器將棋子的外形渲染成一張紋理。這張紋理再被投射到棋盤上,產(chǎn)生棋子的影子。

640 (4).png

不過,URP有一個替代方案。下方流程大致展示了棋子陰影的生成方法(詳細信息請見Unity資源商店上的項目Readme文件):

1.在項目窗口中右擊新建一個URP Renderer Asset。選擇Create>Rendering>Universal Render Pipeline>Forward Renderer,將其命名為如Camera Replacement Renderer。

2.點擊Camera Replacement Renderer Asset來編輯其屬性。

640 (5).png

3.將Filtering過濾方式下的Opaque Layer Mask和Transparent Layer Mask改為Nothing,禁用正常的攝像機渲染(否則,所有對象都會被渲染兩次)。

4.點擊Add Renderer Feature,選擇Render Objects(Experimental)。

5.點擊并重命名新創(chuàng)建的New Render Objects(Render Objects)。用戶將看到以下幾個選項:

·將Filters>Layer Mask設(shè)置為想要渲染的圖層。

·將Overrides>Material設(shè)置為使用替換著色器的材質(zhì)。

6.選擇Assets/Settings/UniversalRP-HighQuality.asset,點擊+來添加一個新的渲染器,并拖入創(chuàng)建的Camera Replacement Renderer資產(chǎn)。

640 (6).png

選擇使用替換著色器的攝像機,將Renderer設(shè)置為配置好的新URP Renderer Asset:

640 (7).png

后處理

后處理效果的種類取決于使用中的渲染管線。內(nèi)置渲染管線的后處理與URP的后處理并不兼容。兩者間的不同大致如下:

內(nèi)置

默認不包含后處理方案;要想使用后處理效果,用戶需要使用Package Manager下載Post-Processing Version 2包,也稱為Post-Processing Stack V2(PPv2)。

URP

包括了自己的后處理方案,Unity會在創(chuàng)建URP模板項目時自動安裝該方案;詳見URP后處理文檔。

要想利用后處理效果,請使用集成的體積系統(tǒng),也叫做Post-Processing V3/PPv3。該系統(tǒng)包括了柔光、色差、景深、色彩調(diào)整、色調(diào)映射和暈影等效果。

Unity 2019.3的URP加入了一個集成的后處理堆棧,使管線有了若干的性能改進。更新后的堆棧還能支持?jǐn)z像機運動模糊和體積框架等新效果。

然而,PPv3不支持自定義的后處理效果,所以2019.4 LTS仍支持PPv2以作為備選方案。若想在2019.4 LTS中使用自定義效果,請將后處理的Feature Set從集成方案設(shè)置為Post-Processing V2(如已安裝)。

后處理在移動端會帶來高能耗,這些效果將占用大量的幀時間。URP有幾種對移動設(shè)備更友好的效果:

·柔光(禁用了High-Quality Filtering)

·色差

·顏色分級

·鏡頭失真

·暈影

現(xiàn)在就來移植你的著色器吧

SRP的引入是Unity最大的轉(zhuǎn)變之一,因為SRP支持用C#腳本安排和配置渲染指令。URP的主要作用在于高效地創(chuàng)建可擴展、畫面流暢的圖形——既保證高端設(shè)備上的圖形質(zhì)量,又保證低端設(shè)備上的圖形性能。

在這些資源的助力下,相信著色器的移植工作會更加輕松便捷。

立即登錄,閱讀全文
原文鏈接:點擊前往 >
文章來源:Unity官方平臺
版權(quán)說明:本文內(nèi)容來自于Unity官方平臺,本站不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。文章內(nèi)容系作者個人觀點,不代表快出海對觀點贊同或支持。如有侵權(quán),請聯(lián)系管理員(zzx@kchuhai.com)刪除!
優(yōu)質(zhì)服務(wù)商推薦
更多