带有DrawIndexedPrimitives的SpriteBatch

时间:2013-02-27 14:40:04

标签: xna drawstring spritebatch

这是我创建的第一个3D应用程序,如果这看起来像一个简单的问题,我很抱歉,但我已经搜索了互联网和这些论坛,试图找到答案。

我正在尝试使用spriteBatch.DrawString命令在屏幕上绘制一个简单的字符串。

该应用类似于Minecraft,屏幕上有大量的立方体。为了解决滞后问题,所有立方体都是通过顶点创建的,并且已经实现了硬件实例化。

问题是,当我调用spriteBatch.Begin()时,所有其他多维数据集的显示方式都不同。我知道spritebatch改变了一些状态,因此添加了以下行

GraphicsDevice.BlendState = BlendState.Opaque;
GraphicsDevice.DepthStencilState = DepthStencilState.Default;

Bellow是用于绘制播放器的代码

public void Draw(Matrix view, Matrix projection)
    {
        effect.CurrentTechnique = effect.Techniques["TexturedNoShading"];
        effect.Parameters["xView"].SetValue(view);
        effect.Parameters["xProjection"].SetValue(projection);
        effect.Parameters["xWorld"].SetValue(world);
        effect.Parameters["xTexture"].SetValue(texture);

        device.SetVertexBuffer(myVertexBuffer);
        foreach (EffectPass pass in effect.CurrentTechnique.Passes)
        {
            pass.Apply();
            device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, vertices.Length, 0, indices.Length / 3);
        }
    }

这是主类中用于绘制所有内容的代码

        RasterizerState rs = new RasterizerState();  
        rs.CullMode = CullMode.None;
        rs.FillMode = FillMode.Solid;
        device.RasterizerState = rs;

        GraphicsDevice.BlendState = BlendState.Opaque;
        GraphicsDevice.DepthStencilState = DepthStencilState.Default;
        _map.Draw(_camera.GetCamera(), projection);
        _player.Draw(_camera.GetCamera(), projection);


        spriteBatch.Begin();
        spriteBatch.DrawString(Text, "test", new Vector2(100, 100), Color.White);
        spriteBatch.End();

我想发布问题的截图以更清楚地显示它,但由于这是我的第一篇文章,我没有权利发布图片。我很高兴通过电子邮件将图像发送给人们。

我很乐意提供任何其他信息,但这似乎是一个简单的问题。

感谢您提供的任何帮助。

Sam Vickery

1 个答案:

答案 0 :(得分:0)

我可以看到你设置顶点缓冲区的位置,但看不到你在任何地方设置索引缓冲区了吗?

它通常就在你设置vertexbuffer的地方。像这样:'

device.SetVertexBuffer(myVertexBuffer);
device.Indices = myIndexBuffer;