您的位置:首页 > 其它

DirectX11 模板测试

2015-10-04 12:21 239 查看

模板测试

1. 模板测试实现过程

如前所述,我们可以使用模板缓冲区来阻止像素片段渲染到后台缓冲区的某些区域。判断一个特定像素是否可以写入后台缓冲区的操作称为模板测试(stencil test),其实现过程为:

if( StencilRef & StencilReadMask  ⊴  Value &StencilReadMask)
accept pixel
else
reject pixel


模板测试是在像素光栅化时(即输出合并阶段)进行的。在启用模板功能之后,每个光栅化像素都要与下面的两个操作数进行模板测试:

1.左操作数(LHS)由应用程序指定的一个模板参考值(StencilRef)和一个模板掩码(StencilReadMask)进行按位与运算得到。

2.右操作数(RHS)由当前像素在模板缓冲区中的对应值(Value)和一个模板掩码(StencilReadMask)进行按位与运算得到。

注意,LHS和RHS中的StencilReadMask是相同的。

然后,通过应用程序指定的比较函数⊴对LHS和RHS进行比较,返回true或false。当测试结果为true时,说明该像素可以写入后台缓冲区(假设深度测试也通过)。当测试结果为false时,说明应该丢弃该像素,不把它写入后台缓冲区。当然,如果一个像素未能通过模板测试,那么它的深度值也不会被写入深度缓冲区。

运算符⊴可以是D3D11_COMPARISON_FUNC枚举类型定义的任何一个函数:

typedef enum D3D11_COMPARISON_FUNC
{
D3D11_COMPARISON_NEVER = 1,
D3D11_COMPARISON_LESS = 2,
D3D11_COMPARISON_EQUAL = 3,
D3D11_COMPARISON_LESS_EQUAL = 4,
D3D11_COMPARISON_GREATER = 5,
D3D11_COMPARISON_NOT_EQUAL = 6,
D3D11_COMPARISON_GREATER_EQUAL = 7,
D3D11_COMPARISON_ALWAYS = 8,
} D3D11_COMPARISON_FUNC;


1.D3D11_COMPARISON_NEVER:始终返回false。

2.D3D11_COMPARISON_LESS:用<运算符代替⊴。

3.D3D11_COMPARISON_EQUAL:用==运算符代替⊴。

4.D3D11_COMPARISON_LESS_EQUAL:用≤运算符代替⊴。

5.D3D11_COMPARISON_GREATER:用>运算符代替⊴。

6.D3D11_COMPARISON_NOT_EQUAL:用!=运算符代替⊴。

7.D3D11_COMPARISON_GREATER_EQUAL:用≥运算符代替⊴。

8.D3D11_COMPARISON_ALWAYS:始终返回true。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: