URP全称为Universal Render Pipeline(通用渲染管线),可以提供更加灵活的渲染方案,通过添加Render Feature实现各种渲染效果。并且可以针对移动平台进行专门的优化,同时还提供了SRPBatcher提高渲染效率。Unity的一些工具,比如ShaderGraph,也是必须在URP管线下才可以使用,可以说许多方面均优于内置渲染管线。
所以如果还在使用内置渲染管线的,建议尽早升级到URP。通过本文,可以了解到如何从内置管线升级到URP。并且记录了一些升级时可能遇到的问题和解决方法。
1.安装对应package
2.创建配置
Create->rendering->Universal pipeline->Pipeline Asset(Forward Renderer)生成两个配置文件(目前放在Pipeline文件夹下)
Edit->Project Settings->Graphics 界面,将UniversalRenderPipelineAsset拖入
3.统一升级自带的shader
Edit->Render Pipeline->Universal Render Pipeline-> Upgrade Project Materials to Universal PR Materials
可以将使用默认built-inShader升级到URP的Shader
在未使用URP管线的时候,由于一些shader是使用CG语言写的,而URP并不支持该语言。所以需要将其改为HLSL(High level shader language)编写。
1、cginc文件的内置函数可以在Editor引擎安装目录下查看 xxx\Editor\2020.1.0f1c1\Editor\Data\CGIncludes
2、hlsl文件则是在工程对应的Library文件下可以找到:
以Core.hlsl为例子,头文件路径为
Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl
实际在工程中的位置是
xxx\ProjectName\Library\PackageCache\[email protected]\ShaderLibrary\Core.hlsl
C# |
C# |
C# |
C# |
升级Urp
https://www.jianshu.com/p/3fef69e2efb6
https://zhuanlan.zhihu.com/p/147228689
1.多相机修改
URP管线相机不再支持相机的depth属性。主摄像机RenderType设置为base。其他的摄像机的RenderType 都是Overlay类型。
并且需要将其他相机加入到主相机的Stack中
SRP Batcher 是一个渲染循环,可通过许多使用同一着色器变体的材质来加快场景中的 CPU 渲染速度。虽然不会减少DC的次数,但是SRPBatcher可以降低准备DC数据的耗时。相关的官方文档https://docs.unity3d.com/cn/2020.2/Manual/SRPBatcher.html
同一个Shader不能同时启用SRP Batcher或者Gpu Instance。并且SRP Batcher的优先级是最高的。会导致原先可以合批的DC被打断。
需要在URP设置中的Advaneced->SRP Batcher打开
需要用CBUFFER_START(UnityPerMaterial)和CBUFFER_END,将所有Properties内声明的变量包住。例子如下:
C# |
需要注意的是,像Properties内的纹理变量,虽然声明的时候只有一个变量,但是相关的SAMPLER变量也要包在CBUFFER内。
修改后如果支持SRPBatcher,在对应shader的Inspector界面的SRPBatcher属性会显示为compatible
如果是不支持SRPBatcher的Shader对应Shader的SRPBatcher属性会显示为not compatible,并且会显示不支持的原因
1.添加SRPBatcherProfiler.cs文件添加到工程中,代码库地址是https://github.com/Unity-Technologies/SRPBatcherBenchmark
2.将SRPBatcherProfiler脚本拖到需要进行检测的场景中,点击F8显示/隐藏SRPBatcherProfiler界面,点击F9打开/关闭(实际发现F9功能不好使,无法中途打开关闭)SRPBatcher功能。可以对比打开该功能前后的CPU消耗情况。
升级URP后发现物体的光照表现不太一样。经过测试发现,在内置管线时,light的Culling mask是有效的,而在URP下,Culling mask失效了。多光源的情况下,HLSL和GC两个Shader通过GetMainLight获取的光线都是不同的。
处理方式是获取所有的AddtionalLight,然后根据light的distanceAttenuation值去判断,哪个光源是真正作用在目标物体上的。(Culling mask校验通过的光源light.distanceAttenuation不为0)
C# |
2020.3.36f1c1版本中,打开FrameDebugger。场景并不会随着渲染阶段而变化
找到相关文章,该问题是Unity的Bug,在关闭urp的msaa选项之后,FrameDebugger就可以正常显示
UnityEngine.GUIUtility:ProcessEvent (int,intptr,bool&)
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导致,处理方法是将Shader中无用的GrabPass删除,如果需要用到屏幕截图,修改成HLSL语言,然后利用SAMPLER(_CameraOpaqueTexture);来代替grabTexture