使用SpriteFont在XNA4中绘制文本时出现问题

时间:2012-05-04 20:23:42

标签: c# text xna spritefont

我正在尝试使用XNA中的spritefont在屏幕上绘制文本。 我可以看到文本出现,但无论我尝试什么,当我绘制文本时总会出现其他问题。

我正在尝试显示FPS。 我已经尝试过几种不同的方式和我所做的各种不同的XNA项目。 将文字绘制到屏幕时发生的一些事情包括 - 顶点被绘制得更远并且在错误的位置,根本没有绘制顶点,线框模式无法打开。 仅仅依赖于我如何渲染文本,我总是最终得到其中一个。 然后,如果我注释掉绘制文本的部分,一切都将恢复正常。

这是一些代码 我在代码顶部的变量是 -

    GraphicsDeviceManager graphics;
    SpriteFont font;
    SpriteBatch spriteBatch;

在我的LoadContent中我有

        font = Content.Load<SpriteFont>("SpriteFont1");
        RasterizerState rs = new RasterizerState();
        rs.FillMode = FillMode.WireFrame;
        GraphicsDevice.RasterizerState = rs;
        spriteBatch = new SpriteBatch(GraphicsDevice);

这是我的整个Draw方法 -

protected override void Draw(GameTime gameTime)
    {
        CreateMesh();
        GraphicsDevice.Clear(Color.SkyBlue);

        effect.Parameters["View"].SetValue(cam.viewMatrix);
        effect.Parameters["Projection"].SetValue(projectionMatrix);
        effect.CurrentTechnique = effect.Techniques["Technique1"];
        effect.CurrentTechnique.Passes[0].Apply();
        GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, vertices.Count, 0, indices.Length / 3);

        spriteBatch.Begin();
        spriteBatch.DrawString(font, frameRate.ToString(), new Vector2(1, 1), Color.Black);
        spriteBatch.End();

        frameCounter++;
        base.Draw(gameTime);
    }

这是我发现最接近工作的方式,但由于某种原因,无论我尝试做什么,它都会使线框不起作用,我真的需要线框。

编辑: 我在程序运行时调试了填充模式,并且在使用精灵字体时由于某种原因将其设置为固定。 我可以在绘制顶点之前每帧重置填充模式,但我真的不必这样做。

2 个答案:

答案 0 :(得分:1)

您应该在绘制somthing win线框模式之前应用光栅化器状态,​​而不仅仅是在load方法中...因为batch.Begin()方法将设置默认的光栅化器状态

如果你想使用其他光栅化器状态进行spritebatch,你应该提供一个

spritebatch.Begin(SortMode,...,,.., rs );

你的代码应该这样改变:

static RasterizerState rs = new RasterizerState() { FillMode = FillMode.Wireframe; }

protected override void Draw(GameTime gameTime)
{
    CreateMesh();
    GraphicsDevice.Clear(Color.SkyBlue);

    GraphicsDevice.RasterizerState = rs;

    effect.Parameters["View"].SetValue(cam.viewMatrix);
    effect.Parameters["Projection"].SetValue(projectionMatrix);
    effect.CurrentTechnique = effect.Techniques["Technique1"];
    effect.CurrentTechnique.Passes[0].Apply();
    GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, vertices.Count, 0, indices.Length / 3);
    ....

答案 1 :(得分:0)

使用SpriteBatch将渲染状态更改为3D图形不再有效的点,除非您将渲染状态更改回3D友好状态。有关详细信息,请参阅此文章。

http://blogs.msdn.com/b/shawnhar/archive/2006/11/13/spritebatch-and-renderstates.aspx