2014-04-15 68 views
1

我正在渲染一个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); 
     } 
+0

在DrawMe()函数,你用任何形式SamplerState系列的初始化你spritebatch?更具体地说,一个PointClamp采样器状态? – jgallant

+0

我使用一个裸露的最小模型绘制循环,循环遍历模型中的网格物体,并通过每个网格中的效果,为网格启用基本照明和每像素照明,并为每个效果设置世界,投影和视图矩阵网格,然后调用ModelMesh实例的Draw方法。 –

+0

您的绘制矩形可能与您的RenderTarget(BoardScreen)大小不一致,从而导致失真? – jgallant

回答

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


+0

谢谢,这解决了这个谜团的一部分。然而,我对所有的3D产品都是全新的,所以如果你能为我说明,就好像你正在和一个孩子说话一样,我需要做些什么来解决这个问题,我会非常感激。 :) –

+0

对不起,我想我现在的答案是错的,这不是你遇到的问题。我用另一个想法更新了答案 –

+0

谢谢,它解决了问题! –