2013-10-14 70 views
1

我正在實現一個仿真層。除了模板材料(我的陰影重疊)之外,其他所有東西都可以工作。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); 
    } 
} 
+0

哪個D3D和GL的版本,你定位?在2.0以前版本的GL中實現D3D9模版時可能會遇到困難,這些版本只能通過擴展來暴露雙面模板操作。我希望在你的模擬器中看到一些處理'D3DRS_Two_Sided_StencilMODE'的東西,然後恰當地將'D3DRS_CCW_STENCILFAIL'這樣的東西分派給'glStencilFuncSeparate(...)'。它增加了相當多的複雜性,但處理前/後模板測試的常見用例有所不同。 –

+0

DirectX 8 - 不做雙面。 OpenGL 3. –

回答

1

想通了,我忘了把我的PIXELFORMATDESCRIPTOR:

pfd.cStencilBits = 8; 
1

有幾件事情可能會出錯。

  • 你對incr和incr_sat也是這樣。測試代碼是否使用它? GI需要延長才能飽和。這不是一回事。
  • 用舊的d3d代碼檢查模板ref是否0..255。參數> 255或< 0的處理方式可能有所不同(夾具對比和)
  • 仔細檢查d3d是否沒有進行雙面打印。請記住,撲殺是翻轉的。
  • 請仔細檢查模板清除代碼!

好消息是,這應該適用於基本的表格翻譯。沒有基本的API問題(我之前做過)。它只需要很多測試,因爲參數空間很大。

+0

我的代碼不使用飽和度。我的數值是0或1(所以這不是夾緊問題)。我有D3D沒有做雙面,而且剔除是不同的 - 我看到陰影,但它們重疊。模具絕對被清除,如果不是,則不會有陰影開始。還有什麼我可以留意的嗎? –