OpenGL レンダラーを DirectX9 に変換しようとしています。おおむねうまくいっているようですが、アルファ ブレンディングの設定については両者の意見が一致していないようです。OpenGL では、次のものを使用しています。
glDepthFunc(GL_LEQUAL);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
GL_DEST_ALPHA を実際に設定することはないので、デフォルトのままです。これはうまくいきます。DirectX に変換すると、次のようになります。
device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_INVSRCALPHA);
これはほぼ同じことを行う必要がありますが、まったくそうではありません。私が得ることができる最も近いものは次のとおりです。
device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_DESTALPHA);
これはほぼ正しいですが、ジオメトリが重なっている場合、前のアルファが後ろのアルファをオーバーライドし、より遠い面が見えなくなります。記録のために、私が行っているその他の潜在的に関連するレンダリング ステートは次のとおりです。
device->SetRenderState(D3DRS_LIGHTING, FALSE);
device->SetRenderState(D3DRS_ZENABLE, TRUE);
device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
この時点で、状態をランダムに変更して、どの組み合わせが最良の結果をもたらすかを確認しているように感じますが、OpenGL の場合ほどうまく機能しているものはありません。ここで何が欠けているのかわからない...