Unity compiles your shaderA program that runs on the GPU. More info
See in Glossary source files into individual shader programs. Each compiled shader program has one or more variants. Variants are versions of the shader program that work with different combinations of shader keywords. At runtime, when Unity renders geometry, it uses the variant that matches the current requirements. For more information on how Unity loads and uses shader variants, see Shader loading.
Shader variants can improve performance, because they result in shader programs that contain only the code that is needed for the current material, at the current time. Common things to optimize in this way are texture reads, vertex inputs, interpolators, or complex code such as loops. Additionally, the shader programs themselves are smaller.
Shader variants can also improve your workflow, because they allow you to use the same shader source file in different ways. For example, you can configure settings for different materials, define functionality for different hardware, and dynamically change the behaviour of shaders at runtime.
However, there are potential downsides. It’s easy to create a very large number of variants, and this can result in the following:
In larger projects, these issues can lead to significant problems with performance and workflow. It is therefore very important to understand how shader variants work, and how to exclude (“strip”) unneeded variants from compilation.
Shaders with a very large number of variants are called “mega shaders” or “uber shaders”. Unity’s Standard Shader is an example of such a shader.
At build time, Unity compiles one set of shader variants for each graphics API for the current build target. The number of variants for each combination of graphics API and build target depends on your shader source files, and your use of shader keywords.
Unity compiles one set of shader variants for each graphics API in the list for the current build target. The shaders differ for each combination of build target and graphics API; for example, Unity compiles different shaders for Metal on iOSApple’s mobile operating system. More info
See in Glossary than for Metal on macOS.
Some shader programs or keywords might only target a given graphics API or a given build target, so the total number of variants for each combination of graphics API and build target can differ; however, the process for compiling these variants is the same.
To view and edit the list of graphics APIs for your current build target, use the Player SettingsSettings that let you set various player-specific options for the final game built by Unity. More info
See in Glossary window, or the PlayerSettings API.
Unity must determine how many shader programs to compile for the current combination of build target and graphics API.
For each shader source file that is included in your build, Unity determines how many unique shader programs it defines:
package_name@package_version
) that a project or another package requires in order to work. Projects and packages use the dependencies attribute in their manifests to define the set of packages they require. For projects, these are considered direct dependencies; for packages, these are indirect, or transitive, dependencies. More info
Note: A shader source file is included in a build if it is referenced in a sceneA Scene contains the environments and menus of your game. Think of each unique Scene file as a unique level. In each Scene, you place your environments, obstacles, and decorations, essentially designing and building your game in pieces. More info
See in Glossary in that build, referenced by something in the Resources folder, or included in the Always-included shaders section of the Graphics Settings window.
When Unity has determined how many shader programs it must compile for the current build target and graphics API, it then determines how many shader variants it must compile for each shader program.
For each shader program, Unity determines the combination of shader keywords that affect it. This comprises:
The number of shader variants that Unity compiles for a shader program is the product of the keyword sets; that is to say, Unity compiles one variant for every combination that includes one element from each set.
For example, this set contains three keywords:
This set contains four keywords:
A shader program affected by those keywords will result in the following twelve variants:
The number of variants that Unity compiles can grow very rapidly as you add more sets of keywords. For example, consider a fairly typical use case, where a shader has a number of sets of keywords that contain two keywords each (<feature name>_ON
and <feature name>_OFF
). If the shader has two such sets of keywords, this results in four variants. If the shader has ten such sets of keywords, this results in 1024 variants.
After compilation, Unity automatically identifies identical variants within the same Pass, and ensures that these identical variants point to the same bytecode. This is called deduplication.
Deduplication prevents identical variants in the same Pass from increasing file size; however, identical variants still result in wasted work during compilation, and increased memory usage and shader loading times at runtime. With this in mind, it is always best to strip unneeded variants.
You can prevent shader variants from being compiled. This is called stripping. Stripping unneeded variants can greatly reduce build times, file size, shader loading times, and runtime memory usage. In larger projects, or projects with complex shaders, this is a very important consideration.
The way that you declare shader keywords can limit the number of variants that they produce:
shader_feature
instead of multi_compile
where possible.multi_compile
.For information on doing this in hand-coded shaders, see Declaring and using shader keywords in HLSL. For information on doing this in Shader Graph, see Shader Graph: Blackboard.
There are several places in the Unity Editor UI(User Interface) Allows a user to interact with your application. Unity currently supports three UI systems. More info
See in Glossary where you can configure shader stripping:
For shader variants that you can’t strip in other ways, you can use the following APIs in an Editor script to perform build-time stripping:
For more information on this subject, see the Unity blog post Stripping scriptable shader variants
When you visit any website, it may store or retrieve information on your browser, mostly in the form of cookies. This information might be about you, your preferences or your device and is mostly used to make the site work as you expect it to. The information does not usually directly identify you, but it can give you a more personalized web experience. Because we respect your right to privacy, you can choose not to allow some types of cookies. Click on the different category headings to find out more and change our default settings. However, blocking some types of cookies may impact your experience of the site and the services we are able to offer.
More information
These cookies enable the website to provide enhanced functionality and personalisation. They may be set by us or by third party providers whose services we have added to our pages. If you do not allow these cookies then some or all of these services may not function properly.
These cookies allow us to count visits and traffic sources so we can measure and improve the performance of our site. They help us to know which pages are the most and least popular and see how visitors move around the site. All information these cookies collect is aggregated and therefore anonymous. If you do not allow these cookies we will not know when you have visited our site, and will not be able to monitor its performance.
These cookies may be set through our site by our advertising partners. They may be used by those companies to build a profile of your interests and show you relevant adverts on other sites. They do not store directly personal information, but are based on uniquely identifying your browser and internet device. If you do not allow these cookies, you will experience less targeted advertising. Some 3rd party video providers do not allow video views without targeting cookies. If you are experiencing difficulty viewing a video, you will need to set your cookie preferences for targeting to yes if you wish to view videos from these providers. Unity does not control this.
These cookies are necessary for the website to function and cannot be switched off in our systems. They are usually only set in response to actions made by you which amount to a request for services, such as setting your privacy preferences, logging in or filling in forms. You can set your browser to block or alert you about these cookies, but some parts of the site will not then work. These cookies do not store any personally identifiable information.