DirectX gestito: specifica della profondità (ordine Z) degli sprite contenenti texture e testo

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

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!

È stato utile?

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();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top