在 OpenGL 中在 CPU 端使用缓冲区内容的正确方法是什么



让我们想象一下我有两个尖叫声。首先,我生成VAO,VBO,然后绑定它等等...我的目标是检查每一帧中两个对象之间的碰撞。在这种情况下,我必须知道 CPU 和 GPU 端的确切顶点。所以我将每个顶点存储两次。如果我处理大量数据,镜像似乎效率不高,更不用说保持数据一致性的逻辑了。有没有更好的方法可以做到这一点?或者这是完全可以的,在glBufferData调用后将顶点保留在数组中?

您需要更多信息。这是您计划实例化的东西吗?您确定带宽存在瓶颈吗?

如果这是您可以在 GPU 上模拟的东西,那么只需在 GPU 上完成所有操作,这样您就可以将内存保留在那一侧,而不会产生从 CPU 到 GPU 的传输损失。

如果您需要它在 CPU 端进行碰撞检测,那么您有以下几种选择:

  • 更新更改的那些。如果所有这些都在更改,则应忽略此选项,但您可以映射缓冲区并更新它,并仅在更新所需的范围后尝试刷新它。

  • 发送位移。如果您最终拥有大量数据,您可能只需发送旋转和中心位置即可减少更新"每个顶点",并且可能能够利用几何着色器......但是我已经读到这些可能对性能有问题,所以你应该考虑它,但准备好剖析。

  • 如果您必须更新所有这些数据,您可以流式传输数据,请参阅此精彩资源。

你需要更多地定义你的问题域,因为我不确定问题的界限到底是什么。以上是解决这些问题的一些方法,但只有当你谈论大案子时,你对你想要的东西更具体,才能给出最好的解决方案。

您还必须了解,要求大量数据操作和快速传输往往是相互争斗的话题,并且您必须更明智地计划做什么,具体取决于您在这里谈论的数据量。

我想用更具体的东西来回答,但我只是在黑暗中拍摄,因为我不知道你的数据极限是什么,你正在使用什么硬件。

最新更新