5

我试图在运行时更改 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 在它们上绘制),它会导致一个完全紫色的屏幕。我能做些什么来解决这个问题?

4

3 回答 3

3

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

于 2010-07-17T06:51:06.787 回答
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 方法中进行渲染,这在许多方面都是违反直觉的。

于 2013-01-31T17:47:53.090 回答
1

何时spritebatch.End()调用对象被写入后备缓冲区或在您的情况下写入tempTarget. 为了制作纹理,

  • 改变目标
  • 通话开始
  • 打电话给所有的平局
  • 结束精灵批处理
  • 将目标设置回空

然后使用render2d

于 2011-07-08T20:49:51.177 回答