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

C# 在XNA4中使用SpriteFont绘制文本时出现的问题,c#,text,xna,spritefont,C#,Text,Xna,Spritefont,我正在尝试使用XNA中的spritefont在屏幕上绘制文本。 我可以让文本出现,但无论我尝试什么,当我绘制文本时,总会有其他东西出错 我正在尝试显示FPS。 我以几种不同的方式尝试了它,并在我制作的各种不同的XNA项目中进行了尝试。 将文本绘制到屏幕时发生的一些事情包括- 顶点被绘制得更远且位于错误的点,顶点根本没有被绘制,线框模式无法启用。 只是取决于我如何尝试渲染文本,我总是以其中之一结束。 然后,如果我注释掉绘制文本的部分,一切都会恢复正常 这里有一些代码 代码顶部的变量是- G

我正在尝试使用XNA中的spritefont在屏幕上绘制文本。 我可以让文本出现,但无论我尝试什么,当我绘制文本时,总会有其他东西出错

我正在尝试显示FPS。 我以几种不同的方式尝试了它,并在我制作的各种不同的XNA项目中进行了尝试。 将文本绘制到屏幕时发生的一些事情包括- 顶点被绘制得更远且位于错误的点,顶点根本没有被绘制,线框模式无法启用。 只是取决于我如何尝试渲染文本,我总是以其中之一结束。 然后,如果我注释掉绘制文本的部分,一切都会恢复正常

这里有一些代码 代码顶部的变量是-

    GraphicsDeviceManager graphics;
    SpriteFont font;
    SpriteBatch spriteBatch;
在我的加载内容中,我有

        font = Content.Load<SpriteFont>("SpriteFont1");
        RasterizerState rs = new RasterizerState();
        rs.FillMode = FillMode.WireFrame;
        GraphicsDevice.RasterizerState = rs;
        spriteBatch = new SpriteBatch(GraphicsDevice);
这是我找到的最接近工作的方式,但由于某种原因,无论我尝试做什么,它都使线框无法工作,我真的需要线框

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

您应该在绘制线框模式之前应用光栅化器状态,而不仅仅是在加载方法中。。。因为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);
    ....

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


很可能是这样的复制:好,所以spritebatch.Begin()会自动更改某些内容。我认为这是相当愚蠢的,但我想我将不得不每帧重置它们…SpriteBatch.Begin不需要,但DrawString需要,这并不愚蠢。您应该在绘制之前设置所需的状态,这样这些类型的事情就不会有问题了。看看Shawn Hargreaves的博客:你应该阅读Shawn的所有XNA博客文章。我的意思是抽绳。我确实在绘图前设置了所需的状态。不过,画字符串会改变它。实际上,我的代码与您发布的内容几乎完全相同,所以我接受这个答案
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);
    ....