2

これについていろいろと調べて、この非常に役立つ記事を読んでください。このスクリーンショットは私の問題を完全に示しています:

アルファ ブレンドの問題

2 つのオブジェクトがあります。赤いオブジェクトは 2 つのクワッドで構成され、1 つは z-index が -1 で、もう 1 つは z-index が 1 です。両方のクワッドはColor.Red * 0.5f. 最初に描画されます。もう一方のオブジェクトは、z-index 0 のプレーヤーです。2 番目に描画されます

プレーヤーをクワッドの間に移動させたいので、 に設定DepthStencilStateしまし DepthStencilState.Default;たが、これにより次のイメージが得られます。プレイヤーの前にオブジェクトがあるため、プレイヤーのピクセルは無視されます。

このクラスに基づいて、すべてのプリミティブを 1 つの大きな DrawUserPrimitive にまとめます。この問題の最善の解決策は何ですか? z-index に基づいて三角形をソートする必要がありますか (そして、どのように行うのですか?それは高価ですか?) または別の解決策がありますか?

4

1 に答える 1

3

その記事に書かれていることを正確に実行するだけです。XNA 4 用に更新された「最も一般的なアプローチ」としてリストされている手順は次のとおりです。

  1. 設定GraphicsDevice.DepthStencilState = DepthStencilState.Default
  2. すべての不透明なジオメトリを描画する
  3. 設定GraphicsDevice.DepthStencilState = DepthStencilState.DepthRead
  4. アルファブレンドされたオブジェクトをカメラからの距離で並べ替え、後ろから順に描画します

透明なオブジェクトが多かれ少なかれ凸状である場合、三角形をソートする必要はありません - オブジェクト自体だけ - を使用する限りRasterizerState.CullCounterClockwise(つまり、背面カリング、デフォルト)。

これを行う必要がある理由は、深度バッファーが 1 つの値 (最上位ピクセルの値) しか格納できないためです。その深さの「下」に描くという概念はありません。そのために必要なデータ (そのピクセルの Z インデックスの上下に描画されるオブジェクトの色) は、最終的な画像に既にブレンドされており、抽出することはできません。

于 2013-03-06T14:29:52.907 に答える