Несколько RenderTargets в разных drawableComponents XNA

Привет, ребята, у меня есть небольшая проблема.

У меня есть 2 DrawableGameComponets (bigApple, smallApple) в обоих: я рисую в RenderTarget, а затем рисую RenderTarget в заднем буфере, но это происходит независимо в каждом DrawableGameComponent.

Я хочу добиться того, чтобы оба DrawableGameComponents правильно рисовали один поверх другого.

Что-то вроде этого:
Это экран с обоими drawableComponent без целей рендеринга в каждом компоненте. введите здесь описание изображения

Но вместо этого я получаю следующее:
Это экран с обоими drawableComponent и rendertargets в каждом компоненте. введите здесь описание изображения

Это для небольшой игры, над которой я работаю. Я планирую отображать в одном компоненте drawable и изображение с камеры, а в другом компоненте drawable gamecomponent саму игру. Но как только я добавлю еще один GameComponent в список компонентов, тот, что выше последнего добавленного, не будет виден.

Это код каждого выводимого компонента.

Маленькое яблоко:

public class SmallApple:DrawableComponent2D
{
    Texture2D apple;

    public SmallApple(Game game)
        : base(game)
    {
        //Do nothing
    }

    protected override void LoadContent()
    {
        apple = Game.Content.Load<Texture2D>("apple");

        this.Size = new Vector2(apple.Width,
            apple.Height);

        renderTarget = new RenderTarget2D(GraphicsDevice,
            (int)Size.X,
            (int)Size.Y,
            false,
            SurfaceFormat.Color,
            DepthFormat.None,
            this.Game.GraphicsDevice.PresentationParameters.MultiSampleCount,
            RenderTargetUsage.PreserveContents);
        base.LoadContent();
    }

    public override void Initialize()
    {
        base.Initialize();
    }

    public override void Draw(GameTime gameTime)
    {
        GraphicsDevice.SetRenderTarget(renderTarget);
        GraphicsDevice.Clear(ClearOptions.Target, Color.Transparent, 1f, 0);

        this.SharedSpriteBatch.Begin(SpriteSortMode.Immediate, null);
        this.SharedSpriteBatch.Draw(this.apple, this.Position, Color.White);
        this.SharedSpriteBatch.End();

        GraphicsDevice.SetRenderTarget(null);

        this.SharedSpriteBatch.Begin();
        this.SharedSpriteBatch.Draw(apple, this.Position,Color.White);
        this.SharedSpriteBatch.End();
        base.Draw(gameTime);
    }

}

-- И класс BigApple

public class BigApple:DrawableComponent2D
{

    Texture2D apple;

    public BigApple(Game game)
        : base(game)
    {

    }


    protected override void LoadContent()
    {
        base.LoadContent();

        apple = Game.Content.Load<Texture2D>("apple");

        this.Size = new Vector2(apple.Width, apple.Height);

        renderTarget = new RenderTarget2D(GraphicsDevice, 
            (int)Size.X,
            (int)Size.Y, 
            false, 
            SurfaceFormat.Color, 
            DepthFormat.None,
            this.Game.GraphicsDevice.PresentationParameters.MultiSampleCount,
            RenderTargetUsage.PreserveContents);

    }

    public override void Update(GameTime gameTime)
    {
        base.Update(gameTime);
    }

    public override void Draw(GameTime gameTime)
    {
        GraphicsDevice.SetRenderTarget(renderTarget);
        GraphicsDevice.Clear(ClearOptions.Target, Color.Transparent, 1f, 0);

        this.SharedSpriteBatch.Begin(SpriteSortMode.Immediate,null);
        this.SharedSpriteBatch.Draw(this.apple, this.Position, Color.White);
        this.SharedSpriteBatch.End();

        GraphicsDevice.SetRenderTarget(null);

        this.SharedSpriteBatch.Begin();
        this.SharedSpriteBatch.Draw(renderTarget,new Rectangle((int)Position.X, (int)Position.Y, (int)GraphicsDevice.Viewport.Width, (int)GraphicsDevice.Viewport.Height), Color.White);
        this.SharedSpriteBatch.End();

        base.Draw(gameTime);
    }
}

Класс DrawableComponent2D содержит наследие от drawablegameComponent и имеет некоторые переменные для работы.


person Alan Revolver    schedule 11.12.2013    source источник


Ответы (2)


Какая у вас версия XNA?
Если вы используете XNA 3.1, возможно, проблема здесь GraphicsDeviceCapabilities.MaxSimultaneousRenderTargets свойство

person pinckerman    schedule 11.12.2013
comment
я использую 4.0 на данный момент - person Alan Revolver; 12.12.2013
comment
Решено!!. я должен добавить метод к делегату: graphics.PreparingDeviceSettings; так что это метод: private void GraphicsDevicePreparingDeviceSettings (отправитель объекта, PreparingDeviceSettingsEventArgs e) { e.GraphicsDeviceInformation.PresentationParameters.RenderTargetUsage = RenderTargetUsage.PreserveContents; } ____ И чтобы добавить его в GraphicsDeviceManager достаточно одной строчки; графика. PreparingDeviceSettings += GraphicsDevicePreparingDeviceSettings; вуаля!!! Спасибо за вашу поддержку, ребята! - person Alan Revolver; 12.12.2013

Решено!!. я должен добавить метод к делегату:

Graphics.PreparingDeviceSettings;

так это метод:

private void GraphicsDevicePreparingDeviceSettings (отправитель объекта, PreparingDeviceSettingsEventArgs e) {

e.GraphicsDeviceInformation.PresentationParameters.RenderTargetUsage = RenderTargetUsage.PreserveContents;

}


А чтобы добавить его в GraphicsDeviceManager достаточно одной строчки:

графика. PreparingDeviceSettings += GraphicsDevicePreparingDeviceSettings;

вуаля!!! Спасибо за вашу поддержку

person Alan Revolver    schedule 12.12.2013