我在本周早些时候(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);
下图显示了大目标,小目标叠加在左上角。大目标的完整数据似乎正确绘制。
答案 0 :(得分:2)
您没有展示spriteBatch.Begin
和spriteBatch.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)
我的渲染目标为空。