1

エミュレーションレイヤーを実装しています。ステンシルのものを除いて、それ以外の場合はすべて機能します(私の影が重なっています)。

私は物事を論理的に行っているかどうか疑問に思っています-適切な結論/仮定を作成している場合:

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);
    }
}
4

2 に答える 2

1

うまくいかないことがいくつかあります。

  • incr と incr_sat についても同じことを行います。テストコードはそれを使用していますか?Gl は飽和させるために拡張子が必要です。それは同じことではありません。
  • 古い d3d コードでは、ステンシル ref が 0..255 であることを再確認してください。パラメータ >255 または <0 の処理方法に違いがある可能性があります (clamp と and)
  • d3d が両面処理を行っていないことを再確認してください。そして、カリングが反転していることを覚えておいてください。
  • ステンシルクリアコードも要チェック!

良いニュースは、これが基本的なテーブル変換で機能することです。基本的な API の問題はありません (私は以前にやったことがあります)。パラメータスペースが大きいため、多くのテストが必要です。

于 2013-10-15T04:17:38.640 に答える
1

それを考え出した、私は自分の PIXELFORMATDESCRIPTOR を設定するのを忘れていました:

pfd.cStencilBits = 8;
于 2013-10-15T17:29:02.640 に答える