Version: 2020.3
Language : English
ShaderLab: assigning tags to a SubShader
ShaderLab: defining a Pass

ShaderLab: assigning a LOD value to a SubShader

This page contains information on using a LOD block in your ShaderLabUnity’s language for defining the structure of Shader objects. More info
See in Glossary
code to assign a LODThe Level Of Detail (LOD) technique is an optimization that reduces the number of triangles that Unity has to render for a GameObject when its distance from the Camera increases. More info
See in Glossary
(level of detail) value to a SubShader.

Overview

You can assign a LOD value to a SubShader. This value indicates how computationally demanding it is.

At runtime, you can set the shaderA program that runs on the GPU. More info
See in Glossary
LOD
value for a single Shader object, or for all Shader objects. Unity then prioritises SubShaders that have a lower LOD value. For information on how Unity chooses when to use SubShaders, see How Unity selects a subshader.

Note: Although this technique is named after the LOD feature for renderingThe process of drawing graphics to the screen (or to a render texture). By default, the main camera in Unity renders its view to the screen. More info
See in Glossary
meshes, there are important differences: shader LOD does not relate to distance from the CameraA component which creates an image of a particular viewpoint in your scene. The output is either drawn to the screen or captured as a texture. More info
See in Glossary
, and Unity does not calculate shader LOD automatically. You must set the maximum shader LOD manually.

Overview

Use this technique to fine-tune shader performance on different hardware. This is useful when a SubShader is theoretically supported by a user’s hardware, but the hardware is not capable of running it well.

Render pipeline compatibility

Feature name Built-in Render Pipeline Universal Render Pipeline (URP) High Definition Render Pipeline (HDRP) Custom SRP
ShaderLab: SubShader LOD block Yes Yes Yes Yes

Using the LOD block

In ShaderLab, you assign a LOD value to a SubShader by placing a LOD block inside a SubShader block.

Signature Function
LOD [value] Assigns the given LOD value to the SubShader.

Note: Inside your Shader block, you must put your SubShaders in descending LOD order. For example, if you have SubShaders with LOD values of 200, 100, and 500, you must put the SubShader with the LOD value of 500 first, followed by the one with a LOD value of 200, followed by the one with a LOD value of 100. This is because Unity selects the first valid SubShader it finds, so if it finds one with a lower LOD first it will always use that.

Using the SubShader LOD value with C# code

To set the shader LOD for a given Shader object, you can use Shader.maximumLOD. To set the shader LOD for all Shader objects, you can use Shader.globalMaximumLOD. By default, there is no maximum LOD.

Code examples

This example code creates a Shader object that contains two SubShaders: one with a LOD value of 200, and one with a value of 100. The SubShaders are in descending order of LOD value.

Shader "Examples/ExampleLOD"
{
    SubShader
    {
        LOD 200

        Pass
        {                
              // The rest of the code that defines the Pass goes here.
        }
    }

    SubShader
    {
        LOD 100

        Pass
        {                
              // The rest of the code that defines the Pass goes here.
        }
    }
}

LOD values for Unity’s built-in shaders

In the Built-in Render Pipeline, Unity’s built-in shaders have the following LOD values:

LOD value Shader name
100 Unlit/Texture
Unlit/Color
Unlit/Transparent
Unlit/Transparent Cutout
300 Standard
Standard (Specular Setup)
Autodesk Interactive

LOD values for legacy shaders

In the Built-in Render Pipeline, Unity’s built-in legacy shaders have the following LOD values:

LOD value Shader name
100 VertexLit
150 Decal
Reflective VertexLit
200 Diffuse
250 Diffuse Detail
Reflective Bumped Unlit
Reflective Bumped VertexLit
300 Bumped
Specular
400 Bumped Specular
500 Parallax
600 Parallax Specular
ShaderLab: assigning tags to a SubShader
ShaderLab: defining a Pass