Texturas invertidas


8

Estou tentando desenhar texturas alinhadas com esse corpo físico cuja origem do sistema de coordenadas está no centro da tela. (XNA) Spritebatch tem sua origem padrão definida no canto superior esquerdo. Consegui posicionar as texturas corretamente, mas notei que minhas texturas estão invertidas verticalmente. Ou seja, uma textura de seta apontando para cima, quando renderizada aponta para baixo. Não sei ao certo onde estou errado com a matemática.

Minha abordagem é converter tudo em unidades de medidor de física e desenhar de acordo.

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

onde Paddle :: Draw se parece com:

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

A matriz de projeção ortográfica parece boa para mim, mas obviamente estou fazendo algo errado em algum lugar! Alguém pode me ajudar a descobrir o que estou fazendo de errado aqui?

obrigado


É scalenegativo? Você faz algo especial no sombreador de vértice / pixel para o efeito que está usando (especificamente como você manipula / usa coordenadas de textura?) Além disso, se você estiver usando o XNA4, não deseja passar o efeito para o efeito Chamada Begin () do lote, em vez de tentar invocá-lo manualmente?

escala é geralmente de 50 a 150. Nunca é negativo. Não estou fazendo nada extra além do que especifiquei aqui. Eu crio o efeito apenas para usar a matriz de projeção. Estou usando o XNA4 e passo o efeito como parâmetro para Spritebatch.Begin (consulte o último parâmetro); mas quando eu fiz isso ... nenhuma textura apareceu. Eu tive que chamar manualmente para fazer as texturas começarem a aparecer na tela.
22711 brainydexter

Oh, eu perdi a ligação Begin. No XNA, os cabos de texto de (0,0) são o canto superior esquerdo da imagem. Mas não parece que você tenha controle suficiente dos cabos de texto aqui para ter estragado tudo.

Sim. Não entendo como o spritebatch lida com as matrizes de projeção em vigor e acho que é aí que reside a resposta para o meu problema.
22711 brainydexter

Você pode sempre verificar o código fonte para o SpriteBatch (SpriteEffect) para ver se ele ajuda a sua compreensão: create.msdn.com/en-US/education/catalog/sample/stock_effects
Joel Martinez

Respostas:


4

Veja a referência de Matrix.CreateOrthographic e observe que ele diz o seguinte:

A área visível desta projeção ortográfica está centrada em 0,0,0. O eixo x da área varia de -width / 2 a width / 2. O eixo y da área varia de-altura / 2 a altura / 2.

Portanto, no seu caso, a borda superior da tela tem uma coordenada Y de -escala / 2 em vez de 0, e a borda inferior é escala / 2 em vez de escala. E se você estiver desenhando um quadrilátero de tamanho (10,10) nas coordenadas (0, 0), seu ponto de origem estará no centro da tela, mas como seu Y positivo está para baixo, você o verá invertido.

Suas melhores opções são apenas inverter o segundo parâmetro para que seu eixo Y aponte para cima ou definir a matriz ortográfica com Matrix.CreateOrthographicOffCenter para especificar manualmente a origem do mundo.


0

Eu acho que você deve ser capaz de inverter as coisas usando sua matriz mundial de efeitos:

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

Em vez de usar a identidade, como você tem agora.

Eu espero que isso ajude.


0

Não há necessidade de criar e atribuir manualmente matrizes de transformação do seu efeito. Spritebatch cria isso para você. A maneira mais simples é criar um efeito sem sombreador de vértice (a menos que você esteja fazendo algo além da projeção de visão de mundo esperada), pois o SpriteBatch já possui um sombreador de vértice que cuidará da transformação. Em seguida, ele usará seu pixel shader.

Além disso, não tenho certeza se a maneira como você está fazendo atualmente funciona corretamente, mas há uma sobrecarga diferente spriteBatch.Beginque leva um efeito como parâmetro. Não tenho certeza se o SpriteBatch pode atribuir corretamente ao efeito atual se você não o transmitir Begin().

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.