反転したテクスチャ


8

座標系の原点が画面の中心にあるこの物理ボディに合わせてテクスチャを描画しようとしています。(XNA)Spritebatchのデフォルトの原点は左上隅に設定されています。テクスチャを正しく配置しましたが、テクスチャが上下反転していることに気付きました。つまり、レンダリング時に上向きの矢印テクスチャが下向きになります。数学のどこが間違っているのかわかりません。

私のアプローチは、すべてを物理のメートル単位に変換し、それに応じて描画することです。

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

ここで、Paddle :: Drawは次のようになります。

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

正射投影行列は私には問題ないように見えますが、明らかにどこかで問題が発生しています!誰かが私がここで何が間違っているのかを理解するのを助けてくれますか?

ありがとう


あるscale負のは?使用しているエフェクトの頂点/ピクセルシェーダーで何か特別なことをしますか(特に、テクスチャ座標をどのように操作/使用しますか?)また、XNA4を使用している場合、エフェクトをに渡したくないですか?手動で呼び出すのではなく、バッチのBegin()呼び出しですか?

スケールは通常、50から150の範囲です。負になることはありません。ここで指定した以外のことはしていません。射影行列のみを使用してエフェクトを作成しています。XNA4を使用していますが、エフェクトをパラメーターとしてSpritebatch.Beginに渡します(最後のパラメーターを参照)。しかし、それを行ったとき、テクスチャは表示されませんでした。テクスチャを画面に表示し始めるには、手動で呼び出す必要がありました。
brainydexter

ああ、Beginコールを逃した。XNAでは、(0,0)のtexcoordsは画像の左上隅です。しかし、ここでtexcoordを十分に制御して、それを台無しにしたようには思えません。

うん。spritebatchが投影行列を効果的に処理する方法を理解していません。それが私の問題の答えであると思います。
brainydexter

あなたはいつも、それはあなたの理解に役立つかどうかを確認するためにspritebatch(SpriteEffect)のソースコードをチェックアウトすることができます:create.msdn.com/en-US/education/catalog/sample/stock_effects
ジョエルマルティネス

回答:


4

Matrix.CreateOrthographicの参照を見て、次のようになっていることに注意してください。

この正投影の表示可能な領域は、0,0,0を中心とします。エリアのx軸の範囲は-width / 2からwidth / 2です。エリアのy軸の範囲は-height / 2からheight / 2です。

したがって、あなたのケースでは、画面の上部の境界は0ではなく-scale / 2のY座標を持ち、下部の境界はscaleではなくscale / 2です。また、座標(0、0)にサイズ(10,10)のクワッドを描画している場合、その原点は画面の中心になりますが、正のYは下向きなので、反転して表示されます。

最良の選択は、Y軸が上向きになるように2番目のパラメーターを反転するか、Matrix.CreateOrthographicOffCenterで投影行列を定義して、手動で世界の原点を指定することです。


0

私が考えるあなたのエフェクトの世界行列を使用してできるだけの反転のものでなければなりません。

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

現在のように、IDを使用する代わりに。

これがお役に立てば幸いです。


0

手動でエフェクトの変換行列を作成して割り当てる必要はありません。Spritebatchがこれらを作成します。SpriteBatchには既に変換を処理する頂点シェーダーが含まれているため、最も簡単な方法は、頂点シェーダーを使用せずにエフェクトを作成することです(予想されるワールドビュー投影以外で何かを行っている場合を除く)。次に、ピクセルシェーダーを使用します。

また、あなたが現在それを行っている方法が正しく機能するかどうかはわかりませんがspriteBatch.Begin、パラメーターとしてエフェクトを取る別のオーバーロードがあります。SpriteBatchが現在のエフェクトに渡されない場合、適切に割り当てることができるかどうかはわかりませんBegin()

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.