1

3D モデルを rendertarget2D にレンダリングしてから、スプライト バッチを使用して画面に描画します。次の行を使用して、コンストラクターでアンチエイリアシングを有効にしました。

graphics.PreferMultiSampling = true;

モデルをバックバッファに直接レンダリングすると、アンチエイリアシングが期待どおりに機能しました。rendertarget2D にレンダリングするようになったので、アンチエイリアシングが機能しなくなり、エッジがぎざぎざになります。(rendertarget2D のサイズ変更や回転は行っていません。)

この謎を説明してもらえますか?

コード:

public MyGame()
        {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";

        graphics.PreferredBackBufferHeight = 720;
        graphics.PreferredBackBufferWidth = 1208;
        graphics.PreparingDeviceSettings += setBackbufferPreserveContents;

        graphics.PreferMultiSampling = true;

        this.IsMouseVisible = true;
        this.Window.Title = "MyGame";

        graphics.ApplyChanges();
        }

public void setBackbufferPreserveContents(object sender, PreparingDeviceSettingsEventArgs e)
        {
        e.GraphicsDeviceInformation.PresentationParameters.RenderTargetUsage = RenderTargetUsage.PreserveContents;
        }

protected override void Draw(GameTime gameTime)
        {
        GraphicsDevice.SetRenderTarget(BoardScreen);
        GraphicsDevice.Clear(Color.Transparent);
        Board.DrawMe(cam);

        GraphicsDevice.SetRenderTarget(null);
        GraphicsDevice.Clear(Color.CornflowerBlue);

        sb.Begin();
        sb.Draw((Texture2D)BoardScreen, new Rectangle(0, 0, 720, 720), Color.White);
        sb.End();

        base.Draw(gameTime);
        }

Board は DrawableModel クラスであり、モデルと、モデルを画面に単純に描画するメソッド DrawMe(Camera camera) を含みます。Camera は、射影行列とビュー行列、カメラの位置とターゲット位置を含む単純なクラスです。

アップデート:

DrawMe メソッドの機能は次のとおりです。

public void DrawMe(Camera camera)
        {
        foreach (ModelMesh mesh in ModelToDraw.Meshes)
            {
            foreach (BasicEffect effect in mesh.Effects)
                {
                effect.EnableDefaultLighting();
                effect.PreferPerPixelLighting = true;

                effect.World = Matrix.CreateTranslation(Translation);
                effect.Projection = camera.Projection;
                effect.View = camera.View;
                }
            mesh.Draw();
            }
        }

更新 2:

メインの XNA ファイルの残りの関数は次のとおりです (Update と UnloadContent はまだ変更されていません)。

protected override void Initialize()
        {
        BoardScreen = new RenderTarget2D(graphics.GraphicsDevice, 720, 720);
        base.Initialize();
        }

    protected override void LoadContent()
        {
        sb = new SpriteBatch(GraphicsDevice);
        Board = new DrawableModel(Content.Load<Model>("Models/Board"), Vector3.Zero, Vector3.Zero, Vector3.One);
        }
4

1 に答える 1

1

編集、更新:

graphics.PreferMultiSampling は、バック バッファーでのみアンチエイリアシングを有効にします。問題は、レンダー ターゲットに描画するときに、アンチエイリアシングでそこに描画されないことだと思います。

RenderTarget2D コンストラクターには、preferredMultiSampleCount パラメーターを受け取るオーバーロードがあります。それを呼び出して、望ましいマルチ サンプル カウントとして 4 を渡します。それが機能する場合は、バック バッファーでマルチサンプリングをオフにできる可能性があります。


古い: 3D でレンダリングしてポリゴンから非正方形のタイルを作成し、SpriteBatch に切り替えて 2D* で描画するのと同じ問題がありました。SpriteBatch.Begin() は、カバーの下にあるレンダリング ステート全体を変更します。これにより、後続の (次のフレームでさえも) 3D 描画が台無しになります。したがって、3D 描画を行う前に、これらの状態をリセットする必要があります。

ここに詳細がありますが、IIRC には、その記事で言及されているよりも多くの状態を変更する必要がありました。

とにかくそれが問題であることを願っています。

*アンチエイリアシングは私の問題ではありませんでしたが、より深刻で、描画されていませんでした.

編集:リセットを試みるための種類のより長いリストを提供する、類似しているが同一ではない質問への回答


于 2014-04-15T18:06:09.600 に答える