C#XNA renderTarget2D .Clear(Color.Transparent)不起作用

时间:2012-03-29 15:46:25

标签: c# xna draw rendertarget

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

1 个答案:

答案 0 :(得分:3)

RenderTarget2D用于在屏幕上绘制内容,这会导致您的代码示例无法在屏幕上绘制任何内容。使用sprite批处理实际将RenderTarget2D绘制到后台缓冲区,这将影响显示。

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

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

        _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()