Version: Unity 6.0 (6000.0)
语言 : 中文
为自定义着色器添加子着色器
使用 UsePass 命令包含着色器通道

为自定义着色器添加着色器通道

通道是 Shader 对象的基本元素。它包含设置 GPU 状态的指令,以及在 GPU 上运行的着色器程序。

简单的 Shader 对象可能只包含一个通道,但更复杂的着色器可以包含多个通道。可以为 Shader 对象不同部分定义单独的通道来实现不同的工作方式;例如,需要更改渲染状态、不同的着色器程序或不同的 LightMode 通道标签的部分。

注意:在基于可编程渲染管线的渲染管线中,可以使用 RenderStateBlock 来更改 GPU 上的渲染状态,而无需单独的通道。

要在__ ShaderLab__Unity 用于定义着色器对象结构的语言。更多信息
See in Glossary
中定义一个常规的通道,您需要在一个 SubShader 代码块中放置一个 Pass 代码块。

您还可以使用 UsePassGrabPass 命令定义两种特殊类型的通道。有关这些命令的信息,请参阅 ShaderLab 命令:UsePass 或者 ShaderLab 命令:GrabPass

为着色器通道命名

通道可以具有名称。您需要在 UsePass 命令及某些 C# API 中按名称引用一个通道。通道的名称在帧调试器 (Frame Debugger) 工具中可见。

要在 ShaderLab 中为通道指定名称,您可以在 Pass 代码块内放置一个 Name 代码块。

Unity 会在内部将名称转换为大写。在 ShaderLab 代码中引用名称时,必须使用大写变体;例如,如果值是 “example”,您必须使用 EXAMPLE 进行引用。

如果同一个子着色器中有多个通道具有相同的名称,则 Unity 使用代码中的第一个通道。

通过 C# 脚本使用通道名称

从 C# 脚本访问通道的名称,您可以使用 API,例如 Material.FindPassMaterial.GetPassNameShaderData.Pass.Name

注意:Material.GetShaderPassEnabledMaterial.SetShaderPassEnabled 不按名称引用通道;而是使用 LightMode 标签的值引用通道。

示例

此示例代码演示了用于创建包含单个子着色器的 Shader 对象的语法,而子着色器又包含一个通道。

Shader "Examples/SinglePass"
{
    SubShader
    {
        Pass
        {                
              Name "ExamplePassName"
              Tags { "ExampleTagKey" = "ExampleTagValue" }

              // ShaderLab commands go here.

              // HLSL code goes here.
        }
    }
}

其他资源

为自定义着色器添加子着色器
使用 UsePass 命令包含着色器通道