如何从一个渲染目标到另一个渲染目标绘制一个矩形而不会丢失数据?

时间:2012-03-10 12:44:36

标签: c# xna xna-4.0

我在本周早些时候(here)提出了一个关于将数据从rendertarget传输到CPU的问题,以便可以在其上测试冲突。从我到那里的回复中,我决定将渲染目标的一部分绘制到一个较小的渲染目标,然后检索该数据将是一个有效的解决方案并尝试实现它。

绘制完整尺寸的渲染目标(1280x1024)后,我将活动渲染目标切换为较小的渲染目标(59X47 - 我的玩家的碰撞大小)并尝试绘制属于玩家的大渲染目标部分到较小的目标。起初,我认为这有效,但后来我注意到碰撞有时会非常不准确。

我将较小的渲染目标绘制到屏幕上以检查其内容,发现它在任何时候只占用了少量像素,并且这些像素始终位于左上角。

            // Render rectangle under player from foreground to collision layer
            Rectangle sourceRectangle = new Rectangle(sourceX, sourceY,
                                                       (int)sizeX, (int)sizeY);
            gd.SetRenderTarget(collisionLayer[i]);
            gd.Clear(Color.Transparent);
            spriteBatch.Draw(foregroundLayer, collisionLayer[i].Bounds,
                                                sourceRectangle, Color.White);
            gd.SetRenderTarget(null);

将完整的大型渲染目标绘制到较小的目标会导致数据成功转移(虽然显着缩放),所以我不确定出了什么问题。

            // Render full target onto collision layer
            gd.SetRenderTarget(collisionLayer[i]);
            gd.Clear(Color.Transparent);
            spriteBatch.Draw(foregroundLayer,new Vector2(0.0f),Color.White);
            gd.SetRenderTarget(null);

下图显示了大目标,小目标叠加在左上角。大目标的完整数据似乎正确绘制。

1 个答案:

答案 0 :(得分:2)

您没有展示spriteBatch.BeginspriteBatch.End来电,但看起来您需要移动它们。具体来说,您在调用spriteBatch.End之前将渲染目标设置为null,或者至少从示例代码中看起来是这样。

我设置了一个示例项目,当我执行以下操作时,一切都按预期工作......

  GraphicsDevice.SetRenderTarget(target);
  GraphicsDevice.Clear(Color.Transparent);
  spriteBatch.Begin();
  spriteBatch.Draw(texture, target.Bounds, new Rectangle(50, 500, 100, 100), Color.White);
  spriteBatch.End();

  GraphicsDevice.SetRenderTarget(null);
  GraphicsDevice.Clear(Color.CornflowerBlue);
  spriteBatch.Begin();
  spriteBatch.Draw(texture, new Rectangle(0, 0, 640, 480), texture.Bounds, Color.White);
  spriteBatch.Draw(target, Vector2.Zero, target.Bounds, Color.White);
  spriteBatch.End();

但如果我在spriteBatch.End之后移动SetRenderTarget(null)我的渲染目标为空。