我在本周早些时候提出了一个问题(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);
下图显示了在左上角叠加小目标的大目标。大型目标的全部数据似乎被正确绘制。
图片显示的东西不工作?它对我来说看起来相当正确 - 小图像似乎是大图的一个很好的表现。你将从1280x1024下降到59x47。当尺度变化很大时,你不能指望一幅完美的小图像。 – 2012-03-10 14:33:44
如果在问题中不清楚,我很抱歉。问题在于,在复制完整图像的同时,我无法抓住玩家下方的矩形。如果我要使用第一个代码段,那么在这种情况下,左上角的图片应该是空白的,因为没有玩家坐在黑色墨水上(纸张纹理不可碰撞)并且包含黑色像素, 1,如果他们在墨水印迹上,则图像在播放器下方。我实际得到的数据似乎并没有涉及到数据,因为我只是得到了几个黑色的像素(0,0)。 – LlamaCloud 2012-03-10 14:47:11
我没有看到你显示的代码有任何明显的错误。我想我的第一个预感是你的sourceRectangle不是你期望的那样。你是否努力将矩形编码到你认识的地方,并看到结果如何? – 2012-03-10 15:09:56