2014-04-15 66 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

謝謝,它解決了問題! –