Writing shaders overview
When you write shadersA program that runs on the GPU. More info
See in Glossary for Unity, you use the following languages:
- A programming language called HLSL. Use this to write the shader programs themselves. For more information on HLSL, see HLSL in Unity.
- A Unity-specific language called ShaderLab. Use this to define a Shader object, which acts as a container for your shader programs. For more information on ShaderLab, see ShaderLabUnity’s language for defining the structure of Shader objects. More info
See in Glossary.
You do not need to use different languages for different platforms; Unity compiles your HLSL and ShaderLab code into different languages for different graphics APIs. For more information, see Shader compilation.
Note: You can also directly write your shader programs in GLSL and Metal if you want. This is not recommended or needed as part of a normal workflow. For more information on using GLSL, see GLSL in Unity.
Different ways of writing shaders
There are different ways of writing shaders:
- The most common way is to write vertex and fragment shaders in HLSL. For more information, see Writing vertex and fragment shaders.
- In the Built-in Render Pipeline, you can also write Surface Shaders. They are a simplified way of writing shaders that interact with lighting. For more information, see Surface ShadersA streamlined way of writing shaders for the Built-in Render Pipeline. More info
See in Glossary.
- For backwards compatibility reasons, Unity also supports “fixed function style” ShaderLab commands. These let you write shaders in ShaderLab, without using HLSL. This is no longer recommended, but it is documented on the page ShaderLab legacy functionality.
Writing shaders for different graphics APIs
In some cases, you must write your shader code differently depending on the graphics API that you are targeting. For information on this, see Writing shaders for different graphics APIs.