当前位置:   article > 正文

[Render] 适用于高级Unity创作者的通用渲染管线[5] - 阴影_renderpipeline" = "universalrenderpipeline

renderpipeline" = "universalrenderpipeline

英文原文: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 和内置渲染管线着色器

  URP 着色器使用 ShaderLab 结构,如下面的代码片段所示。 因此,Property、SubShader、Tags 和 Pass 对于着色器编码人员来说都是熟悉的。

SubShader {
 Tags {"RenderPipeline" = "UniversalPipeline" }
 Pass {
 HLSLPROGRAM
 ...
 ENDHLSL
 }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

  将 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.cgincGithub Link
AutoLight.cgincGithub LinkGIthub Link
其他有用的 HLSL 包括

  空间变换相关的函数都在这个include里面,使用Core.hlsl的时候默认添加。

HLSL 空间变换函数

变量名末尾的空格类型表示法:

  • WS: World Space
  • TS: Tangent Space
  • VS: View Space
  • OS: Object Space

  其他着色器功能,包括雾和UV,可以在这个include中找到,它是在你使用Core.hlsl时默认添加的。 下表列出了几个示例。
在这里插入图片描述
  着色器辅助函数是着色器编码的基础。 它们不仅可以节省您的时间,而且是常用计算的高度优化实现。 这包括包含许多与以下相关的帮助函数:

  • 平台特定功能
  • 常用数学函数
  • 纹理实用工具
  • 纹理格式采样
  • 深度编码/解码
  • 空间变换
  • 地形/画笔高度图编码/解码和其他实用程序

  其中一些列在下表中。 real 类型在文件中设置; 根据各种标志,它可能是half或float。
在这里插入图片描述

预处理器宏

  预处理器宏很方便并且经常使用。 将内置渲染管线着色器移植到新的 URP 着色器时,您需要将内置渲染管线宏替换为其 URP 等效项。

此表显示了一些示例
在这里插入图片描述
表注:

  • 阴影映射宏需要这个阴影包含。
  • _PARAM 是可用于声明带有纹理和采样器参数的函数的宏。 查看此文档以获取更多信息。
  • 对于内置渲染管线纹理/采样器声明,请阅读本文档
LightMode tags

  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
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

注意:对于计划为 URP 编写着色器的用户来说,一个很好的资源是 Cyanilux 的教程

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/98214
推荐阅读
相关标签
  

闽ICP备14008679号