随着Unity支持的平台数量不断增加,内置渲染管线的局限也日益明显。由此,Unity发布两款新的可编程渲染管线(SRP):HDRP和URP,为用户提供高灵活度和丰富的自定义空间,增强性能、加速迭代以释放创意潜能。目前,图形团队正努力还原用户所熟悉的所有功能,并在此基础上加上更好的性能、更广的定制空间和更多的工作流程。
URP是Unity预先打造好的可编程渲染管线(SRP)应用。它的工作流程十分便于美术创作,还可在大部分平台上呈现高度优化的图形。通过使用Shader Graph和VFX Graph等工具,没有编程经验的创作者也可以在URP上编写着色器和GPU渲染效果。
URP能帮助创作者实现性能与质量的平衡,管线的特色功能能将具备高质量图像的游戏和应用部署到多种移动设备上。如果想把项目从内置渲染管线移植到URP,用户首先需要手动改写着色器。
本文由Arm公司的Roberto Lopez Mendez联合撰写,讨论了基于内置渲染管线打造的Arm项目向URP的移植,涵盖了内置着色器到URP的自动转换、自定义着色器转换、LightMode标签的使用以及好处、如何用自定义着色器实现基于本地Cubemap的动态软阴影。
移植着色器到URP:基础篇
首先,将URP包添加到用户的项目中。选择Window>Package Manager来打开Package Manager,从列表中安装Universal RP。要想升级着色器,找到Edit>Render Pipeline>Universal Render Pipeline>Upgrade Project Materials to URPipeline Materials选项。这一步能将Unity内置着色器自动转换成一套URP着色器,几乎所有的旧版着色器都会转换成Universal Render Pipeline/Simple Lit着色器。
旧版着色器与URP着色器源码比较
要想了解转换过程“底层”流程,一个快速的方法是查看旧版与URP着色器的源码。请先从Unity下载库中下载内置着色器。选择Windows或Mac平台,再选择Built-in shaders。解开文件可以看到280多个着色器被分组在不同的文件夹里。
以Mobile-Diffuse着色器为例,该着色器将被转换为URP/Simple Lit着色器。很多URP着色器都来自URP GitHub仓库的Shader文件夹,以及Unity工程师Felipe Lira放在GitHub上的UniversalShaderExamples。
对于这个项目,Arm的开发者们决定使用URP Template中的示例场景。他们将“Drywall panel”游戏对象的着色器从URP/Lit改成了URP/Simple Lit,然后在Edit选项里打开了源码。
在比较URP SimpleLit.shader和Mobile-Diffuse.shader时,首先要注意到SubShader标签上的”RenderPipeline”=”UniversalPipeline”键值对:
SubShader的标签”RenderPipeline”将告诉Unity哪些渲染管线使用这个SubShader。值是”UniversalPipeline”表示Unity应在URP上使用这个SubShader。
在Render Pass(渲染通道)的代码里,你可以看到着色器的代码是使用HLSLPROGRAM/ENDHLSL宏来分隔的:
这些宏表明,原本的CG着色器编程语言(C for Graphics)已经被High-Level Shading Language(高级着色语言,HLSL)取代,尽管着色器的语法和功能基本相同。Unity的着色器文件使用ShaderLab语法来定义着色器属性、SubShader和Pass。对于URP来说,这些Pass里面的着色器代码是用HLSL写的。
大部分ShaderLab内容与内置渲染管线相比并无不同,但由于两个管线内部的光照生成流程有所不同,为内置渲染管线编写的ShaderLab着色器将自动被URP禁用。这表示URP着色器对光照的处理不同于内置渲染管线。
内置渲染管线会对每一束照射到物体上的光单独进行着色,而URP则在一个Pass里将所有光照和着色任务排列成组完成。这种差异使得URP会以不同的结构存储光照数据,并使用全新标准的着色库。
在渲染时,Unity会调取第一段受GPU支持的SubShader代码块。如果这段SubShader代码不包含”RenderPipeline”=”UniversalPipeline”标签,则着色器就不会运行于URP中。而Unity将继续运行下一个SubShader(如果有的话)。如果所有SubShader均不受GPU支持,则Unity会用大家熟悉的洋红色进行着色并标示错误。
一个SubShader可以包含多个Pass渲染通道,且每个通道都必须标记上一个具体的光照模式(LightMode)。由于URP使用的是单通道前向渲染器(Forward Renderer),管线只会将GPU支持的第一个”UniversalForward”通道用于渲染。
着色器升级程序能自动将内置着色器升级为URP着色器,帮用户解决了繁杂的部分。那么自定义着色器又要怎样升级呢?
自定义着色器
用户需要采取额外的步骤才能将自定义着色器升级为URP着色器。第一步是用HLSL替代.cginc include文件。
其他实用HLSL include
内置着色器函数是着色器编程的基础。它们不仅能节省用户的时间,还能优化常见的运算。以这个include文件为例。它所包含的功能函数主要有平台特定功能、常见数学函数、纹理实用程序、纹理格式采样、深度编码/解码、空间变形、地形/笔刷高度图编码/解码以及其他实用程序。
移植着色器到URP:高级步骤
LightMode标签
LightMode标签定义了Pass在光照管线上的作用。在内置渲染管线中,大多数与光照互动的着色器都会被写成十分详细的Surface Shader(表面着色器)。不过,自定义的内置着色器需要用LightMode标签来指明Pass在光照管线上的处理方法。
下表标出了内置渲染管线每个LightMode标签对应的URP标签。部分旧版内置渲染管线的标签不受URP支持:
·MovtionVectors
·PrepassBase
·PrepassFinal
·Vertex
·VertexLMRGBM
·VertexLM
同时,有些URP中的标签也没有对应的内置渲染管线标签。
关于内置渲染管线了解更多:
https://docs.unity3d.com/Manual/SL-PassTags.html
关于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项目原本是为内置渲染管线编写的。如下图所示,项目使用了简单的Custom/ctShadowMap着色器来替代棋子的原着色器进行渲染。
阴影摄像机被放在光照的位置,并借助着色器将棋子的外形渲染成一张纹理。这张纹理再被投射到棋盘上,产生棋子的影子。
不过,URP有一个替代方案。下方流程大致展示了棋子阴影的生成方法(详细信息请见Unity资源商店上的项目Readme文件):
1.在项目窗口中右击新建一个URP Renderer Asset。选择Create>Rendering>Universal Render Pipeline>Forward Renderer,将其命名为如Camera Replacement Renderer。
2.点击Camera Replacement Renderer Asset来编辑其属性。
3.将Filtering过滤方式下的Opaque Layer Mask和Transparent Layer Mask改为Nothing,禁用正常的摄像机渲染(否则,所有对象都会被渲染两次)。
4.点击Add Renderer Feature,选择Render Objects(Experimental)。
5.点击并重命名新创建的New Render Objects(Render Objects)。用户将看到以下几个选项:
·将Filters>Layer Mask设置为想要渲染的图层。
·将Overrides>Material设置为使用替换着色器的材质。
6.选择Assets/Settings/UniversalRP-HighQuality.asset,点击+来添加一个新的渲染器,并拖入创建的Camera Replacement Renderer资产。
选择使用替换着色器的摄像机,将Renderer设置为配置好的新URP Renderer Asset:
后处理
后处理效果的种类取决于使用中的渲染管线。内置渲染管线的后处理与URP的后处理并不兼容。两者间的不同大致如下:
内置
默认不包含后处理方案;要想使用后处理效果,用户需要使用Package Manager下载Post-Processing Version 2包,也称为Post-Processing Stack V2(PPv2)。
URP
包括了自己的后处理方案,Unity会在创建URP模板项目时自动安装该方案;详见URP后处理文档。
要想利用后处理效果,请使用集成的体积系统,也叫做Post-Processing V3/PPv3。该系统包括了柔光、色差、景深、色彩调整、色调映射和晕影等效果。
Unity 2019.3的URP加入了一个集成的后处理堆栈,使管线有了若干的性能改进。更新后的堆栈还能支持摄像机运动模糊和体积框架等新效果。
然而,PPv3不支持自定义的后处理效果,所以2019.4 LTS仍支持PPv2以作为备选方案。若想在2019.4 LTS中使用自定义效果,请将后处理的Feature Set从集成方案设置为Post-Processing V2(如已安装)。
后处理在移动端会带来高能耗,这些效果将占用大量的帧时间。URP有几种对移动设备更友好的效果:
·柔光(禁用了High-Quality Filtering)
·色差
·颜色分级
·镜头失真
·晕影
现在就来移植你的着色器吧
SRP的引入是Unity最大的转变之一,因为SRP支持用C#脚本安排和配置渲染指令。URP的主要作用在于高效地创建可扩展、画面流畅的图形——既保证高端设备上的图形质量,又保证低端设备上的图形性能。
在这些资源的助力下,相信着色器的移植工作会更加轻松便捷。
厦门商城系统开发 近年来,随着时尚潮流的不断变化,越南的婚纱潮流也受到了影响。在此期间,由于疫情,大量婚礼被推迟,这促使大量新娘有很多时间精心挑选婚纱,对婚纱的需求也发生了很大变化。 在疫情爆发之前,越南新娘更喜欢传统的婚礼。现在新娘们更喜欢有羽毛、手工刺绣和…
码刀科技(www.lekshop.cn)是国内知名企业级电商平台提供商,为企业级商家提供最佳的电商平台搭建(多种模式电商平台搭建:B2B/B2B2C/B2C/O2O/新零售/跨境等)、平台管理系统开发及互联网采购解决方案服务, 联系客服了解更多.