C # XNA renderTarget2D .Clear (Color.Transparent) не работает - PullRequest
3 голосов
/ 29 марта 2012

Все, что я хочу, это очистить свой 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 Ответ

3 голосов
/ 29 марта 2012

RenderTarget2D используется для рисования объектов вне экрана, что говорит о том, что ваш пример кода ничего не рисует на экране. Используйте пакет спрайтов, чтобы фактически нарисовать 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()
...