Unity3D:ShaderLab-添加着色器程序

推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生

ShaderLab:添加着色器程序

在 Unity 中,您通常使用 HLSL 编写着色器程序。要将 HLSL 代码添加到您的着色器资源,应将该代码放在一个着色器代码块 中。

本页面包含有关使用着色器代码块的信息。有关编写 HLSL 本身的信息,请参阅在 Unity 中使用 HLSL。

注意:Unity 还支持使用其他语言编写着色器程序,不过通常不需要或不推荐这样做。有关更多信息,请参阅编写着色器。

渲染管线兼容性

功能内置渲染管线通用渲染管线 (URP)高清渲染管线 (HDRP)自定义可编程渲染管线
HLSLPROGRAM
HLSLINCLUDE
CGPROGRAM

与使用 SRP Core 包的自定义渲染管线不兼容。
CGINCLUDE

与使用 SRP Core 包的自定义渲染管线不兼容。

着色器代码块的类型

要添加 HLSL 代码,您可以使用以下类型的着色器代码块:

  • HLSLPROGRAM
  • CGPROGRAM
  • HLSLINCLUDE
  • CGINCLUDE

要了解何时使用哪个,您必须了解它们的前缀(HLSLCG)及后缀(PROGRAMINCLUDE)。

HLSL 和 CG 前缀

HLSLCG 为前缀的块之间的区别是:

  • 前缀为前缀的着色器代码块较旧。默认情况下,它们包括几个 Unity 的内置着色器包含文件,如果您需要此功能,这会很方便。内置包含仅与内置渲染管线兼容。CG
  • 以 为前缀的着色器代码块较新。 默认情况下,它们不包含 Unity 的内置着色器 include 文件,因此您必须手动包含要使用的任何库代码。 它们适用于任何渲染管线。HLSL

有关 Unity 内置着色器包含文件的信息,请参阅内置着色器包含文件。

PROGRAM 和 INCLUDE 后缀

PROGRAMINCLUDE 为后缀的块之间的区别是:

  • PROGRAM 为后缀的着色器代码块被称为着色器程序块。您可以使用它们来编写着色器程序。您在这些块中编写 HLSL 着色器代码,然后将它们放在 ShaderLab 代码中的 Pass 块中。
  • INCLUDE 为后缀的着色器代码块被称为着色器 include 块。您可以使用它们在同一源文件中的着色器程序块之间共享公共代码。您编写要在这些块中共享的 HLSL 着色器代码,然后将它们放置在您的 ShaderLab 代码中的 Pass、SubShader 或 Shader 块中。它的工作方式与在 HLSL 代码中使用 include 的方式类似。

使用着色器程序块

签名功能
HLSLPROGRAM
    [着色器程序的 HLSL 源代码]
ENDHLSL
将 HLSL 着色器程序添加到包含此着色器程序块的 Pass。不包含 Unity 的内置着色器 include 文件。
CGPROGRAM
    [着色器程序的 HLSL 源代码]
ENDCG
Adds the HLSL shader program to the Pass that includes this shader program block. Includes several of Unity’s built-in shader include files by default, enabling you to use built-in variables and functions.

示例

Shader "Examples/ExampleShader"
{
    SubShader
    {
        Pass
        {                
              Name "ExamplePassName"
              Tags { "LightMode" = "ExampleLightModeTagValue" }

              // 在此编写设置渲染状态的 ShaderLab 命令

              HLSLPROGRAM
                // 在此编写 HLSL 着色器代码
              ENDHLSL
        }
    }
}

使用着色器 include 块

签名功能
HLSLINCLUDE
    [您要共享的 HLSL 代码]
ENDHLSL
Unity 将此代码包含在 HLSLPROGRAM 块中定义的所有着色器程序中,可位于此源文件的任何位置。
CGINCLUDE
    [您要共享的 HLSL 代码]
ENDCG
Unity 将此代码包含在 CGPROGRAM 块中定义的所有着色器程序中,可位于此源文件的任何位置。

示例

Shader "Examples/ExampleShader"
{
    SubShader
    {

        HLSLINCLUDE
            // 在此编写要共享的 HLSL 代码
        ENDHLSL

        Pass
        {                
              Name "ExampleFirstPassName"
              Tags { "LightMode" = "ExampleLightModeTagValue" }

              // 在此编写设置渲染状态的 ShaderLab 命令

              HLSLPROGRAM
                // 此 HLSL 着色器程序自动包含上面的 HLSLINCLUDE 块的内容
                // 在此编写 HLSL 着色器代码
              ENDHLSL
        }

        Pass
        {                
              Name "ExampleSecondPassName"
              Tags { "LightMode" = "ExampleLightModeTagValue" }

              // 在此编写设置渲染状态的 ShaderLab 命令

              HLSLPROGRAM
                // 此 HLSL 着色器程序自动包含上面的 HLSLINCLUDE 块的内容
                // 在此编写 HLSL 着色器代码
              ENDHLSL
        }

    }
}

3D建模学习工作室整理翻译,转载请注明出处!

上一篇:Unity3D:ShaderLab-内置渲染管线中的预定义通道标签 (mvrlink.com)

下一篇:Unity3D:ShaderLab-指定包要求 (mvrlink.com)

NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号