Textures inversées

8

J'essaie de dessiner des textures alignées avec ce corps physique dont l'origine du système de coordonnées est au centre de l'écran. (XNA) Spritebatch a son origine par défaut définie dans le coin supérieur gauche. J'ai réussi à positionner correctement les textures, mais j'ai remarqué que mes textures étaient inversées verticalement. Autrement dit, une texture de flèche pointant vers le haut, lorsque le rendu pointe vers le bas. Je ne sais pas où je me trompe avec les mathématiques.

Mon approche est de tout convertir en unités de mesure physique et de dessiner en conséquence.

        Matrix proj = Matrix.CreateOrthographic(scale * graphics.GraphicsDevice.Viewport.AspectRatio, scale, 0, 1);
        Matrix view = Matrix.Identity;

        effect.World = Matrix.Identity;
        effect.View = view;
        effect.Projection = proj;

        effect.TextureEnabled = true;
        effect.VertexColorEnabled = true;

        effect.Techniques[0].Passes[0].Apply();
        SpriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend, null, DepthStencilState.Default, RasterizerState.CullNone, effect);

        m_Paddles[1].Draw(gameTime);

        SpriteBatch.End();

où Paddle :: Draw ressemble:

       SpriteBatch.Draw(paddleTexture,
            mBody.Position,
            null,
            Color.White,
            0f,
            new Vector2(16f, 16f),  // origin of the texture
            0.1875f, SpriteEffects.None,   // width of box is 3*2 = 6 meters. texture is 32 pixels wide. to make it 6 meters wide in world space: 6/32 = 0.1875f
            0);

La matrice de projection orthographique me semble bien, mais je fais évidemment quelque chose de mal quelque part! Quelqu'un peut-il m'aider à comprendre ce que je fais mal ici?

Merci

brainydexter
la source
Est scalenégatif? Faites-vous quelque chose de spécial dans le vertex / pixel shader pour l'effet que vous utilisez (en particulier comment manipulez-vous / utilisez-vous les coordonnées de texture?) De plus, si vous utilisez XNA4, ne voulez-vous pas transmettre l'effet au Commencer () l'appel du lot, plutôt que d'essayer de l'invoquer manuellement?
l'échelle est généralement comprise entre 50 et 150. Ce n'est jamais négatif. Je ne fais rien de plus que ce que j'ai spécifié ici. Je crée l'effet uniquement pour utiliser la matrice de projection. J'utilise XNA4 et je transmets l'effet en tant que paramètre à Spritebatch.Begin (voir dernier paramètre); mais quand je l'ai fait ... aucune texture n'est apparue. J'ai dû l'invoquer manuellement pour que les textures commencent à apparaître à l'écran.
brainydexter
Oh, j'ai raté l'appel Begin. Dans XNA, les texcoords de (0,0) sont le coin supérieur gauche de l'image. Mais il ne semble pas que vous ayez un contrôle suffisant des texcoords ici pour avoir tout gâché.
Ouaip. Je ne comprends pas comment spritebatch gère les matrices de projection en vigueur et je pense que c'est là que réside la réponse à mon problème.
brainydexter
Vous pouvez toujours consulter le code source du spritebatch (SpriteEffect) pour voir si cela vous aide à comprendre: create.msdn.com/en-US/education/catalog/sample/stock_effects
Joel Martinez

Réponses:

4

Regardez la référence de Matrix.CreateOrthographic et notez qu'il dit ceci:

La zone visible de cette projection orthographique est centrée sur 0,0,0. L'axe des x de la zone va de -largeur / 2 à largeur / 2. L'axe des y de la zone va de -hauteur / 2 à hauteur / 2.

Donc, dans votre cas, la bordure supérieure de l'écran a une coordonnée Y de -scale / 2 au lieu de 0, et la bordure inférieure est scale / 2 au lieu de scale. Et si vous dessinez un quadruple de taille (10,10) aux coordonnées (0, 0), son point d'origine sera au centre de l'écran, mais puisque votre Y positif est vers le bas, vous le verrez inversé.

Vos meilleurs choix consistent simplement à inverser le deuxième paramètre afin que votre axe Y pointe vers le haut ou à définir la matrice orthographique avec Matrix.CreateOrthographicOffCenter afin de pouvoir spécifier manuellement l'origine du monde.

r2d2rigo
la source
0

Je pense que vous devriez pouvoir inverser les choses en utilisant votre matrice de monde d'effets:

effect.World = Matrix.CreateScale(1, -1, 1);

Au lieu d'utiliser l'identité, comme vous l'avez maintenant.

J'espère que ça aide.

VeraShackle
la source
0

Il n'est pas nécessaire de créer et d'assigner manuellement les matrices de transformation de votre effet. Spritebatch les crée pour vous. Le moyen le plus simple est de créer un effet sans vertex shader (sauf si vous faites quelque chose en plus de la projection de vision du monde attendue), car SpriteBatch a déjà un vertex shader qui prendra en charge la transformation. Ensuite, il utilisera votre pixel shader.

De plus, je ne sais pas si la façon dont vous le faites actuellement fonctionne correctement, mais il y a une surcharge différente spriteBatch.Beginqui prend un effet comme paramètre. Je ne sais pas si SpriteBatch peut correctement être affecté à l'effet actuel si vous ne le transmettez pas Begin().

Tim R.
la source