gpt4 book ai didi

opengl - 使用 opengl 进行 2D 像素完美碰撞检测

转载 作者:行者123 更新时间:2023-12-02 06:36:30 24 4
gpt4 key购买 nike

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

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

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

1) 将 Sprite 渲染到纹理/缓冲区,例如50% alpha 和适当的混合函数,将结果复制到 RAM 并检查是否有任何像素的 alpha 更大,例如80%。

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

2) 使用 OpenGL 的遮挡查询。

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

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

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

是不是我漏掉了什么?或者我应该忘记使用 GPU 并编写自己的渲染器只是为了 CPU 上的碰撞检测?

最佳答案

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

通过 OpenGL 4.2,您可以使用原子计数器。检查您的显卡是否支持此功能,很可能支持此功能,您应该检查一下。

关于opengl - 使用 opengl 进行 2D 像素完美碰撞检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16416955/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com