2011-09-12 9 views
0

マネージDirectXを使用して、スプライトを使用してテクスチャとテキストを描画します。残念ながら、テキストとテクスチャを同じスプライトに配置すると、描画コマンドを実行する順序に関係なく、テクスチャがテキストを上書き(オーバードロー?)します。マネージDirectX:テクスチャとテキストを含むスプライトの深度(Zオーダー)を指定する

私は最終的にテクスチャとテキストを散りばめたいので、どのようにこれらのスプライトに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でサンプルを受け入れることに感謝します。

事前に感謝します。

+0

Drawメソッドには、layerDepth引数をとるオーバーロードがありますか? XNAのSpriteBatchはそうしているので、管理されているDirectXのスプライトがどちらかを持っていると思う。 – tafa

+0

コメントありがとうございます。 Sprite.DrawとFont.DrawTextのどちらも、レイヤ深度引数を​​持ちません。 Sprite.Drawの2番目のVector3は3次元位置を指定しますが、Zを負にするとテクスチャがまったく表示されず、正にすることでオーバードローの動作が変更されません。 –

答えて

2

レンダリングのZオーダーを変更する場合は、描画コマンドでZ値を設定する必要があります。 allを0に設定すると、あらゆる種類の奇妙なものが得られます。あなたのより大きな問題は、DrawTextはすべての種類のごみであるZ-Depthを設定できないということです。

したがって、唯一の機会は、ID3DXSprite :: SetTransformを使用することです。関連するzの順序付け位置については、Z座標のみを戻す必要があります。だから、あなたは(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オーダーの正しい深度。

希望に役立ちます。

ゴズは、問題を解決するために必要な情報のほとんどを提供する:ここでは

+0

ありがとうございます。これは、テクスチャとテキストの両方にスプライトの深度を設定できる程度に近いものでした。私はすぐにコード例を提供する答えを追加します。マイナーポイント - 変換マトリックスでは、zオーダーを変換するのではなく、変換したいと考えています。私は でこれを行いました。Matrix t = Microsoft.DirectX.Matrix。身元; t.Translate(0、0、zOrder); –

+0

@トム・ウェスト:申し訳ありませんが、あなたは完全に正しいです。それは私の愚かな間違いでした。私は私の答えを編集します:) – Goz

0

はI(ポスターは)一緒に行った答えです。基本的にテクスチャの場合、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(); 
関連する問題