Version: 2021.1
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 ShaderLab code to assign a LOD (level of detail) value to a SubShader.

概要

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

At runtime, you can set the shader 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 Shader objects: Order of operations during rendering.

Note: Although this technique is named after the LOD feature for rendering meshes, there are important differences: shader LOD does not relate to distance from the Camera, and Unity does not calculate shader LOD automatically. You must set the maximum shader LOD manually.

概要

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) HD レンダーパイプライン (HDRP) Custom SRP
ShaderLab: SubShader LOD block

Using the LOD block

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

Signature 機能
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 拡散
250 Diffuse Detail
Reflective Bumped Unlit
Reflective Bumped VertexLit
300 Bumped
Specular
400 法線バンプ鏡面
500 Parallax
600 Parallax Specular
ShaderLab: assigning tags to a SubShader
ShaderLab: defining a Pass