2013-01-07 77 views
0

我有一个呈现所需颜色三角形的函数。我正在尝试渲染一个黄色的三角形,然后用模具测试启用一个红色的三角形。我正在使用一个圆圈作为模板窗口。我的模板测试方程和操作应该如何得到下面的输出。仅在DirectX09中进行所有渲染。 Desired output 请引导低于API的几个很好的和简单的例子....模板缓冲区测试设置DirectX9

SetRenderState(D3DRS_STENCILFUNC,
SetRenderState(D3DRS_STENCILREF,
SetRenderState(D3DRS_STENCILMASK,
SetRenderState(D3DRS_STENCILWRITEMASK,
SetRenderState(D3DRS_STENCILZFAIL,
SetRenderState(D3DRS_STENCILFAIL
SetRenderState(D3DRS_STENCILPASS,

我们如何使用圣DirectX09着色器效果文件中的encil操作(vs_3_0和ps_3_0)?

回答

1

renderstates的documentation应回答大部分相关问题。

对于创建stencilmask,你需要的方法

SetRenderState(D3DRS_STENCILZFAIL,D3DSTENCILOP_KEEP) 
SetRenderState(D3DRS_STENCILFAIL,D3DSTENCILOP_INCRSAT) 
SetRenderState(D3DRS_STENCILPASS,D3DSTENCILOP_INCRSAT) 
SetRenderState(D3DRS_STENCILFUNC,D3DCMP_ALWAYS) 

,因为他们递增模版缓冲,同时使你的圈子。然后你不使用模板缓冲器绘制你的黄色三角形。那youre绘制红色三角形

SetRenderState(D3DRS_STENCILZFAIL,D3DSTENCILOP_KEEP) 
SetRenderState(D3DRS_STENCILFAIL,D3DSTENCILOP_KEEP) 
SetRenderState(D3DRS_STENCILPASS,D3DSTENCILOP_KEEP) 
SetRenderState(D3DRS_STENCILFUNC,D3DCMP_LESS)  
SetRenderState(D3DRS_STENCILREF,0) 

打完你你stenciltest只返回true,其中的youre圈之前就已绘制(应该有更大stencilvalue 0)。如果之后没有任何适当的绘制,你应该尝试去激活Z-Test,也许你的三角形的顺序是不正确的。

我们如何在DirectX09着色器效果文件(vs_3_0和ps_3_0)中使用模板操作?

模板操作仅在您的主程序代码中使用。着色器不能对模板测试产生任何影响。

+1

SetRenderState(D3DRS_STENCILFUNC,D3DCMP_LESS)代替SetRenderState(D3DRS_STENCILFUNC,D3DCMP_GREATER)为我工作.Z-测试没有任何区别,因为所有渲染都在同一个z平面上完成。 – control

+0

我改变了我的答案,但它至少应该是LESSEQUAL,因为值不能小于零。不知道它为什么有效,很奇怪;) – Gnietschow