10.2 模板测试
如前所述,我们可以使用模板缓冲区来阻止像素片段渲染到后台缓冲区的某些区域。判断一个特定像素是否可以写入后台缓冲区的操作称为模板测试(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。
文件下载(已下载 578 次)发布时间:2014/8/12 下午8:45:56 阅读次数:4228