【问题标题】:C# XNA renderTarget2D .Clear(Color.Transparent) not workingC# XNA renderTarget2D .Clear(Color.Transparent) 不工作
【发布时间】:2012-04-13 07:20:35
【问题描述】:

我想要的只是清除我的 renderTarget2D 一次,以便它开始时完全透明,然后在帧之间保留它的内容。

我在绘制背景纹理之后绘制了 renderTarget 纹理,所以我不希望它被覆盖。但是 Clear(Color.Transparent) 它显示为不透明的紫色,据我所知,这是默认的透明颜色...

我做错了什么?我尝试在构造函数中更改 SurfaceFormat 参数,但没有效果。我做错了什么?

// instantiate renderTarget to preserve contents
renderTarget = new RenderTarget2D(GraphicsDevice,
                                   GraphicsDevice.PresentationParameters.BackBufferWidth,
                                   GraphicsDevice.PresentationParameters.BackBufferHeight,
                                   false,
                                   GraphicsDevice.PresentationParameters.BackBufferFormat,
                                   DepthFormat.Depth24,
                                   0,
                                   RenderTargetUsage.PreserveContents);
// clear with transparent color
GraphicsDevice.SetRenderTarget(Globals.renderTarget);
GraphicsDevice.Clear(Color.Transparent);
GraphicsDevice.SetRenderTarget(null);

【问题讨论】:

  • 愚蠢的问题,但 renderTargetrenderTarget1 是错字吗?
  • 是的,这里转换代码时打错了!哎呀
  • 如果您要做的第一件事就是清除它,为什么还要使用 RenderTargetUsage.PreserveContents? PreserveContents 是迄今为止最慢的 RenderTargetUsage。
  • GraphicsDevice.Clear(Color.Transparent);确实按照您的预期清除了 RenderTarget。但是,PreserveContents 仅在渲染目标更改时保留内容,例如 i GraphicsDevice.SetRenderTarget(null)。在所有 RenderTargetUsages 中,RenderTarget 保持不受影响,直到它产生。
  • 附言。如果你想讨论渲染目标是如何工作的,我已经结束了 GameDev 聊天 chat.stackexchange.com/rooms/19/game-development

标签: c# xna draw rendertarget


【解决方案1】:

RenderTarget2D 用于在屏幕外绘制东西,这表明您的代码示例没有在屏幕上绘制任何内容。使用精灵批处理将 RenderTarget2D 实际绘制到将影响显示的后台缓冲区。

另一个问题是,通过绘制完全透明的 RenderTarget2D,您不会更改屏幕上的任何内容,因此即使您的代码正在创建渲染目标、以透明度清除它,然后在屏幕上绘制它也不会产生任何影响。

p>

下面是使用渲染目标然后在屏幕上绘制该渲染目标的示例。您通常不想使用渲染目标,除非您有非常昂贵的静态绘图操作,因此您可以将它们渲染一次到渲染目标并重用它们。或者因为你不想隔离一个场景来运行着色器。

        _renderTarget = new RenderTarget2D(
            GraphicsDevice, 
            (int)size.X, 
            (int)size.Y);

        GraphicsDevice.SetRenderTarget(_renderTarget);
        GraphicsDevice.Clear(Color.Transparent);

        SpriteBatch.Begin(SpriteSortMode.Immediate, BlendState.Opaque);

        //draw some stuff.

        SpriteBatch.End()

        GraphicsDevice.SetRenderTarget(null);

        GraphicsDevice.Clear(Color.Blue);

        SpriteBatch.Begin(SpriteSortMode.Immediate, BlendState.Opaque);

        SpriteBatch.Draw(_renderTarget, Vector2.Zero, Color.white);

        SpriteBatch.End()

【讨论】:

  • 感谢您在 GameDev Chat 上帮助我解决问题!
猜你喜欢
  • 1970-01-01
  • 2013-02-11
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多