版本: Unity 6 (6000.0)
语言 : 英语
在自定义着色器中添加子着色器
使用 UsePass 命令包含着色器通道

在自定义着色器中添加着色器通道

通道是 着色器在 GPU 上运行的程序。 更多信息
参见 词汇表
对象的基本元素。它包含设置 GPU 状态的指令,以及在 GPU 上运行的着色器程序。

简单的着色器对象可能只包含单个通道,但更复杂的着色器可以包含多个通道。您可以使用不同的通道来定义工作方式不同的 着色器对象着色器类的实例,着色器对象是着色器程序和 GPU 指令的容器,以及告知 Unity 如何使用它们的 信息。将它们与材质一起使用以确定场景的外观。 更多信息
参见 词汇表
部分;例如,需要更改渲染状态、不同的着色器程序或不同的 LightMode 通道标签的部分。

注意:在基于可脚本化 渲染管线一系列操作,将场景内容显示在屏幕上。Unity 允许您选择预构建的渲染管线,或编写自己的渲染管线。 更多信息
参见 词汇表
的渲染管线中,您可以使用 RenderStateBlock 来更改 GPU 上的渲染状态,而无需使用单独的通道。

要在 ShaderLabUnity 用于定义着色器对象结构的语言。 更多信息
参见 词汇表
中定义常规通道,您需要将 Pass 块放在 SubShader 块中。

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

命名着色器通道

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

要为 ShaderLab 中的通道指定名称,您需要将 Name 块放在 Pass 块中。

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

如果同一个 SubShader 中的多个通道具有相同的名称,Unity 将使用代码中的第一个通道。

使用 C# 脚本的通道名称

要从 C# 脚本一段代码,允许您创建自己的组件、触发游戏事件、随着时间的推移修改组件属性并以任何您喜欢的方式响应用户输入。 更多信息
参见 词汇表
中访问通道名称,可以使用 API,例如 Material.FindPassMaterial.GetPassNameShaderData.Pass.Name

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

示例

此示例代码演示了创建包含单个 SubShader 的着色器对象的语法,该 SubShader 又包含单个通道。

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

              // ShaderLab commands go here.

              // HLSL code goes here.
        }
    }
}

其他资源

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