在XNA中渲染到非空渲染目标禁用了抗锯齿

时间:2014-04-15 15:15:46

标签: c# xna xna-4.0 antialiasing rendertarget

我将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)方法,它只是将模型绘制到屏幕上。相机是一个简单的类,包含投影和视图矩阵,相机的位置和目标正面。

更新

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

1 个答案:

答案 0 :(得分:1)

编辑,更新:

graphics.PreferMultiSampling仅在后台缓冲区上启用消除锯齿功能。我认为问题可能是当绘制到渲染目标时,它不会使用抗锯齿绘制。

RenderTarget2D构造函数有一个带有preferredMultiSampleCount参数的重载。尝试调用它并传递说4作为首选多样本计数。如果可行,那么您可以关闭后台缓冲区上的多重采样。


旧: 我遇到了同样的问题,因为我在3D中渲染以从多边形创建非方形拼贴,然后切换到SpriteBatch以在2D *中绘制。 SpriteBatch.Begin()改变了封面下的一大堆渲染状态,这将搞砸后续(甚至下一帧)3D绘制。因此,您需要在进行3D绘图之前重置这些状态。

There's more detail here但是IIRC需要改变的状态比那篇文章提到的要多。

希望无论如何都是这个问题。

*虽然抗锯齿不是我的问题,但更严重的是它没有画画。

编辑:answer to a similar but not identical question that provides a longer list of the kind of stuff to try reseting