2011-08-31 3 views
3

J'utilise XNA avec SpriteBatch et des verticies personnalisées en parallèle. Le but est d'avoir le même système de coordonnées pour les deux techniques. Cela signifie que j'ai besoin d'une matrice de projection mappée aux coordonnées de l'écran: (0, 0) est dans le coin supérieur gauche de l'écran, tandis que la largeur et la hauteur sont déterminées par la résolution de l'écran.XNA: Projection orthographique qui correspond à des coordonnées d'écran

Matrix.CreateOrthographicOffCenter(0, width, 0, height, -1, 1);

fonctionne bien, mais a le centre dans le fond coin -left.

Matrix.CreateOrthographicOffCenter(0, width, height, 0, -1, 1);

n'affiche rien du tout.

Essayer de combiner la première matrice de projection avec une translation et une mise à l'échelle y de -1 n'affiche rien du tout non plus. La mise à l'échelle par des valeurs positives fonctionne bien, la traduction aussi. Mais dès que je redimensionne par une valeur négative, je n'obtiens aucune sortie.

Des idées? PS: À des fins de test, je dessine des sommets bien au-delà des coordonnées de l'écran, donc je verrais au moins quelque chose s'il y a une erreur dans la traduction.

+0

Vous devez utiliser une matrice de vue ainsi que votre projection. – jv42

Répondre

4

J'utilise ce code pour initialiser ma caméra 2D pour dessiner des lignes, et utiliser un effet personnalisé de base pour dessiner.

Vector2 center; 
    center.X = Game.GraphicsDevice.Viewport.Width * 0.5f; 
    center.Y = Game.GraphicsDevice.Viewport.Height * 0.5f; 

    Matrix View = Matrix.CreateLookAt(new Vector3(center, 0), new Vector3(center, 1), new Vector3(0, -1, 0)); 
    Matrix Projection = Matrix.CreateOrthographic(center.X * 2, center.Y * 2, -0.5f, 1); 

Effet

uniform float4x4 xWorld; 
uniform float4x4 xViewProjection; 

void VS_Basico(in float4 inPos : POSITION, in float4 inColor: COLOR0, out float4  outPos: POSITION, out float4 outColor:COLOR0) 
{ 
    float4 tmp = mul (inPos, xWorld); 
    outPos = mul (tmp, xViewProjection); 
    outColor = inColor; 
} 

technique Lines 
{ 
    pass Pass0 
    { 
     VertexShader = compile vs_2_0 VS_Basico(); 
     FILLMODE = SOLID; 
     CULLMODE = NONE;   
    } 
} 
+0

Merci cela fonctionne. Probablement certaines de mes expériences ont fonctionné aussi, mais il semble y avoir un bug dans le fichier d'effets qui l'empêche de dessiner. Quand je dessine des primitives avec BasicEffect tout va bien, merci! :) –

Questions connexes