赞
踩
英文原文:https://resources.unity.com/games/introduction-universal-render-pipeline-for-advanced-unity-creators?ungated=true
本部分适用于想要将现有自定义着色器转换为使用 URP 和/或想要在代码中编写自定义着色器而不使用 Shader Graph 的用户。 它提供了将基本和高级着色器从内置渲染管道移植到 URP 所需的信息。 包含的表格显示了可用的 HLSL 着色器函数、宏等的有用示例。 在每种情况下,都提供了指向相关包含的链接,其中包含许多其他有用的功能。
对于那些已经有编码着色器经验的人,包含的内容让您清楚地了解 HLSL 中可用的内容来编写紧凑且高效的着色器。 在考虑了这里的信息之后,希望将您的着色器移植到 URP 看起来不会那么令人生畏。
另一种方法是使用 Shader Graph 创建自定义着色器的版本。 附加工具部分提供了对 Shader Graph 的介绍。
URP 着色器使用 ShaderLab 结构,如下面的代码片段所示。 因此,Property、SubShader、Tags 和 Pass 对于着色器编码人员来说都是熟悉的。
SubShader {
Tags {"RenderPipeline" = "UniversalPipeline" }
Pass {
HLSLPROGRAM
...
ENDHLSL
}
}
将 URP 着色器与内置渲染管道着色器进行比较时,首先要注意的是在 SubShader 标记中使用键值对“RenderPipeline”=“UniversalPipeline”。
一个名为 RenderPipeline 的 SubShader 标记告诉 Unity 使用该 SubShader 的渲染管线。 UniversalPipeline 的值表示 Unity 应该将此 SubShader 与 URP 一起使用。
查看渲染管线代码,您将看到包含在 HLSLPROGRAM / ENDHLSL 宏之间的着色器代码。 这表明以前的 CG(图形 C)着色器编程语言已被 HLSL(高级着色语言)取代,尽管着色器语法和功能几乎相同。 Unity 很久以前就切换到 HLSL,所以这不足为奇,但现在不推荐使用 CGPROGRAM / ENDCG 宏。 使用这些宏意味着使用 UnityCG.cginc。 以这种方式混合 SRP 和内置渲染管道着色器库可能会导致几个问题.。
对于 URP,这些通道中的着色器代码是用 HLSL 编写的。 尽管与内置渲染管线相比,大部分 ShaderLab 没有改变,但为内置渲染管线编写的着色器会被 URP 自动禁用。
其原因是内部照明过程的变化。 内置渲染管线为到达对象的每个灯光执行单独的着色器通道(多通道),而 URP 前向渲染器在单通道中评估灯光循环中的所有照明。 这种变化导致存储光数据的不同数据结构和具有新约定的新着色库。
Unity 将使用 GPU 支持的第一个 SubShader 块。 如果第一个 SubShader 块没有“RenderPipeline”=“UniversalPipeline”标签,它将不会在 URP 中运行。 相反,Unity 将尝试运行下一个 SubShader(如果有)。 如果不支持任何 SubShader,Unity 将渲染众所周知的洋红色错误着色器。
一个 SubShader 可以包含多个 Pass 块,但每个块都应该使用特定的 LightMode 进行标记。 由于 URP 使用单通道前向渲染器,因此只有 GPU 支持的第一个“UniversalForward”通道将用于在前向渲染中渲染对象。
如前所述,使用 Window > Rendering > Render Pipeline Converter 可将内置渲染管线着色器自动转换为所有材质的 URP 着色器。 但是自定义着色器呢?
升级到 URP 时,自定义着色器需要做一些工作。 下面列出了在升级过程中对旧版着色器执行的操作。
我们制作了这个分步视频教程,介绍如何将自定义无光照内置着色器转换为 URP,包括要遵循的 Unity 项目。
替换 .cginc 包含具有以下 HLSL 等效项的文件:
内置渲染管道 | HLSL |
---|---|
UnityCG.cginc | Github Link |
AutoLight.cginc | Github Link 、GIthub Link |
空间变换相关的函数都在这个include里面,使用Core.hlsl的时候默认添加。
HLSL 空间变换函数
变量名末尾的空格类型表示法:
其他着色器功能,包括雾和UV,可以在这个include中找到,它是在你使用Core.hlsl时默认添加的。 下表列出了几个示例。
着色器辅助函数是着色器编码的基础。 它们不仅可以节省您的时间,而且是常用计算的高度优化实现。 这包括包含许多与以下相关的帮助函数:
其中一些列在下表中。 real 类型在文件中设置; 根据各种标志,它可能是half或float。
预处理器宏很方便并且经常使用。 将内置渲染管线着色器移植到新的 URP 着色器时,您需要将内置渲染管线宏替换为其 URP 等效项。
此表显示了一些示例
表注:
LightMode 标签定义了 Pass 在光照管线中的作用。 在 Builtin Render Pipeline 中,大多数需要与光照交互的着色器都被编写为表面着色器,并处理了所有必要的细节。 但是,Built-in Render Pipeline 中的自定义着色器需要使用 LightMode 标签来指定在光照管道中如何考虑 Pass。
下表显示了内置渲染管线中使用的 LightMode 标签与 URP 期望的标签之间的对应关系。 URP 不支持几个旧的内置渲染管线标签:PrepassBase、PrepassFinal、Vertex、VertexLMRGBM 和 VertexLM。 同时,URP 中还有其他标签在 Built-in Render Pipeline 中没有等价物。
内置渲染管线(在这里阅读更多) | 描述 | URP(在这里阅读更多) |
---|---|---|
Always | 总是渲染; 没有应用照明 | - |
ForwardBase | 用于前向渲染; 应用了环境光、主定向光、顶点/SH 光和光照贴图 | UniversalForward |
ForwardAdd | 用于前向渲染; 应用了附加的每像素灯,每个灯一个通过 | UniversalForward |
Deferred | 用于延迟着色; 渲染 G 缓冲区 | UniversalGBuffer |
ShadowCaster | 将对象深度渲染到阴影贴图或深度纹理中 | ShadowCaster |
MotionVectors | 用于计算每个对象的运动矢量 | MotionVectors |
URP 在正向渲染路径中使用此标记值; Pass 渲染对象几何体并评估所有光的贡献。 | UniversalForwardOnly | |
URP 在 2D 渲染器中使用此标记值; Pass 渲染对象并评估 2D 光贡献。 | Universal2D | |
Pass 仅将来自相机视角的深度信息渲染到深度纹理中。 | DepthOnly | |
此 Pass 仅在 Unity Editor 中烘焙光照贴图时执行; Unity 在构建 Player 时会从着色器中剥离此通道。 | Meta | |
渲染对象时使用该标签值绘制额外的Pass; 它对正向和延迟渲染路径都有效。 当 Pass 没有 LightMode 标记时,URP 使用此标记值作为默认值。 | SRPDefaultUnlit |
在为 URP 编写着色器时,最好查看提供的着色器和它们使用的通道。 以下代码示例显示了光照着色器中的一些代码。 完整的着色器在这里。
UniversalForward 和 ShadowCaster Pass 涉及许多 pragma 和两个包含文件。 检查包含文件中的代码将帮助您创建适合您需要的自定义版本。
// Forward pass. Shades all light in a single pass. GI + emission + Fog Pass { // Lightmode matches the ShaderPassName set in // UniversalRenderPipeline.cs. SRPDefaultUnlit and passes with // no LightMode tag are also rendered by Universal Render Pipeline Name "ForwardLit" Tags{"LightMode" = "UniversalForward"} Blend[_SrcBlend][_DstBlend] ZWrite[_ZWrite] Cull[_Cull] HLSLPROGRAM #pragma exclude_renderers gles gles3 glcore #pragma target 4.5 … #pragma vertex LitPassVertex #pragma fragment LitPassFragment #include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl" #include "Packages/com.unity.render-pipelines.universal/Shaders/LitForwardPass.hlsl" ENDHLSL } Pass { Name "ShadowCaster" Tags{"LightMode" = "ShadowCaster"} ZWrite On ZTest LEqual ColorMask 0 Cull[_Cull] HLSLPROGRAM #pragma exclude_renderers gles gles3 glcore … #pragma vertex ShadowPassVertex #pragma fragment ShadowPassFragment #include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl" #include "Packages/com.unity.render-pipelines.universal/Shaders/ShadowCasterPass.hlsl" ENDHLSL }
注意:对于计划为 URP 编写着色器的用户来说,一个很好的资源是 Cyanilux 的教程。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。