SpriteSortMode.Texture,有时候绘制顺序是错误的

时间:2013-04-28 00:10:00

标签: c# xna spritebatch

在我的XNA游戏中,我正在使用spritesortmode.texture,因为它应该是一种相当便宜的绘图方式。 我的问题是,大多数时候事情都是正确的,但有时事情是错误的(即背景是在前景上绘制的) 这个似乎会受到桌面分辨率的影响,无论是全屏,还是第二台显示器都插在笔记本电脑上。

这是我绘制块的一部分,显示有时会混淆这些混淆的东西。

 //============SPritebatch for background LINEAR WRAP textures===============

        spriteBatch.Begin(SpriteSortMode.Texture, BlendState.Opaque, SamplerState.LinearWrap,
               DepthStencilState.Default,
                RasterizerState.CullNone, null, _camera.Transform);

            Globals.CurrentLevel.CurrentRoom.DrawBg(spriteBatch);

            spriteBatch.End();
        }

  //===========SPritebatch for foreground objects, blocks etc.=================
        spriteBatch.Begin(SpriteSortMode.Texture, BlendState.Opaque, SamplerState.LinearClamp,
               DepthStencilState.Default,
               RasterizerState.CullNone, null, _camera.Transform);

        //Draw Currentroom

        Globals.CurrentLevel.CurrentRoom.Draw(spriteBatch);

        spriteBatch.End();

而且我在哪里加载纹理..(我同时加载它们)

    namespace Artefact001
    {
        class Textures
        {
            public Texture2D TiledBG01Texture { get; private set; }
            public Texture2D Blocktxture { get; private set; }
            public Texture2D ProjectileTxture { get; private set; }
            public Texture2D PointLightTexture32 { get; private set; }

            public Textures(Game game)
            {          
                PointLightTexture32 = LightTextureBuilder.CreatePointLight(game.GraphicsDevice, 32);
                Blocktxture = game.Content.Load<Texture2D>(".\\WallGraphics\\blocks");
                ProjectileTxture = game.Content.Load<Texture2D>(".\\splosions\\projectile01");
                TiledBG01Texture = game.Content.Load<Texture2D>(".\\BGgraphics\\bgtile01");
            }
        }
    }

我已经在一些地方读过spritesortmode.texture使用加载纹理的顺序来确定绘制顺序但是从未明确解释过如何使用它来获得正确的顺序。如果有人能解释这实际上应该如何工作那就太好了!

1 个答案:

答案 0 :(得分:2)

基本上,无论您在spriteBatch.Draw()内拨打SpriteBatch的顺序,SpriteSortMode.Texture都会按纹理对其进行排序,以尝试加快渲染速度。您可以使用SpriteSortMode.Deferred获得几乎相同的速度,但不会通过纹理进行排序,从而为您提供此行为。

其他SpriteSortModes可以在MSDN上的here找到。