我正在实现一个仿真层。 其他一切都有效,除了模板的东西(我的阴影重叠)。
我只是想知道我是否在逻辑上做事 - 如果我做出正确的结论/假设:
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);
}
}
有几件事可能会出错。
- 你对增加和incr_sat做同样的事情。测试代码是否使用它?Gl 需要扩展才能饱和。这不是一回事。
- 使用旧的 d3d 代码仔细检查模板引用是否为 0..255。参数>255 或 <0 的处理方式可能会有所不同(钳位与和)
- 仔细检查 d3d 是否未执行双面操作。请记住,剔除是翻转的。
- 还要仔细检查模板清除代码!
好消息是,这应该适用于基本的表格翻译。没有基本的 API 问题(我之前做过)。它只需要大量的测试,因为参数空间很大。
想通了,我忘了设置我的像素格式描述符:
pfd.cStencilBits = 8;