1

我正在将 3d 模型渲染到 rendertarget2D,然后我使用 sprite 批处理将其绘制到屏幕上。我使用这一行在我的构造函数中启用了抗锯齿:

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 文件中的其余函数(更新和卸载内容尚未触及。):

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 回答