【问题标题】:XNA 4.0 Spritbatch - render target must not be set on the deviceXNA 4.0 Spritbatch - 不得在设备上设置渲染目标
【发布时间】:2015-11-30 23:11:59
【问题描述】:

我正在将 XNA 3.0 云效果转换为 XNA 4.0,但出现错误

"The render target must not be set on the device when it is used as a texture."

它发生在这一行的第二个循环中:

mover.Parameters["PressureMap"].SetValue(PressureOffsets);

代码:

for (int i = 0; i < 10; i++)
{
   graf.SetRenderTarget(rt5);

   mover.Parameters["PressureMap"].SetValue(PressureOffsets);
   mover.Parameters["DivergenceMap"].SetValue(Divergence);
   mover.CurrentTechnique = mover.Techniques["Jacobi"];
   mover.CurrentTechnique.Passes[0].Apply();

   sp.Begin(SpriteSortMode.Deferred, BlendState.Opaque, SamplerState.PointWrap, DepthStencilState.DepthRead, RasterizerState.CullNone);
   sp.Draw(Velocity, new Vector2(0, 0), Color.White);
   sp.End();

   graf.SetRenderTarget(null);
   PressureOffsets = rt5;
}

似乎我不能在 XNA 4.0 中将纹理设置为效果参数,如果它已经设置为渲染目标。 但我不知道如何将其转换为在 XNA 4.0 中工作:(

【问题讨论】:

    标签: xna-4.0 spritebatch rendertarget


    【解决方案1】:

    我解决了。 有必要用一个新的来改变渲染目标。 我使用了一个辅助类“RenderTargetState”。

        public RenderTargetState SetToDevice()
        {
            oldState = new RenderTargetState(GraphicsDevice);
            GraphicsDevice.SetRenderTarget(new RenderTarget2D(GraphicsDevice, renderTargetWidth, renderTargetHeight));
    
            return oldState;
        }
    
        public RenderTargetState BeginRenderToTexture()
        {
            oldState = SetToDevice();
    
            return oldState;
        }
    
        public Texture2D EndRenderGetTexture()
        {
            RenderTargetState renderBuffer = oldState.SetToDevice();
            oldState = null;
            return renderBuffer.RenderTarget;
        }
    

    所以代码现在看起来像这样:

    for (int i = 0; i < 10; i++)
    {
      rt5.BeginRenderToTexture();
      graf.SetRenderTarget(rt5.RenderTarget);    
    
      mover.Parameters["PressureMap"].SetValue(PressureOffsets);
      mover.Parameters["DivergenceMap"].SetValue(Divergence);
      mover.CurrentTechnique = mover.Techniques["Jacobi"];
      mover.CurrentTechnique.Passes[0].Apply();
    
      sp.Begin(SpriteSortMode.Deferred, BlendState.Opaque);
      sp.Draw(Velocity, new Vector2(0, 0), Color.White);
      sp.End();
    
      graf.SetRenderTarget(null);
      PressureOffsets = rt5.EndRenderGetTexture();
    }
    

    【讨论】:

      【解决方案2】:

      有一种更简单的方法可以做到这一点。

      rt5 = PressureOffsets as RenderTarget2D
      graf.SetRenderTarget(null);
      PressureOffsets = rt5;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-04
        • 1970-01-01
        • 1970-01-01
        • 2021-05-04
        相关资源
        最近更新 更多