Version: 6000.3
语言: 中文
使着色器行为以关键字为条件
在脚本中切换着色器关键字

在编辑器中切换着色器关键字

切换着色器在 GPU 上运行的程序。更多信息
请参阅术语表
关键字,为关键字添加材质属性。这允许您为不同的材质设置不同的关键字状态,而无需使用代码。

按着这些次序:

  1. _ON到您声明的关键字的末尾。例如,更改_RED_RED_ON.确保更新分支代码以使用新名称。

  2. 确保你或 Unity 声明关键字关闭时的状态。有关更多信息,请参阅禁用集合中所有关键字时的分支

    例如,如果使用shader_feature为了仅声明一个关键字,Unity 会自动创建“off”状态。

  3. 添加具有属性的整数材质属性[Toggle],关键字的名称没有_ON.例如:

        Properties
        {
            [Toggle] _RED ("Make red", Integer) = 0
        }
    

现在,当您创建使用着色器的材质时,材质的“检查器”窗口会有一个复选框,用于启用或禁用关键字。

要默认禁用该属性,请使用[ToggleOff]而不是[Toggle].

切换关键字集

要切换集合中的关键字,使其互斥,请添加属性为KeywordEnum.Unity 会创建一个包含所有关键字的下拉列表。当您在集合中启用一个关键字时,Unity 会禁用其他关键字。

按着这些次序:

  1. 声明以SETNAME_KEYWORDNAME.例如:

    #pragma shader_feature _COLOR_RED _COLOR_GREEN _COLOR_BLUE
    
  2. 添加具有属性的材质属性[KeywordEnum]以及关键字集的名称。传入关键字的名称。例如:

    Properties
    {
        [KeywordEnum(RED, GREEN, BLUE)] _COLOR ("Color", Integer) = 0
    }
    

有关更多信息和示例,请参阅 MaterialPropertyDrawer API。

以下示例添加了一个名为_RED,用于启用和禁用关键字_RED_ON.

Shader "Unlit/ToggleRed"
{
    Properties
    {
        [Toggle] _RED ("Make red", Integer) = 0
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }

        Pass
        {
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            // Add the keyword RED_ON, for when the toggle is on
            // Unity automatically adds a keyword for when the toggle is off 
            #pragma shader_feature _RED_ON

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                // Return red if the toggle is on
                #if _RED_ON
                    return fixed4(1, 0, 0, 1);
                #else
                    return fixed4(0, 0, 0, 1);
                #endif
            }
            ENDHLSL
        }
    }
}

其他资源

使着色器行为以关键字为条件
在脚本中切换着色器关键字