#xna #render-to-texture
#xna #рендеринг в текстуру
Вопрос:
У меня есть некоторый код, который выглядит следующим образом:
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
(примечание: это урезано до минимального кода воспроизведения, не совсем того, что я на самом деле использую)
Если я отображаю текстуру на экране перед вторым блоком кода, он выглядит нормально и нетронутым. Но если я выполняю рендеринг после второго блока кода, для него устанавливается содержимое 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
Комментарии:
1. Это не должно иметь значения; aRegularTexture не затрагивается, пока я повторно не использую эту цель рендеринга для выполнения того, что должно быть без операции. Во всяком случае, aModifiedTexture должна быть такой же, как и aRegularTexture, а не наоборот…
2. «aModifiedTexture» на самом деле никогда не появляется в вашем опубликованном коде, поэтому трудно точно понять, что вы имеете в виду. Вы имеете в виду bloomTexture?
3. Кроме того, если мои предположения верны, второй блок кода не является нерабочим. Вы берете то, что (я предполагаю) является текстурой, которую вы загрузили с какого-либо ресурса, и изменяете ее, чтобы она была псевдонимом для цели рендеринга.