我将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);
}
答案 0 :(得分:1)
编辑,更新:
graphics.PreferMultiSampling仅在后台缓冲区上启用消除锯齿功能。我认为问题可能是当绘制到渲染目标时,它不会使用抗锯齿绘制。
RenderTarget2D构造函数有一个带有preferredMultiSampleCount参数的重载。尝试调用它并传递说4作为首选多样本计数。如果可行,那么您可以关闭后台缓冲区上的多重采样。
旧: 我遇到了同样的问题,因为我在3D中渲染以从多边形创建非方形拼贴,然后切换到SpriteBatch以在2D *中绘制。 SpriteBatch.Begin()改变了封面下的一大堆渲染状态,这将搞砸后续(甚至下一帧)3D绘制。因此,您需要在进行3D绘图之前重置这些状态。
There's more detail here但是IIRC需要改变的状态比那篇文章提到的要多。
希望无论如何都是这个问题。
*虽然抗锯齿不是我的问题,但更严重的是它没有画画。