3

我想要的只是清除我的 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);
4

1 回答 1

3

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

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

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

        _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()
于 2012-03-29T16:33:58.563 回答