0

XNA でスプライトフォントを使用して画面にテキストを描画しようとしています。テキストを表示することはできますが、何をしようとしても、テキストを描画するときに何か他のことがうまくいかないことが常にあります。

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);
    }

これは私が見つけた作業に最も近い方法ですが、何らかの理由で、何をしようとしてもワイヤーフレームが機能せず、ワイヤーフレームが本当に必要です。

編集:プログラムの実行時に塗りつぶしモードをデバッグし、スプライト フォントを使用すると、何らかの理由で塗りつぶしモードに戻ります。頂点が描画される前にフレームごとに塗りつぶしモードをリセットできますが、実際にはそうする必要はありません。

4

2 に答える 2

1

ロード メソッドだけでなく、ワイヤフレーム モードで何かを描画する直前に、ラスタライザの状態を適用する必要があります。batch.Begin() メソッドはデフォルトのラスタライザの状態を設定するためです。

スプライトバッチに他のラスタライザー状態を使用したい場合は、それを提供する必要があります

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

を使用するSpriteBatchと、レンダリング状態を 3D 対応の状態に戻さない限り、3D グラフィックスが機能しなくなるポイントまでレンダリング状態が変更されます。詳細については、この記事を参照してください。

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

于 2012-05-04T22:35:59.267 に答える