Legacy Documentation: Version 5.0
ShaderLab: other commands
Advanced ShaderLab topics

Shader Assets

Suggest a change

Success!

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Close

Sumbission failed

For some reason your suggested change could not be submitted. Please try again in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Close

Cancel

Switch to Scripting

Shaders are assets that contain code and instructions for the graphics card to execute. Materials reference shaders, and setup their parameters (textures, colors and so on).

Unity contains some built-in shaders that are always available in your project (for example, the Standard shader). Image Effects package also has many shaders for image post-processing. You can also write your own shaders.

Creating a New Shader

To create a new Shader, use Assets->Create->Shader from the main menu or the Project View context menu. A shader is a text file similar to a C# script, and is written in a combination of Cg/HLSL and ShaderLab languages (see writing shaders page for details).

Shader inspector.
Shader inspector.

Shader Import Settings

This inspector section allows specifying default textures for a shader. Whenever a new Material will be created with this shader, these textures will get automatically assigned.

Shader Inspector

Shader inspector displays basic information about the shader (mostly shader tags), and allows compiling and inspecting low-level compiled code.

For Surface Shaders, the “Show generated code” button displays all the code that Unity generates to handle lighting & shadowing. If you really want to customize the generated code, you can just copy & paste all of it back to your original shader file and start tweaking.

Shader compilation popup menu.
Shader compilation popup menu.

Popup menu of the “Compile and show code” button allows inspecting final compiled shader code (e.g. assembly on Direct3D9, or low-level optimized GLSL for OpenGL ES) for selected platforms. This is mostly useful while optimizing shaders for performance; often you do want to know how many low-level instructions here generated in the end.

The low-level generated code is useful for pasting into GPU shader performance analysis tools (like AMD GPU ShaderAnalyzer or PVRShaderEditor).

Shader Compilation Details

On shader import time, Unity does not compile the whole shader. This is because majority of shaders have a lot of variants inside, and compiling all of them, for all possible platforms, would take a very long time. Instead, this is done:

  • At import time, only do minimal processing of the shader (surface shader generation etc.).
  • Actually compile the shader variants only when needed.
  • Instead of typical work of compiling 100–10000 internal shaders at import time, this usually ends up compiling just a handful.

At player build time, all the “not yet compiled” shader variants are compiled, so that they are in the game data even if the editor did not happen to use them.

However, this does mean that a shader might have an error in there, which is not detected at shader import time. For example, you’re running editor using Direct3D 11, but a shader has an error if compiled for OpenGL. Or some variants of the shader does not fit into shader model 2.0 instruction limits, etc. These errors will be shown in the inspector if editor needs them; but it’s also a good practice to manually fully compile the shader for platforms you need, to check for errors. This can be done using the “Compile and show code” popup menu in the shader inspector.

Shader compilation is done using a background process named UnityShaderCompiler that is started by Unity whenever it needs to compile shaders. Multiple compiler processes can be started (generally one per CPU core in your machine), so that at player build time shader compilation can be done in parallel. While the editor is not compiling shaders, the compiler processes do nothing and do not consume computer resources, so there’s no need to worry about them. They are also shut down when Unity editor quits.

Individual shader variant compilation results are cached in the project, under Library/ShaderCache folder. This means that 100% identical shaders or their snippets will reuse previously compiled results. It also means that the shader cache folder can become quite large, if you have a lot of shaders that are changed often. It is always safe to delete it; it will just cause shader variants to be recompiled.

Further reading

ShaderLab: other commands
Advanced ShaderLab topics