Я реализую слой эмуляции. Все работает иначе, кроме материала трафарета (мои тени перекрываются).Параметры трафарета между DirectX и OpenGL
Я просто интересно, если я делаю вещи логически - если я делаю соответствующие выводы/допущения:
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 вы таргетирования? Возможно, вам не удастся выполнить трафарет D3D9 в версиях GL старше 2.0, которые только открывают двусторонние трафаретные операции через расширения. Я бы ожидал увидеть что-то в своем эмуляторе, который обрабатывает 'D3DRS_Two_Sided_StencilMODE', а затем отправляет такие вещи, как' D3DRS_CCW_STENCILFAIL', в 'glStencilFuncSeparate (...)' соответствующим образом. Это добавляет довольно много осложнений, но есть обычные варианты использования для обработки теста трафарета переднего/заднего по-разному. –
DirectX 8 - не работает двусторонний. OpenGL 3. –