Version: 2021.1
ShaderLab:定义一个通道
ShaderLab:为通道分配标签。

ShaderLab:为通道指定名称

本页面包含有关在 ShaderLab 代码中使用 Name 代码块为通道指定名称的信息。有关定义通道的信息,请参阅 ShaderLab:定义一个通道。有关 Shader 对象的工作原理以及 Shader 对象、子着色器与通道之间关系的信息,请参阅 Shader 对象基础

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

渲染管线兼容性

功能名称 内置渲染管线 通用渲染管线 (URP) 高清渲染管线 (HDRP) 自定义 SRP
ShaderLab:Name 代码块

使用 Name 代码块

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

签名 功能
Name "<name>" 设置通道的名称。

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

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

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

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

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

示例

此示例代码创建了一个名为 ContainsNamedPass 的 Shader 对象,其中包含名为 ExampleNamedPass 的通道。

Shader "Examples/ContainsNamedPass"
{
    SubShader
    {
        Pass
        {    
              Name "ExampleNamedPass"
            
              // 此处是定义通道的代码的其余部分。
        }
    }
}

然后您可以使用以下 C# 代码查询此通道的名称:

using UnityEngine;

public class GetPassName : MonoBehaviour
{
    // 将此脚本放置在具有 MeshRenderer 组件的游戏对象上
    
    void Start() {
        // 获取材质
        var material = GetComponent<MeshRenderer>().material;

        // 获取为该材质分配的 Shader 对象的
        // 活动子着色器中第一个通道的名称
        var passName = material.GetPassName(0);

        // 将名称打印到控制台
        Debug.Log(passName);
    }
}

ShaderLab:定义一个通道
ShaderLab:为通道分配标签。