To define a SubShader in ShaderLab, you use a SubShader
block. This page contains information on using SubShader blocks.
For information on how a Shader object works, and the relationship between Shader objects, SubShaders and Passes, see Shader objects introduction.
A Shader object contains one or more SubShaders. SubShaders let you define different GPU settings and shader programs for different hardware, render pipelines, and runtime settings. Some Shader objects contain only a single SubShader; others contain multiple SubShaders to support a range of different configurations.
Feature name | Built-in Render Pipeline | Universal Render Pipeline (URP) | High Definition Render Pipeline (HDRP) | Custom SRP |
---|---|---|---|---|
ShaderLab: SubShader block | Yes | Yes | Yes | Yes |
In ShaderLab, you define a SubShader by placing a SubShader
block inside a Shader
block.
Inside the SubShader
block, you can:
LOD
block. See assigning a LOD value to a SubShader.Tags
block. See ShaderLab: assigning tags to a SubShader.Pass
block. See ShaderLab: defining a Pass.PackageRequirements
block. This makes Unity only run the SubShader if the required packages are installed. See ShaderLab: specifying package requirements.Signature | Function |
---|---|
SubShader { <optional: LOD> <optional: tags> <optional: commands> <One or more Pass definitions> }
|
Defines a SubShader. You can define as many Passes as you like within a SubShader. |
This example code demonstrates the syntax for creating a Shader object that contains a single SubShader, which in turn contains a single Pass.
Shader "Examples/SinglePass"
{
SubShader
{
Tags { "ExampleSubShaderTagKey" = "ExampleSubShaderTagValue" }
LOD 100
// ShaderLab commands that apply to the whole SubShader go here.
Pass
{
Name "ExamplePassName"
Tags { "ExamplePassTagKey" = "ExamplePassTagValue" }
// ShaderLab commands that apply to this Pass go here.
// HLSL code goes here.
}
}
}