【发布时间】:2013-10-14 16:01:51
【问题描述】:
我正在实现一个仿真层。除了模板的东西(我的阴影重叠)之外,一切都正常。
我只是想知道我做事是否合乎逻辑 - 如果我做出正确的结论/假设:
case D3DRS_STENCILENABLE:
glAble(GL_STENCIL_TEST, value);
break;
case D3DRS_STENCILFAIL:
sStencilFail = glFromD3DSTENCILOP((D3DSTENCILOP)value);
AssertGL(glStencilOp(sStencilFail, sStencilPassDepthFail, sStencilPassDepthPass));
break;
case D3DRS_STENCILZFAIL:
sStencilPassDepthFail = glFromD3DSTENCILOP((D3DSTENCILOP)value);
AssertGL(glStencilOp(sStencilFail, sStencilPassDepthFail, sStencilPassDepthPass));
break;
case D3DRS_STENCILPASS:
sStencilPassDepthPass = glFromD3DSTENCILOP((D3DSTENCILOP)value);
AssertGL(glStencilOp(sStencilFail, sStencilPassDepthFail, sStencilPassDepthPass));
break;
case D3DRS_STENCILFUNC:
sStencilFunc = glFromD3DCMPFUNC((D3DCMPFUNC)value);
AssertGL(glStencilFunc(sStencilFunc, sStencilRef, sStencilValueMask));
break;
case D3DRS_STENCILREF:
sStencilRef = value;
AssertGL(glStencilFunc(sStencilFunc, sStencilRef, sStencilValueMask));
break;
case D3DRS_STENCILMASK:
sStencilValueMask = value;
AssertGL(glStencilFunc(sStencilFunc, sStencilRef, sStencilValueMask));
break;
case D3DRS_STENCILWRITEMASK:
AssertGL(glStencilMask(value));
break;
以下是上面使用的。 glAble() 只是 glEnable/glDisable 的包装器。
static GLenum glFromD3DCMPFUNC(D3DCMPFUNC value) {
return(GL_NEVER + value - 1);
}
static GLenum glFromD3DSTENCILOP(D3DSTENCILOP value) {
switch (value) {
case D3DSTENCILOP_KEEP: return(GL_KEEP);
case D3DSTENCILOP_ZERO: return(GL_ZERO);
case D3DSTENCILOP_REPLACE: return(GL_REPLACE);
case D3DSTENCILOP_INVERT: return(GL_INVERT);
case D3DSTENCILOP_INCRSAT:
case D3DSTENCILOP_INCR:
return(GL_INCR);
case D3DSTENCILOP_DECRSAT:
case D3DSTENCILOP_DECR:
return(GL_DECR);
default: Assert(!"Unsupported!"); return(0);
}
}
【问题讨论】:
-
您的目标是哪个版本的 D3D 和 GL?在 2.0 之前的 GL 版本中,您可能无法实现 D3D9 模板,后者仅通过扩展公开双面模板操作。我希望在您的模拟器中看到处理
D3DRS_Two_Sided_StencilMODE的东西,然后适当地将D3DRS_CCW_STENCILFAIL之类的东西分派到glStencilFuncSeparate (...)。它增加了相当多的复杂性,但是有一些常见的用例可以不同地处理前/后模板测试。 -
DirectX 8 - 不做双面。 OpenGL 3.
标签: opengl directx stencil-buffer zbuffer