0

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 の場合ほどうまく機能しているものはありません。ここで何が欠けているのかわからない...

4

1 に答える 1

1

アルファ ブレンディング自体は正しく実行されます。そうしないと、すべての粒子が奇妙に見えます。一部のパーティクルの一部が描画されない理由は、それらが他の一部のパーティクルの透明な部分の背後にあるためです。

この問題を解決するには、次の 2 つのオプションがあります。

  1. パーティクルの ZWriteEnable をオフにします。これにより、パーティクルの後に描画されたすべてのオブジェクトがその前に表示されます。実際にはパーティクルの背後にあるはずのオブジェクトが後で描画される場合、これは問題を引き起こす可能性があります。

  2. パーティクルのアルファ テストを有効にします。アルファ テストは、(特定のしきい値を指定して) 透明なピクセルをターゲットから削除する手法です。これには ZBuffer が含まれます。

ところで。透明なオブジェクトをレンダリングする場合、ほとんどの場合、オブジェクトを並べ替えて ZBuffer の問題を解決する必要があります。上記の解決策は、いくつかの特殊なケースで機能します。

于 2012-08-06T13:11:38.540 に答える