2011-11-04 72 views
0

我有一些代碼,是這樣的:重用渲染目標「溢出油漆」?

 GraphicsDevice.SetRenderTarget(0, myRenderTarget); 
     GraphicsDevice.Clear(Color.Black); 
     spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.None); 
     myEffect.Begin(); 
     myEffectCurrentTechnique.Passes[0].Begin(); 
     spriteBatch.Draw(aRegularTexture, Vector2.Zero, Color.White); 
     spriteBatch.End(); 
     myEffect.CurrentTechnique.Passes[0].End(); 
     myEffect.End(); 
     GraphicsDevice.SetRenderTarget(0, backBuffer); 
     Texture2D bloomTexture = myRenderTarget.GetTexture(); 
     ... 
     GraphicsDevice.SetRenderTarget(0, myRenderTarget); 
     GraphicsDevice.Clear(Color.Black); 
     spriteBatch.Begin(); 
     spriteBatch.Draw(aRegularTexture, Vector2.Zero, Color.White); 
     spriteBatch.End(); 
     GraphicsDevice.SetRenderTarget(0, backBuffer); 
     aRegularTexture = myRenderTarget.GetTexture(); 
     //SHOULD be doing nothing, since I'm just rendering said texture into a render target and pulling it back out 

(注:這是下調到最小再現代碼,不完全是我實際使用)

如果我在渲染之前aRegularTexture屏幕第二塊代碼,它看起來很好,沒有任何變化。但是如果我在第二塊代碼之後將其渲染出來,它將被設置爲aModifiedTexture的內容,儘管我從未做過任何會導致這種情況的事情。爲什麼? (使用XNA 3.1)

回答

1

通過肖恩哈格里夫斯:「GetTexture返回一個別名的相同表面存儲器作爲渲染目標本身,而不是數據的單獨副本」這不應該使

http://blogs.msdn.com/b/shawnhar/archive/2010/03/26/rendertarget-changes-in-xna-game-studio-4-0.aspx

+0

差異;直到我重新使用渲染目標來執行應該是沒有操作的操作時,纔會觸及aRegularTexture。如果有的話,aModifiedTexture應該與aRegularTexture相同,而不是相反... – RCIX

+0

「aModifiedTexture」從未真正出現在您的發佈代碼中,因此很難確切地知道您所指的是什麼。你的意思是bloomTexture? –

+0

另外,如果我的假設是正確的,那麼第二個代碼塊不是空操作。你正在做什麼(我假設)你已經從某個資源加載的紋理,並將其更改爲渲染目標的別名。 –