我正在渲染一个3d模型到rendertarget2D,然后使用sprite批处理将其绘制到屏幕上。我启用了使用这条线在我的构造抗锯齿:在XNA中渲染非空渲染tarhet禁用了抗锯齿
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);
}
板是类DrawableModel,其中包含一个模型和它简单地绘制模型到屏幕的方法DrawMe(相机照相机)的。相机是一个简单的类,包含投影和视图矩阵,相机的位置和目标位置。
更新:
这里的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);
}
在DrawMe()函数,你用任何形式SamplerState系列的初始化你spritebatch?更具体地说,一个PointClamp采样器状态? – jgallant
我使用一个裸露的最小模型绘制循环,循环遍历模型中的网格物体,并通过每个网格中的效果,为网格启用基本照明和每像素照明,并为每个效果设置世界,投影和视图矩阵网格,然后调用ModelMesh实例的Draw方法。 –
您的绘制矩形可能与您的RenderTarget(BoardScreen)大小不一致,从而导致失真? – jgallant