2

深さの問題に関する XNA 4.0 の大きな頭痛の種:

ここに画像の説明を入力


私はすでに同様の問題に対する多くの答えを見つけましたが、誰も私のために働きません...

デバイスは次のように設定されています。

xnaPanel1.Device.BlendState = BlendState.Opaque;                
xnaPanel1.Device.DepthStencilState = DepthStencilState.Default;
xnaPanel1.Device.PresentationParameters.DepthStencilFormat = DepthFormat.Depth24Stencil8;
[...]
Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, 4.0f / 3.0f, 0.1f, 1000f);

残忍な問題解決者として、私はほとんどの DepthStencilFormat と DepthStencilState の可能性を試しました...誰も私が望むようには機能しません。

射影行列に関して、私は多くのnearclipとfarclipの値も試しました。(立方体の幅: 10f) ですが、正しい結果が得られません。

これをさまざまなテクスチャでテストしましたが、すべて不透明です。

BasicEffect ではなく、テクスチャ + 法線マップを使用したエフェクトを使用していますが、それが原因でしょうか?

CubeEffect.fx

[...]
sampler2D colorMap = sampler_state
{
Texture = <colorMapTexture>;
    MagFilter = Linear;
    MinFilter = Anisotropic;
    MipFilter = Linear;
    MaxAnisotropy = 16;
};
sampler2D normalMap = sampler_state
{
   Texture = <normalMapTexture>;
   MagFilter = Linear;
   MinFilter = Anisotropic;
   MipFilter = Linear;
   MaxAnisotropy = 16;
};
[...]

編集: BasicEffect で試しましたが、問題は同じです...

だから...助けてくれてありがとう;)

4

3 に答える 3

2

わかりました。

pp.DepthStencilFormat = DepthFormat.Depth24Stencil8;

デバイス作成呼び出しの前である必要があります。

したがって、現時点では、これがなぜなのかわかりません。

Device.PresentationParameters.DepthStencilFormat = DepthFormat.Depth24Stencil8;

メインの Draw 関数で以前に呼び出された機能が動作しません...

結論?

PresentationParameters pp = new PresentationParameters();
pp.IsFullScreen = false;
pp.BackBufferHeight = this.renderControl.Height;
pp.BackBufferWidth = this.renderControl.Width;
pp.DeviceWindowHandle = renderControl.Handle;
pp.DepthStencilFormat = DepthFormat.Depth24Stencil8;
this.graphicsDevice = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, GraphicsProfile.HiDef, pp);

現在、正常に動作しています!

于 2012-09-15T01:01:24.773 に答える
1

PresentationParameters は、デバイスの作成方法を定義する構造体です。グラフィックス デバイスを作成するときに構造体を渡す必要があることは既に説明しましたが、これは初期構成にのみ使用されます。

デバイスはプレゼンテーション パラメータを保存しますが、変更しても、デバイスで Reset を呼び出さない限り何も起こりません。これにより、変更したパラメータを使用するようにデバイスが再初期化されます。これはコストのかかる操作です (そのため、頻繁に実行する必要はありません)。

于 2012-09-15T04:28:27.560 に答える
0

基本的GraphicsDevice.PresentationParametersには出力です- 書き込みは実際にはデバイスの状態を変更しません。デバイスがセットアップまたはリセットされるたびに更新されます。

通常は、GraphicsDevice使用してGraphicsDeviceManagerセットアップします。デバイスのセットアップ、リセット、分解を処理します。これは、デフォルトの XNA Game テンプレート プロジェクトの一部です。

状態を変更する正しい方法は、目的の値を に設定することですGraphicsDeviceManager。あなたの場合、単に設定できますPreferredDepthStencilFormat

これを行ったら、デバイスをセットアップする (つまり、ゲーム コンストラクターで設定を指定すると、XNA が残りを行います) か、呼び出してデバイスをリセットGraphicsDeviceManager.ApplyChangesする必要があります。これは通常、ユーザー入力に応じてのみ行う必要があります。 (そして明らかにすべてのフレームではありません)。詳細については、この回答を参照してください。


で直接設定できないいくつかのプレゼンテーション パラメータがあることに注意してくださいGraphicsDeviceManager。これらを変更するには、イベント ハンドラを にアタッチする必要があります GraphicsDeviceManager.PreparingDeviceSettings。イベント引数を使用すると、便利に変更できるプレゼンテーション パラメータのバージョンにアクセスできます( e.GraphicsDeviceInformation.PresentationParameters)。そこにある設定は、グラフィック デバイスの作成時に使用されるものです。

于 2012-09-15T07:26:22.173 に答える