Sometimes, you want the same shader to do different things under different circumstances. For example, you might want to configure different settings for different materials, define functionality for different hardware, or dynamically change the behavior of shaders at runtime. You might also want to avoid executing computationally expensive code when it’s not needed, such as texture reads, vertex inputs, interpolators, or loops.
You can use conditionals to define behavior that the GPU only executes under certain conditions.
To use conditionals in your shader, you can use the following approaches:
There is no “one size fits all” approach to conditionals in shaders, and you should consider the advantages and disadvantages of each approach for a given shader, in a given project.
Which conditional to use depends on when you need the shader to switch to a different code branch:
If you don’t need a shader to switch to a different code branch at runtime, you can use conditionals that Unity only evaluates while you’re editing.
For example you can set up a property in a Material’s Inspector window to make a shader do the following:
If you use this approach, shader code is simpler to write and maintain, and less likely to affect build time, file size and performance.
To do this, use one of the following:
shader_feature
to declare keywords and evaluate them in if
statements.If you use the shader_feature
keyword definition, Unity keeps shader variants used by Materials in your build, and removes (‘strips’) other shader variants. This keeps build times low and file sizes small.
Avoid using a C# script to enable or disable shader_feature
keywords at runtime, because if a Material uses a shader variant that’s missing, Unity chooses a different available variant instead. If you do need to enable or disable keywords at runtime, use one of the following approaches to make sure your build includes all the variants you need:
shader_feature
keywords you want to use.If you need to use C# scripting to make the shader switch to a different code branch at runtime, you can use conditionals that Unity evaluates both while you’re editing and at runtime.
For example you can use a C# script to make a shader do the following:
To do this, use one of the following:
multi_compile
to declare keywords and evaluate them in if
statements.If you use the multi_compile
keyword definition, Unity builds a shader variant for every possible combination of shader code branches, including combinations that aren’t used by Materials in your build. This means you can enable and disable keywords at runtime, but it might also greatly increase build time, file size, load times and memory usage. See shader variants.
Dynamic branching doesn’t create shader variants, but may mean your shaders run more slowly on the GPU, especially if any of the following are true:
You can check how many shader variants you have to see whether you can use dynamic branching without affecting GPU performance too much. See shader branching for more on the advantages and disadvantages of dynamic branching.
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.