0

マネージドDirectXを使用して、スプライトを使用してテクスチャとテキストを画面に描画しようとしています。残念ながら、テキストとテクスチャを同じスプライトに配置すると、描画コマンドを実行する順序に関係なく、テクスチャがテキストを上書き(上書きしますか?)します。

最終的にはテクスチャとテキストを散在させたいので、これらのスプライトのZオーダーを指定するにはどうすればよいですか。各レイヤーは別々のスプライトにある必要がありますか?

現在のコードは次のとおりです。

m_device.BeginScene();
m_device.Clear(ClearFlags.Target, Color.Black, 1.0f, 0);
m_sprite.Begin(SpriteFlags.SortTexture | SpriteFlags.AlphaBlend);

// Switching the order of following two statements doesn't change the Z-Order!
m_sprite.Draw(m_texture, Vector3.Empty, new Vector3(0, 0, 0), 
              Color.White.ToArgb());
m_d3dFont.DrawText(m_sprite, m_text, x, y, color);

m_sprite.End();
m_device.EndScene();
m_device.Present();

注:SpriteFlags.SortDepthBackToFrontまたはSpriteFlags.SortDepthBackToFrontを使用しても、動作は変わりません。

これはおそらく私の側の概念的な誤解ですが、コードが役立つ場合は、C++またはその他の言語を使用したアンマネージドDirectXのサンプルを喜んで受け入れます。

よろしくお願いします!

4

2 に答える 2

2

レンダリングのZ順序を変更する場合は、[描画]コマンドでZ値を設定する必要があります。allを0に設定すると、あらゆる種類の奇妙さが発生します。より大きな問題は、DrawTextではあらゆる種類のゴミであるZ-Depthを設定できないことです。

したがって、唯一のチャンスはID3DXSprite::SetTransformを使用することです。関連するz順序の位置については、Z座標のみを元に戻す必要があります。したがって、次のように変換を設定できます(IDワールドマトリックスを使用していると仮定します)(C ++の例)

D3DXMATRIX mat( 1.0f, 0.0f, 0.0f, 0.0f,
                0.0f, 1.0f, 0.0f, 0.0f,
                0.0f, 0.0f, 1.0f, 0.0f,
                0.0f, 0.0f, zOrder, 1.0f );
m_Sprite->SetTransform( &mat );

次に、レンダリングのために(0、0、0)の位置を渡し続けると、テキストもz順序付けの正しい深さを取得します。

お役に立てば幸いです。

于 2011-09-12T17:18:53.240 に答える
0

これが私(ポスター)が行った答えです:

Gozは、問題を解決するために必要なほとんどの情報を提供しました。基本的に、テクスチャの場合、2番目のVerctor3の3番目のパラメータを使用してz次数を指定できます。実験により、(1)zオーダーは0.0から1.0になり、0.0が最も近く、1.0が最も遠いことが明らかになりました。その範囲外のものはまったく表示されません。

テキストの場合、呼び出しでzを指定する機会がないため、Gozの変換行列の提案を使用する必要があります。

最後に、これが私が使用したコードの大まかなものです。

m_device.BeginScene();
m_device.Clear(ClearFlags.Target, Color.Black, 1.0f, 0);
m_sprite.Begin(SpriteFlags.SortDepthFrontToBack | SpriteFlags.SortTexture | SpriteFlags.AlphaBlend);

// The "1.0f" is the z-order of texture1.  This places it at the very back.
m_sprite.Draw(m_texture1, Vector3.Empty, new Vector3(0, 0, 1.0f), 
             Color.White.ToArgb());

// The text1 is placed at z-order 0.8f, in order to place it in front of texture1
Microsoft.DirectX.Matrix t = Microsoft.DirectX.Matrix.Identity;
t.Translate(new Vector3(0, 0, 0.8f));
m_sprite.Transform = t;
m_d3dFont.DrawText(m_sprite, m_text1, 200, 200, color1);
m_sprite.Transform = Microsoft.DirectX.Matrix.Identity;


// The "0.6f" is the z-order of texture2.  This places it at the very back.
m_sprite.Draw(m_texture2, Vector3.Empty, new Vector3(220, 220, 0.6f), 
              Color.White.ToArgb());

// The text2 is placed at z-order 0.4f, in order to place it in front of texture2
t = Microsoft.DirectX.Matrix.Identity;
t.Translate(new Vector3(0, 0, 0.4f));
m_sprite.Transform = t;
m_d3dFont.DrawText(m_sprite, m_text2, 240, 240, color2);
m_sprite.Transform = Microsoft.DirectX.Matrix.Identity;

m_sprite.End();
m_device.EndScene();
m_device.Present();
于 2011-09-13T01:16:54.090 に答える