4

我正在编写一个基于 sprite 的 2D 游戏,但我很难进行碰撞检测。首先,我很了解其他方法,事实上我正在使用 Box2D 的四叉树查询来过滤掉不重叠的精灵。因此,像素完美检测将仅用于被发现重叠的精灵,并且每帧仅使用几次。精灵正在旋转但不缩放。

问题是我需要用像素来完成它,因为精灵会随着时间而改变,并且制作和使用例如 Box2D 的几何形状来近似位图会变得非常复杂。

我做了一些研究,发现这些方法在 OpenGL 中是可行的,以便检查是否有任何具有非零 alpha 通道的像素重叠:

1)使用例如 50% 的 alpha 和适当的混合功能将精灵渲染到纹理/缓冲区,将结果复制到 RAM 并检查是否有任何 alpha 大于 80% 的像素。

这种方法很简单,但是我检查了复制回来的速度非常慢。

2)使用OpenGL的遮挡查询。

从我在网络上发现的情况来看,遮挡查询可能很棘手(而且有时您需要等到下一帧才能获得结果)并且在某些显卡上会出现问题。由于游戏的设计方式,此类查询不会立即产生结果的事实是一个交易破坏者。

3)着色器和原子计数器。

我不确定它是否会起作用,但似乎在渲染第二个精灵时使用片段着色器会在每次覆盖某些内容时增加一个原子计数器,然后在 CPU 端检查计数器的值可能是一个解决方案。唯一的问题是原子计数器非常新,2,3 年的旧机器可能不支持它们。

有什么我错过的吗?或者我应该忘记使用 GPU 并编写我自己的渲染器只是为了在 CPU 上进行碰撞检测?

4

1 回答 1

0

原子计数器是在 GPU 上执行此操作的合适方法。由于您将要检查许多像素,因此您不妨并行执行此操作。这里最大的性能问题是异步读回它,但这当然取决于您如何制作引擎。

使用 OpenGL 4.2,您可以使用原子计数器。检查你的显卡是否支持这个,很有可能它支持,你应该检查这个。

于 2013-05-07T11:36:10.177 回答