Invertierte Texturen

8

Ich versuche, Texturen zu zeichnen, die auf diesen Physikkörper ausgerichtet sind, dessen Koordinatensystem in der Mitte des Bildschirms liegt. (XNA) Bei Spritebatch ist der Standardursprung in der oberen linken Ecke festgelegt. Ich habe die Texturen richtig positioniert, aber ich habe festgestellt, dass meine Texturen vertikal invertiert sind. Das heißt, eine Pfeilstruktur, die nach oben zeigt, zeigt beim Rendern nach unten. Ich bin mir nicht sicher, wo ich mit der Mathematik falsch liege.

Mein Ansatz ist es, alles in Metereinheiten der Physik umzurechnen und entsprechend zu zeichnen.

        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();

wo Paddle :: Draw aussieht wie:

       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);

Die orthographische Projektionsmatrix scheint mir in Ordnung zu sein, aber ich mache offensichtlich irgendwo etwas falsch! Kann mir bitte jemand helfen, herauszufinden, was ich hier falsch mache?

Vielen Dank

Brainydexter
quelle
Ist scalenegativ? Tun Sie im Vertex / Pixel-Shader etwas Besonderes für den von Ihnen verwendeten Effekt (insbesondere wie manipulieren / verwenden Sie Texturkoordinaten?). Auch wenn Sie XNA4 verwenden, möchten Sie den Effekt nicht an den übergeben Beginnen Sie mit dem Aufruf des Stapels (), anstatt zu versuchen, ihn manuell aufzurufen?
Die Skala liegt normalerweise zwischen 50 und 150. Sie ist niemals negativ. Ich mache nichts extra als das, was ich hier angegeben habe. Ich erstelle den Effekt nur, um die Projektionsmatrix zu verwenden. Ich verwende XNA4 und übergebe den Effekt als Parameter an Spritebatch.Begin (siehe letzter Parameter). aber als ich das tat ... zeigte sich keine Textur. Ich musste manuell aufrufen, damit die Texturen auf dem Bildschirm angezeigt wurden.
Brainydexter
Oh, ich habe den Startanruf verpasst. In XNA sind Texcoords von (0,0) die obere linke Ecke des Bildes. Aber es hört sich nicht so an, als hätten Sie hier genügend Kontrolle über die Texcoords, um das durcheinander zu bringen.
Jep. Ich verstehe nicht, wie Spritebatch mit den Projektionsmatrizen umgeht, und ich denke, hier liegt die Antwort auf mein Problem.
Brainydexter
Sie können jederzeit den Quellcode für das Spritebatch (SpriteEffect) überprüfen, um festzustellen, ob dies Ihrem Verständnis hilft: create.msdn.com/en-US/education/catalog/sample/stock_effects
Joel Martinez

Antworten:

4

Sehen Sie sich die Referenz von Matrix.CreateOrthographic an und stellen Sie fest, dass dort Folgendes steht:

Der sichtbare Bereich dieser orthografischen Projektion ist auf 0,0,0 zentriert. Die x-Achse des Bereichs reicht von -width / 2 bis width / 2. Die y-Achse des Bereichs reicht von -Höhe / 2 bis Höhe / 2.

In Ihrem Fall hat der obere Rand des Bildschirms eine Y-Koordinate von -scale / 2 anstelle von 0, und der untere Rand ist scale / 2 anstelle von scale. Wenn Sie ein Quad der Größe (10,10) an den Koordinaten (0, 0) zeichnen, befindet sich sein Ursprungspunkt in der Mitte des Bildschirms. Da Ihr positives Y jedoch nach unten zeigt, wird es invertiert angezeigt.

Am besten invertieren Sie einfach den zweiten Parameter, sodass Ihre Y-Achse nach oben zeigt, oder definieren die orthografische Matrix mit Matrix.CreateOrthographicOffCenter, damit Sie den Weltursprung manuell angeben können.

r2d2rigo
quelle
0

Ich denke, Sie sollten in der Lage sein, Dinge mithilfe Ihrer Effektweltmatrix einfach umzukehren:

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

Anstatt die Identität zu verwenden, wie Sie es jetzt getan haben.

Ich hoffe das hilft.

VeraShackle
quelle
0

Sie müssen die Transformationsmatrizen Ihres Effekts nicht manuell erstellen und zuweisen. Spritebatch erstellt diese für Sie. Am einfachsten ist es, einen Effekt ohne Vertex-Shader zu erstellen (es sei denn, Sie tun dort etwas anderes als die erwartete Weltanschauungsprojektion), da SpriteBatch bereits über einen Vertex-Shader verfügt, der sich um die Transformation kümmert. Dann wird Ihr Pixel-Shader verwendet.

Ich bin mir auch nicht sicher, ob die Art und Weise, wie Sie es gerade tun, richtig funktioniert, aber es gibt eine andere Überladung spriteBatch.Begin, die einen Effekt als Parameter verwendet. Ich bin nicht sicher, ob SpriteBatch den aktuellen Effekt richtig zuordnen kann, wenn Sie ihn nicht weitergeben Begin().

Tim R.
quelle