在紫色屏幕中更改RenderTarget结果?

时间:2010-07-17 06:31:48

标签: c# xna rendertarget

我正在尝试在运行时更改RenderTargets,因此我可以在运行时绘制一些元素,操纵它们,然后最终将纹理绘制到屏幕上。问题是,如果我在运行时更改RenderTarget,屏幕会变为紫色。这是我在Draw中得到的代码:

        RenderTarget2D tempTarget = new RenderTarget2D(GraphicsDevice, 128, 128, 1,
            GraphicsDevice.DisplayMode.Format, GraphicsDevice.PresentationParameters.MultiSampleType,
            GraphicsDevice.PresentationParameters.MultiSampleQuality, RenderTargetUsage.PreserveContents);

        GraphicsDevice.SetRenderTarget(0, tempTarget);
        GraphicsDevice.Clear(ClearOptions.Target, Color.SpringGreen, 0, 0);
        GraphicsDevice.SetRenderTarget(0, null);

如果我在运行时创建RenderTarget似乎并不重要(我确实需要在运行时创建内存中的纹理并使用SpriteBatch绘制它们),这会导致完全紫色的屏幕。我该怎么做才能解决这个问题?

3 个答案:

答案 0 :(得分:3)

看起来最好的选择是在Draw以外的地方创建RenderTarget,在Update期间绘制它,保存生成的纹理(并根据需要进行操作),然后在Draw期间绘制该纹理。

答案 1 :(得分:2)

我知道这已经很晚了,但解决方法是在清除屏幕并开始绘制其他项目之前写入RenderTarget。

protected override void Draw(GameTime gameTime)
{
     GraphicsDevice.SetRenderTarget(_renderTarget);

     //...
     //Perform Rendering to the specified target
     //...

     GraphicsDevice.SetRenderTarget(null);

     GraphicsDevice.Clear(Color.CornflowerBlue);

     //...
     //Code that draws to the users screen goes here
     //...
}

这可能会阻止您按照其他人的建议在Update方法中呈现,这在很多方面都是违反直觉的。

答案 2 :(得分:1)

调用spritebatch.End()时,对象会写入后备缓冲区,或者写入tempTarget。要制作纹理,

  • 更改目标
  • 致电开始
  • 致电所有抽奖
  • 结束spritebatch
  • 将目标设置为空

然后使用render2d