Version: 6000.3
语言: 中文
在自定义着色器中添加子着色器
使用 UsePass 命令包含着色器通道

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

A Pass 是着色器在 GPU 上运行的程序。更多信息
请参阅术语表
对象。它包含用于设置 GPU 状态的说明,以及在 GPU 上运行的着色器程序。

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

注意:在基于 Scriptable 的渲染管线中渲染管线(Render Pipeline) 获取场景内容并将其显示在屏幕上的一系列作。Unity 允许您从预构建的渲染管道中进行选择,或编写自己的渲染管道。更多信息
请参阅术语表
,你可以使用 RenderStateBlock 来更改 GPU 上的渲染状态,而无需单独的 Pass。

定义常规传入ShaderLabUnity 用于定义 Shader 对象结构的语言。更多信息
请参阅术语表
,则放置一个PassSubShader块。

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

命名着色器通道

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

要在 ShaderLab 中为 Pass 分配名称,请将NamePass块。

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

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

将 Pass 名称与 C# 脚本一起使用

从 C# 访问通行证的名称脚本一段代码,允许您创建自己的组件、触发游戏事件、随时间修改组件属性以及以您喜欢的任何方式响应用户输入。更多信息
请参阅术语表
,您可以使用 Material.FindPassMaterial.GetPassNameShaderData.Pass.Name 等 API。

注意:Material.GetShaderPassEnabledMaterial.SetShaderPassEnabled 不按名称引用通道;相反,它们使用 LightMode 标签的值引用通道。

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

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

              // ShaderLab commands go here.

              // HLSL code goes here.
        }
    }
}

其他资源

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