Skip to content

格式

c++
#pragma stencil_args [SARGS] [VALUE]

描述

您需要在执行 stencil 命令并通过该命令启用 模板测试(Stencil Test)才能执行此命令。

执行此命令用于配置 模板测试(Stencil Test),以及配置渲染系统写入 模板缓冲区(Stencil Buffer)的内容。通常可用于制作镜面反射和描边等效果。

字段

字段名是否必须字段值描述
[SARGS]ref用于设定 参考值(Reference)。这个值将用来基于 comp 参数中定义的比较方式与 模板缓冲(Stencil Buffer)中的值进行比较。
readMask渲染系统在执行 模板测试(Stencil Test)时使用此参数值作为遮罩,指仅比较该遮罩换做二进制时值为 1 对应位数的值。 例如,值为 3 表示 模板测试(Stencil Test)中仅比较第 1、2 位的数值。
writeMask渲染系统在写入 模板缓冲(Stencil Buffer)时使用该值作为遮罩,指仅写入该遮罩换做二进制时值为 1 对应位数的值。 例如,值为 3 表示写入操作中仅包含第 1、2 位的数值。
comp定义每个像素的 参考值(ref)与 模板缓冲(Stencil Buffer)值的比较方式。
pass当像素通过 模板测试(Stencil Test)和 深度测试(Z Test)时,渲染系统在 模板缓冲区(Stencil Buffer)上执行的操作。
fail当像素未通过 模板测试(Stencil Test)时,渲染系统对 模板缓冲区(Stencil Buffer)执行的操作。
zFail当像素通过 模板测试(Stencil Test)但未通过 深度测试(Z Test)时,渲染系统对 模板缓冲区(Stencil Buffer)执行的操作。
[VALUE]< 自定义参数值 >根据 [SARGS] 字段的参数定义对应参数的值,其中:
· ref 参数值为 0 至 255 之间的整数,默认值为 255。
· readMask 参数值为 0 至 255 之间的整数,默认值为 255。
· writeMask 参数值为 0 至 255 之间的整数,默认值为 255。
· comp 参数值可参阅 比较操作值 小节中 [VALUE] 字段的值,默认值为 always 。
· pass 参数值可参阅 模板测试操作 小节中 [VALUE] 字段的值,默认值为 keep。
· fail 参数值可参阅 模板测试操作 小节中 [VALUE] 字段的值,默认值为 keep。
· zFail 参数值可参阅 模板测试操作 小节中 [VALUE] 字段的值,默认值为 keep。

NOTE

如果需要多个参数(即 [SARGS] 字段和 [VALUE] 字段)配置 模板缓冲区(Stencil Buffer),请使用半角空格(即英文空格)隔开。

各个字段的关系如下:

【Shader_Common_stencil_args001.png】

比较操作值

[VALUE]描述
greater当像素的 参考值(ref)大于 模板缓冲区(Stencil Buffer)中的当前值时则渲染像素。
gEqual当像素的 参考值(ref)大于或等于 模板缓冲区(Stencil Buffer)中的当前值时则渲染像素。
less当像素的 参考值(ref)小于 模板缓冲区(Stencil Buffer)中的当前值时则渲染像素。
lEqual当像素的 参考值(ref)小于或等于 模板缓冲区(Stencil Buffer)中的当前值时则渲染像素。
equal当像素的 参考值(ref)等于 模板缓冲区(Stencil Buffer)中的当前值时则渲染像素。
notEqual当像素的 参考值(ref)不等于 模板缓冲区(Stencil Buffer)中的当前值时则渲染像素。
always使 模板测试(Stencil Test)始终成功,无论比较如何,始终渲染像素。
never使 模板测试(Stencil Test)始终失败,无论比较如何,都不会渲染像素。

模板测试操作

[VALUE]
keep保留 模板缓冲区(Stencil Buffer)的当前内容
zero将 0 写入 模板缓冲区(Stencil Buffer)。
replace将 参考值(ref)写入 模板缓冲区(Stencil Buffer)。
incrSat增加 模板缓冲区(Stencil Buffer)中的当前值。如果该值已经是 255,则保持为 255。
decrSat减少 模板缓冲区(Stencil Buffer)中的当前值。如果该值已经是 0,则保持为 0。
invert对 模板缓冲区(Stencil Buffer)中当前值的所有位取反。
incrWrap增加 模板缓冲区(Stencil Buffer)中的当前值。如果该值已经是 255,则变为 0。
decrWrap减少 模板缓冲区(Stencil Buffer)中的当前值。如果该值已经是 0,则变为 255。

代码示例

c++
//您可以拆分逐个参数进行赋值;
#pragma stencil_args ref 0

//您也可以同时赋值多个参数,但是每个参数之间需要用半角空格间隔开;
#pragma stencil_args comp equal pass incrSat