To define a Pass in ShaderLabUnity’s language for defining the structure of Shader objects. More info
See in Glossary, use a Pass
block. This page contains information on using Pass
blocks. For information on how a ShaderA program that runs on the GPU. More info
See in Glossary object works, and the relationship between Shader objects, SubShaders and Passes, see Shader object fundamentals.
A Pass is the fundamental element of a Shader object. It contains instructions for setting the state of the GPU, and the shader programs that run on the GPU.
Simple Shader objects might contain only a single Pass, but more complex shaders can contain multiple Passes. You can use separate Passes to define parts of your Shader object that work differently; for example, parts that require a change to the render state, different shader programs, or a different LightMode
Pass tag.
Note: In render pipelines based on the Scriptable Render Pipeline, you can use a RenderStateBlock to change the render state on the GPU, without requiring a separate Pass.
Feature name | Built-in Render Pipeline | Universal Render Pipeline (URP) | High Definition Render Pipeline (HDRP) | Custom SRP |
---|---|---|---|---|
ShaderLab: Pass block | Yes | Yes | Yes | Yes |
To define a regular Pass in ShaderLab, you place a Pass
block inside a SubShader
block.
Inside the Pass
block, you can:
You can also define two special types of Pass, using the UsePass
or GrabPass
commands. For information on those commands, see ShaderLab commands: UsePass or ShaderLab commands: GrabPass.
Signature | Function |
---|---|
Pass { <optional: name> <optional: tags> <optional: commands> <optional: shader code> }
|
Defines a Pass. |
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
{
Pass
{
Name "ExamplePassName"
Tags { "ExampleTagKey" = "ExampleTagValue" }
// ShaderLab commands go here.
// HLSL code goes here.
}
}
}