模板缓冲区保存每个像素 8 位值的一个内存存储器。在 Unity 中,你可以使用模板缓冲区来标记像素,然后只向通过模板运算的像素渲染。更多信息
查看 术语表将一个 8 位整数值存储在帧缓冲区中的每个像素计算机图像中的最小单位。像素大小取决于屏幕分辨率。像素灯光以屏幕像素为单位计算。 更多信息
查看 术语表中。在执行给定像素的片段着色器在 GPU 上运行的程序。更多信息
查看 术语表之前,GPU 可以将模板缓冲区中的当前值与给定的参考值进行比较。这称为模板测试。如果模板测试通过,则 GPU 执行深度测试。如果模板测试失败,则 GPU 会跳过该像素的其余处理。这意味着,你可以使用模板缓冲区作为一个蒙版,来告诉 GPU 要绘制哪些像素和要丢弃哪些像素。
你通常会在特殊效果(例如传送门或镜子)中使用模板缓冲区。此外,在渲染硬阴影或实体建构几何 (CSG)时,有时也会使用模板缓冲区。
您可以使用 ShaderLab.Stencil
指令来执行两种不同的操作:配置模版测试以及配置 GPU 写入模版缓冲区的内容。您可以在同一个指令中执行这两种操作,但最常见的用例是创建一个 着色器对象着色器类的实例,着色器对象是着色器程序和 GPU 指令的容器,它包含 Unity 如何使用它们的说明。使用这些内容和材质来确定场景的外观。更多信息
参见 词汇表 对其他着色器对象无法绘制到的屏幕区域进行掩膜处理。要执行此操作,您需要配置第一个着色器对象以始终通过模版测试并写入模版缓冲区,以及配置其他对象以执行模版测试并且不写入模版缓冲区。
使用 Ref
、ReadMask
和 Comp
参数来配置模版测试。使用 Ref
、WriteMask
、Pass
、Fail
和 ZFail
参数来配置模版写入操作。
此指令对渲染状态进行更改。在 Pass
块中使用此指令设置该 pass 的渲染状态,或在 SubShader
块中使用此指令设置该 SubShader 中所有 pass 的渲染状态。
模版测试方程为
(ref & readMask) comparisonFunction (stencilBufferValue & readMask)
Shader "Examples/CommandExample"
{
SubShader
{
// The rest of the code that defines the SubShader goes here.
Pass
{
// All pixels in this Pass will pass the stencil test and write a value of 2 to the stencil buffer
// You would typically do this if you wanted to prevent subsequent shaders from drawing to this area of the render target or restrict them to render to this area only
Stencil
{
Ref 2
Comp Always
Pass Replace
}
// The rest of the code that defines the Pass goes here.
}
}
}
此示例代码演示了在 SubShader 块中使用此指令的语法。
Shader "Examples/CommandExample"
{
SubShader
{
// All pixels in this SubShader pass the stencil test only if the current value of the stencil buffer is less than 2
// You would typically do this if you wanted to only draw to areas of the render target that were not "masked out"
Stencil
{
Ref 2
Comp Less
}
// The rest of the code that defines the SubShader goes here.
Pass
{
// The rest of the code that defines the Pass goes here.
}
}
}