DirectX administrado: especificar la profundidad (orden Z) de los sprites que contienen texturas y texto

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

Pregunta

Estoy usando DirectX administrado para intentar dibujar una textura y un fragmento de texto en la pantalla usando un Sprite.Desafortunadamente, si coloco el texto y la textura en el mismo objeto, la textura sobrescribe (¿sobredibuja?) El texto independientemente del orden en el que hago los comandos de dibujo.

Dado que eventualmente querré intercalar texturas y texto, ¿cómo especifico un orden Z para estos sprites?¿Cada capa tiene que estar en un objeto separado?

Aquí está el código actual:

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: el uso de SpriteFlags.SortDepthBackToFront o SpriteFlags.SortDepthBackToFront no cambia el comportamiento.

Este es probablemente un malentendido conceptual de mi parte, pero si el código es útil, aceptaré con gratitud muestras en DirectX no administrado usando C ++ o cualquier lenguaje.

¡Muchas gracias de antemano!

¿Fue útil?

Solución

Si desea cambiar el orden Z de renderizado, debe establecer el valor Z en el comando Dibujar.Si configura el todo en 0, obtendrá todo tipo de rarezas.Su mayor problema es que DrawText no le permite establecer una profundidad Z, que es todo tipo de basura.

Por lo tanto, su única oportunidad es usar ID3DXSprite :: SetTransform.Solo debe desplazar la Coordenada Z hacia atrás con ella para la posición de pedido z relevante.Entonces puede configurar sus transformaciones (asumiendo que está usando matrices de mundo de identidad) de la siguiente manera (ejemplo de 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 );

Luego continúa pasando una posición de (0, 0, 0) para renderizar y el texto también obtendrá la profundidad correcta para el orden z.

Espero que te ayude.

Otros consejos

Aquí está la respuesta con la que fui (el póster):

Goz proporcionó la mayor parte de la información necesaria para resolver el problema.Básicamente, para las texturas, puede especificar el orden z usando el tercer parámetro del segundo Verctor3.La experimentación ha dejado claro que (1) el orden z va de 0.0 a 1.0, siendo 0.0 el más cercano y 1.0 el más alejado.Todo lo que esté fuera de ese rango no aparece en absoluto.

Para el texto, debido a que no hay oportunidad de especificar la z en la llamada, debe usar la sugerencia de Goz de una matriz de transformación.

Al final, este es aproximadamente el código que usé.

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();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top