我试图在第一次绘制时将纹理加载到rendertarget中一次,然后保留内容以在每帧均绘制相同的纹理而不重新创建它。

这是我的代码,但它不起作用,仅显示空白纹理区域,并且

RenderTarget2D rTarget = null;
        /// <summary>
        /// This is called when the game should draw itself.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(GameBackgroundColor);

            SpriteBatch.Begin();

            if (rTarget == null)
            {
                rTarget = new RenderTarget2D(Game.Graphics.GraphicsDevice,
                                           Game.Graphics.GraphicsDevice.PresentationParameters.BackBufferWidth,
                                           Game.Graphics.GraphicsDevice.PresentationParameters.BackBufferHeight,
                                           false,
                                           Game.Graphics.GraphicsDevice.PresentationParameters.BackBufferFormat,
                                           DepthFormat.Depth24, 0, RenderTargetUsage.PreserveContents);

                Game.Graphics.GraphicsDevice.SetRenderTarget(rTarget);

                Game.Graphics.GraphicsDevice.Clear(Color.Black);

                Game.SpriteBatch.Draw(ContentManager.Load<Texture2D>("tiles"), new Rectangle(0, 0, 100, 100), Color.White);

                Game.Graphics.GraphicsDevice.SetRenderTarget(null);
            }

            SpriteBatch.Draw(rTarget, new Rectangle(0, 0,400, 400), Color.White);

            //draw the character
            character.Draw(gameTime);

            SpriteBatch.End();

            base.Draw(gameTime);
        }


这是最终结果:


谁能解释我在做什么错?

最佳答案

我想您忘记了渲染目标的Game.SpriteBatch.Begin()End()。另外,我认为您应该将SpriteBatch.End()移至靠近Draw(rTarget...方法调用的地方(尤其是如果Game.SpriteBatchSpriteBatch是相同的变量)。

GraphicsDevice.Clear(GameBackgroundColor);
if (rTarget == null)
{
    rTarget = new RenderTarget2D(Game.Graphics.GraphicsDevice,
        Game.Graphics.GraphicsDevice.PresentationParameters.BackBufferWidth,
        Game.Graphics.GraphicsDevice.PresentationParameters.BackBufferHeight,
        false,
        Game.Graphics.GraphicsDevice.PresentationParameters.BackBufferFormat,
        DepthFormat.Depth24, 0, RenderTargetUsage.PreserveContents);

    Game.Graphics.GraphicsDevice.SetRenderTarget(rTarget);
    Game.Graphics.GraphicsDevice.Clear(Color.Black);

    Game.SpriteBatch.Begin();
    Game.SpriteBatch.Draw(ContentManager.Load<Texture2D>("tiles"), new Rectangle(0, 0, 100, 100), Color.White);
    Game.SpriteBatch.End();
    Game.Graphics.GraphicsDevice.SetRenderTarget(null);
}

SpriteBatch.Begin();
SpriteBatch.Draw(rTarget, new Rectangle(0, 0,400, 400), Color.White);

//draw the character
character.Draw(gameTime);

SpriteBatch.End();

base.Draw(gameTime);

09-26 17:55
查看更多