Version: Unity 6 (6000.0)
Language : English
Choose which type of keyword to use in shaders
Make shader behavior conditional on keywords

Declare shader keywords

To declare shaderA program that runs on the GPU. More info
See in Glossary
keywords, use a #pragma directive in the HLSL code. For example:

#pragma shader_feature REFLECTION_TYPE1 REFLECTION_TYPE2 REFLECTION_TYPE3

Use one of the following shader directives:

Shader directive Branching type Shader variants Unity creates
shader_feature Static branching Variants for keyword combinations you enable at build time with material properties
multi_compile Static branching Variants for every possible combination of keywords
dynamic_branch Dynamic branching No additional variants

Refer to the following:

In Shader Graph, see Shader Graph: Keyword Node instead.

Declare sets of keywords

The keywords in a single #pragma statement are together called a ‘set’.

For example, to declare a set of three keywords:

#pragma shader_feature REFLECTION_TYPE1 REFLECTION_TYPE2 REFLECTION_TYPE3

You can declare multiple sets of keywords in a single shader. For example, to create 2 sets:

#pragma shader_feature REFLECTION_TYPE1 REFLECTION_TYPE2 REFLECTION_TYPE3
#pragma shader_feature RED GREEN BLUE WHITE

You can’t do the following:

  • You cannot include two keywords with the same name in one set.
  • You cannot include duplicate keyword sets in one shader.
  • You cannot declare a keyword as both dynamic_branch and shader_feature or multi_compile - Unity uses dynamic_branch if you do this.

Make keywords local

Keywords are affected by global keyword state by default.

Add _local to the shader directive to make the keywords local. If you enable or disable a global keyword, you don’t affect the state of local keywords with the same name.

For example:

#pragma shader_feature_local REFLECTION_TYPE1 REFLECTION_TYPE2 REFLECTION_TYPE3

Additional resources

Choose which type of keyword to use in shaders
Make shader behavior conditional on keywords