0

我正在尝试使用 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);
    }

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

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

4

2 回答 2

1

您应该在绘制 somthing win 线框模式之前应用您的光栅化器状态,​​而不仅仅是在加载方法中......因为 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);
    ....
于 2012-05-04T22:31:18.203 回答
0

使用 aSpriteBatch将渲染状态更改为 3D 图形不再工作,除非您将渲染状态更改回 3D 友好状态。有关更多详细信息,请参阅本文。

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

于 2012-05-04T22:35:59.267 回答