Géré DirectX: Spécification de la profondeur (ordre z) des sprites contenant de la texture et du texte

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

Question

J'utilise DirectX Managed pour essayer de dessiner une texture et un morceau de texte à l'écran à l'aide d'un sprite. Malheureusement, si je place le texte et la texture dans le même sprite, la texture écrase (dépasse?) Le texte quel que soit l'ordre que je fais les commandes de tirage.

Comme je voudrais éventuellement entrecouper les textures et les textes, comment puis-je spécifier un ordre z pour ces sprites. Chaque couche doit-elle être dans un sprite séparé?

Voici le code actuel:

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

Remarque: L'utilisation du spriteflags.sortdepthbacktofront ou spriteflags.sortdepthbacktofront ne change pas le comportement.

Il s'agit probablement d'un malentendu conceptuel de ma part, mais si le code est utile, j'accepterai avec gratitude des échantillons dans DirectX non géré en utilisant C ++ ou n'importe quelle langue.

Merci d'avance!

Était-ce utile?

La solution

Si vous souhaitez modifier l'ordre z du rendu, vous devez définir la valeur Z dans la commande de dessin. Si vous définissez le tout sur 0, vous obtiendrez toutes sortes de bizarreries. Votre plus gros problème est que DrawText ne vous permet pas de définir une profondeur Z qui est toutes sortes de déchets.

Ainsi, votre seule chance est d'utiliser id3dxsprite :: setTransform. Vous devez retirer uniquement la coordonnée Z pour la position de commande Z pertinente. Vous pouvez donc définir vos transformations (en supposant que vous utilisez des matrices du monde d'identité) comme suit (exemple 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 );

Vous continuez à passer une position de (0, 0, 0) pour le rendu et le texte gagnera également la profondeur correcte pour l'ordre Z.

J'espère que cela pourra aider.

Autres conseils

Voici la réponse avec laquelle je (l'affiche) est allée avec:

GOZ a fourni la plupart des informations nécessaires pour résoudre le problème. Essentiellement, pour les textures, vous pouvez spécifier l'ordre z en utilisant le troisième paramètre du deuxième verctor3. L'expérimentation a clairement indiqué que (1) l'ordre z passe de 0,0 à 1,0, 0,0 étant le plus proche et 1,0 étant le plus éloigné. Tout ce qui sort de cette gamme n'apparaît pas du tout.

Pour le texte, car il n'y a aucune possibilité de spécifier le Z dans l'appel, vous devez utiliser la suggestion de Goz d'une matrice de transformation.

En fin de compte, voici à peu près le code que j'ai utilisé.

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();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top