簡介
URP全稱為Universal Render Pipeline(通用渲染管線),可以提供更加靈活的渲染方案,通過添加Render Feature實現(xiàn)各種渲染效果。并且可以針對移動平臺進(jìn)行專門的優(yōu)化,同時還提供了SRPBatcher提高渲染效率。Unity的一些工具,比如ShaderGraph,也是必須在URP管線下才可以使用,可以說許多方面均優(yōu)于內(nèi)置渲染管線。
所以如果還在使用內(nèi)置渲染管線的,建議盡早升級到URP。通過本文,可以了解到如何從內(nèi)置管線升級到URP。并且記錄了一些升級時可能遇到的問題和解決方法。
一、安裝并配置URP
1.安裝對應(yīng)package
2.創(chuàng)建配置
Create->rendering->Universal pipeline->Pipeline Asset(Forward Renderer)生成兩個配置文件(目前放在Pipeline文件夾下)
Edit->Project Settings->Graphics 界面,將UniversalRenderPipelineAsset拖入
3.統(tǒng)一升級自帶的shader
Edit->Render Pipeline->Universal Render Pipeline-> Upgrade Project Materials to Universal PR Materials
可以將使用默認(rèn)built-inShader升級到URP的Shader
二、關(guān)于內(nèi)置管線升級至URP管線的問題處理
在未使用URP管線的時候,由于一些shader是使用CG語言寫的,而URP并不支持該語言。所以需要將其改為HLSL(High level shader language)編寫。
查看對應(yīng)源文件
1、cginc文件的內(nèi)置函數(shù)可以在Editor引擎安裝目錄下查看? xxx\Editor\2020.1.0f1c1\Editor\Data\CGIncludes
2、hlsl文件則是在工程對應(yīng)的Library文件下可以找到:
以Core.hlsl為例子,頭文件路徑為
Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl
實際在工程中的位置是
xxx\ProjectName\Library\PackageCache\com.unity.render-pipelines.universal@8.2.0\ShaderLibrary\Core.hlsl
宏替換
|
包含的頭文件替換
|
Tag替換
|
對Texutre2D的處理
|
參考文檔
升級Urp
https://www.jianshu.com/p/3fef69e2efb6
https://zhuanlan.zhihu.com/p/147228689
三、場景內(nèi)組件修改
1.多相機(jī)修改
URP管線相機(jī)不再支持相機(jī)的depth屬性。主攝像機(jī)RenderType設(shè)置為base。其他的攝像機(jī)的RenderType 都是Overlay類型。
并且需要將其他相機(jī)加入到主相機(jī)的Stack中
四、如何啟用SRPBatcher
SRP Batcher 是一個渲染循環(huán),可通過許多使用同一著色器變體的材質(zhì)來加快場景中的 CPU 渲染速度。雖然不會減少DC的次數(shù),但是SRPBatcher可以降低準(zhǔn)備DC數(shù)據(jù)的耗時。相關(guān)的官方文檔https://docs.unity3d.com/cn/2020.2/Manual/SRPBatcher.html
注意事項
同一個Shader不能同時啟用SRP Batcher或者Gpu Instance。并且SRP Batcher的優(yōu)先級是最高的。會導(dǎo)致原先可以合批的DC被打斷。
1.設(shè)置
需要在URP設(shè)置中的Advaneced->SRP Batcher打開
2.修改Shader以支持SRPBatcher
需要用CBUFFER_START(UnityPerMaterial)和CBUFFER_END,將所有Properties內(nèi)聲明的變量包住。例子如下:
|
需要注意的是,像Properties內(nèi)的紋理變量,雖然聲明的時候只有一個變量,但是相關(guān)的SAMPLER變量也要包在CBUFFER內(nèi)。
修改后如果支持SRPBatcher,在對應(yīng)shader的Inspector界面的SRPBatcher屬性會顯示為compatible
如果是不支持SRPBatcher的Shader對應(yīng)Shader的SRPBatcher屬性會顯示為not compatible,并且會顯示不支持的原因
3.SRPBatcher性能優(yōu)化的檢測工具
1.添加SRPBatcherProfiler.cs文件添加到工程中,代碼庫地址是https://github.com/Unity-Technologies/SRPBatcherBenchmark
2.將SRPBatcherProfiler腳本拖到需要進(jìn)行檢測的場景中,點擊F8顯示/隱藏SRPBatcherProfiler界面,點擊F9打開/關(guān)閉(實際發(fā)現(xiàn)F9功能不好使,無法中途打開關(guān)閉)SRPBatcher功能??梢詫Ρ却蜷_該功能前后的CPU消耗情況。
五.升級URP之后的一些異?,F(xiàn)象
1.Culling mask導(dǎo)致光照的表現(xiàn)不同
升級URP后發(fā)現(xiàn)物體的光照表現(xiàn)不太一樣。經(jīng)過測試發(fā)現(xiàn),在內(nèi)置管線時,light的Culling mask是有效的,而在URP下,Culling mask失效了。多光源的情況下,HLSL和GC兩個Shader通過GetMainLight獲取的光線都是不同的。
處理方式是獲取所有的AddtionalLight,然后根據(jù)light的distanceAttenuation值去判斷,哪個光源是真正作用在目標(biāo)物體上的。(Culling mask校驗通過的光源light.distanceAttenuation不為0)
|
2.Frame Debugger顯示異常
2020.3.36f1c1版本中,打開FrameDebugger。場景并不會隨著渲染階段而變化
找到相關(guān)文章,該問題是Unity的Bug,在關(guān)閉urp的msaa選項之后,F(xiàn)rameDebugger就可以正常顯示
3.報錯 Shader properties can't be added to this global property sheet. Trying to add _GrabTexture_TexelSize (type 1 count 1)
UnityEngine.GUIUtility:ProcessEvent (int,intptr,bool&)文章來源:http://www.zghlxwxcb.cn/news/detail-578219.html
Shader properties can't be added to this global property sheet. Trying to add _GrabTexture_HDR (type 1 count 1)
UnityEngine.GUIUtility:ProcessEvent (int,intptr,bool&)
這個是因為URP不支持GrabPass導(dǎo)致,處理方法是將Shader中無用的GrabPass刪除,如果需要用到屏幕截圖,修改成HLSL語言,然后利用SAMPLER(_CameraOpaqueTexture);來代替grabTexture文章來源地址http://www.zghlxwxcb.cn/news/detail-578219.html
到了這里,關(guān)于Unity內(nèi)置渲染管線升級URP教程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!