本页面包含有关在 ShaderLab 代码中使用 Name
代码块为通道指定名称的信息。有关定义通道的信息,请参阅 ShaderLab:定义一个通道。有关 Shader 对象的工作原理以及 Shader 对象、子着色器与通道之间关系的信息,请参阅 Shader 对象基础。
通道可以具有名称。您需要在 UsePass
命令及某些 C# API 中按名称引用一个通道。通道的名称在帧调试器工具中可见。
功能名称 | 内置渲染管线 | 通用渲染管线 (URP) | 高清渲染管线 (HDRP) | 自定义 SRP |
---|---|---|---|---|
ShaderLab:Name 代码块 | 是 | 是 | 是 | 是 |
要在 ShaderLab 中为通道指定名称,您可以在 Pass
代码块内放置一个 Name
代码块。
签名 | 功能 |
---|---|
Name "<name>" |
设置通道的名称。 |
在内部,Unity 将名称转换为大写。在 ShaderLab 代码中引用名称时,必须使用大写变体;例如,如果值是 “example”,您必须使用 EXAMPLE 进行引用。
如果同一个子着色器中有多个通道具有相同的名称,则 Unity 使用代码中的第一个通道。
从 C# 脚本访问通道的名称,您可以使用 API,例如 Material.FindPass、Material.GetPassName 或者 ShaderData.Pass.Name。
注意:Material.GetShaderPassEnabled 和 Material.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);
}
}