Managed DirectX: Festlegen der Tiefe (Z-Reihenfolge) von Sprites, die Textur und Text enthalten

StackOverflow https://stackoverflow.com/questions/7387598

Frage

Ich verwende verwaltetes DirectX, um mit einem Sprite eine Textur und einen Text auf den Bildschirm zu zeichnen.Wenn ich den Text und die Textur im selben Sprite platziere, überschreibt die Textur den Text leider (überzeichnet?), Unabhängig von der Reihenfolge, in der ich die Zeichenbefehle ausführe.

Wie gebe ich eine Z-Reihenfolge für diese Sprites an, da ich irgendwann Texturen und Text einstreuen möchte?Muss sich jede Ebene in einem separaten Sprite befinden?

Hier ist der aktuelle Code:

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();

Hinweis: Die Verwendung von SpriteFlags.SortDepthBackToFront oder SpriteFlags.SortDepthBackToFront ändert das Verhalten nicht.

Dies ist wahrscheinlich ein konzeptionelles Missverständnis meinerseits, aber wenn Code nützlich ist, akzeptiere ich dankbar Beispiele in nicht verwaltetem DirectX mit C ++ oder einer anderen Sprache.

Vielen Dank im Voraus!

War es hilfreich?

Lösung

Wenn Sie die Z-Reihenfolge des Renderns ändern möchten, müssen Sie den Z-Wert im Befehl Zeichnen festlegen.Wenn Sie all auf 0 setzen, werden Sie alle möglichen Verrücktheiten bekommen.Ihr größeres Problem ist, dass Sie mit DrawText keine Z-Tiefe festlegen können, bei der es sich um alle Arten von Müll handelt.

Daher besteht Ihre einzige Chance darin, ID3DXSprite :: SetTransform zu verwenden.Sie müssen nur die Z-Koordinate für die entsprechende Z-Bestellposition zurückschieben.So können Sie Ihre Transformationen (vorausgesetzt, Sie verwenden Identitätsweltmatrizen) wie folgt festlegen (C ++ - Beispiel)

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 );

Anschließend übergeben Sie zum Rendern eine Position von (0, 0, 0), und der Text erhält auch die richtige Tiefe für die Z-Reihenfolge.

Hoffe das hilft.

Andere Tipps

Hier ist die Antwort, mit der ich (das Poster) gegangen bin:

Goz lieferte die meisten Informationen, die zur Lösung des Problems erforderlich waren.Im Wesentlichen können Sie für Texturen die Z-Reihenfolge mit dem dritten Parameter des zweiten Verctor3 angeben.Experimente haben deutlich gemacht, dass die (1) z-Ordnung von 0,0 bis 1,0 reicht, wobei 0,0 am nächsten und 1,0 am weitesten entfernt ist.Alles außerhalb dieses Bereichs wird überhaupt nicht angezeigt.

Für Text müssen Sie den Vorschlag von Goz für eine Transformationsmatrix verwenden, da es keine Möglichkeit gibt, das z im Aufruf anzugeben.

Am Ende ist hier ungefähr der Code, den ich verwendet habe.

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();

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top