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.
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.
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.
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 |
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.
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.
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.
}
}
}
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 |
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 |