Переключить ключевые слова шейдера в редакторе
Чтобы переключить ключевые слова в редакторе, добавьте свойство материала для ключевого слова. Это позволит вам установить различные состояния ключевых слов для различных материалов без использования кода.
Выполните следующие действия:
Добавьте
_ONв конце ключевого слова, которое вы объявляете. Например, измените_REDна_RED_ON. Убедитесь, что вы обновили свой код ветвления, чтобы использовать новое имя.-
Убедитесь, что вы или Unity объявляете состояние, когда ключевое слово выключено. Подробнее см. Ветвь, когда все ключевые слова в наборе отключены.
Например, если вы используете
shader_featureчтобы объявить только одно ключевое слово, Unity автоматически создаёт состояние 'off'. -
Добавить целое число свойство материала с атрибутом
[Toggle]и имя ключевого слова без_ON. Например:Properties { [Toggle] _RED ("Make red", Integer) = 0 }
Теперь, когда вы создаете материал, использующий шейдер, окно Inspector материала имеет флажок, который включает или отключает ключевое слово.
Чтобы отключить свойство по умолчанию, используйте [ToggleOff] вместо [Toggle].
Переключить наборы ключевых слов
Чтобы переключить ключевые слова в наборе так, чтобы они были взаимоисключающими, добавьте свойство с атрибутом KeywordEnum. Unity создает раскрывающийся список со всеми ключевыми словами. Когда вы включаете одно ключевое слово в наборе, Unity отключает другие.
Выполните следующие действия:
-
Объявите ключевое слово в формате
SETNAME_KEYWORDNAME. Например:#pragma shader_feature _COLOR_RED _COLOR_GREEN _COLOR_BLUE -
Добавьте свойство материала с атрибутом
[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
}
}
}