DirectX gestito: specifica della profondità (ordine Z) degli sprite contenenti texture e testo
-
29-10-2019 - |
Domanda
Sto usando DirectX gestito per provare a disegnare una texture e un pezzo di testo sullo schermo usando uno Sprite.Sfortunatamente, se metto il testo e la trama nello stesso sprite, la trama sovrascrive (sovrascrive?) Il testo indipendentemente dall'ordine in cui eseguo i comandi di disegno.
Dato che alla fine vorrò alternare texture e testo, come faccio a specificare un ordine Z per questi sprite.Ogni livello deve essere in uno sprite separato?
Ecco il codice corrente:
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();
Nota: l'utilizzo di SpriteFlags.SortDepthBackToFront o SpriteFlags.SortDepthBackToFront non modifica il comportamento.
Questo è probabilmente un malinteso concettuale da parte mia, ma se il codice è utile, accetterò con gratitudine esempi in DirectX non gestite utilizzando C ++ o qualsiasi linguaggio.
Molte grazie in anticipo!
Soluzione
Se vuoi cambiare l'ordine Z di rendering, devi impostare il valore Z nel comando Disegna.Se imposti tutto a 0 otterrai ogni sorta di stranezza.Il tuo problema più grande è che DrawText non ti consente di impostare una profondità Z che è tutti i tipi di spazzatura.
Quindi la tua unica possibilità è usare ID3DXSprite :: SetTransform.È necessario spostare indietro solo la coordinata Z con essa per la posizione di ordinamento z pertinente.Quindi puoi impostare le tue trasformazioni (supponendo che tu stia usando matrici del mondo di identità) come segue (esempio 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 );
Quindi continui a passare una posizione di (0, 0, 0) per il rendering e anche il testo acquisirà la profondità corretta per l'ordinamento z.
Spero che questo aiuti.
Altri suggerimenti
Ecco la risposta che io (il poster) ho dato:
Goz ha fornito la maggior parte delle informazioni necessarie per risolvere il problema.In sostanza, per le trame, è possibile specificare l'ordine z utilizzando il terzo parametro del secondo Verctor3.La sperimentazione ha chiarito che (1) l'ordine z va da 0.0 a 1.0, dove 0.0 è il più vicino e 1.0 il più lontano.Qualsiasi cosa al di fuori di tale intervallo non viene visualizzata affatto.
Per il testo, poiché non è possibile specificare la z nella chiamata, è necessario utilizzare il suggerimento di Goz di una matrice di trasformazione.
Alla fine, ecco più o meno il codice che ho usato.
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();