2011-11-04 75 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

另外,如果我的假设是正确的,那么第二个代码块不是空操作。你正在做什么(我假设)你已经从某个资源加载的纹理,并将其更改为渲染目标的别名。 –