我正在编写一个基于精灵的2D游戏,我很难进行碰撞检测。首先,我很清楚其他方法,事实上我正在使用Box2D的四叉树查询来过滤掉非重叠的精灵。因此,像素完美检测仅用于发现重叠的精灵,并且每帧仅使用几次。精灵正在旋转,但没有缩放。
问题是我需要用像素完成它,因为精灵可以随着时间的推移而改变并且制作和使用例如像素。 Box2D用于近似位图的几何形状将变得非常复杂。
我做了一些研究,发现这些方法在OpenGL中是可行的,以便检查是否有任何非零alpha通道重叠的像素:
1)将精灵渲染到纹理/缓冲区,例如50%alpha和正确的混合功能,将结果复制到RAM并检查是否有任何像素具有更高的alpha值,例如80%。
这种方法很简单但是我检查后复制速度非常慢。
2)使用OpenGL的遮挡查询。
从我发现的网络遮挡查询可能是棘手的(有时你需要等到下一帧才能得到结果)和一些图形卡上的错误。事实上,这样的查询不会立即产生结果,这是因为游戏的设计工作原理。
3)着色器和原子计数器。
我不确定它是否会起作用但似乎在渲染第二个精灵时使用片段着色器,每次覆盖一些东西会增加一个原子计数器,然后在CPU端检查计数器的值可能是一个解决方案。唯一的问题是原子计数器是新的,2,3岁的机器可能不支持它们。
我错过了什么吗?或者我应该忘记使用GPU并编写我自己的渲染器只是为了在CPU上进行碰撞检测?
答案 0 :(得分:0)
原子计数器是在GPU上执行此操作的合适方法。由于您要检查许多像素,因此您可以并行执行此操作。这里的重要性能问题是异步读取它,但这取决于你如何制作你的引擎。
使用OpenGL 4.2,您可以使用原子计数器。检查你的显卡是否支持这种情况,它很可能,你应该检查一下。