Повторное использование цели рендеринга «разливает краску»?

#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. Кроме того, если мои предположения верны, второй блок кода не является нерабочим. Вы берете то, что (я предполагаю) является текстурой, которую вы загрузили с какого-либо ресурса, и изменяете ее, чтобы она была псевдонимом для цели рендеринга.