Unity3D:ShaderLab-为通道指定名称

推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生

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.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);
    }
}


3D建模学习工作室整理翻译,转载请注明出处!

上一篇:Unity3D:ShaderLab-定义一个通道 (mvrlink.com)

下一篇:Unity3D:ShaderLab-为通道分配标签 (mvrlink.com)

NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号