0

我正在将 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 中工作:(

4

2 回答 2

0

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

rt5 = PressureOffsets as RenderTarget2D
graf.SetRenderTarget(null);
PressureOffsets = rt5;
于 2021-07-30T06:34:56.853 回答
0

我解决了。有必要用新的渲染目标更改。我使用了一个辅助类“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();
}
于 2015-09-05T21:29:46.113 回答