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

使用缓冲区的正确方法是什么;OpenGL中cpu端的内容,opengl,buffer,mirror,Opengl,Buffer,Mirror,让我们假设我有两个squere。首先我生成VAO,VBO,然后绑定它等等。。。我的目标是检查每帧中两个对象之间的碰撞。在这种情况下,我必须知道cpu和gpu端的确切垂直度。所以我将每个顶点存储两次。如果我处理大量数据,镜像似乎并不高效,更不用说保持数据一致性的逻辑了。有更好的方法吗?或者这完全没问题,要在glBufferData调用后将垂直项保留在一个数组中?您需要了解更多信息。这是您计划实例化的内容吗?你确定你的带宽有瓶颈吗 如果这是可以在GPU上模拟的,那么只需在GPU上进行模拟,这样就可以

让我们假设我有两个squere。首先我生成VAO,VBO,然后绑定它等等。。。我的目标是检查每帧中两个对象之间的碰撞。在这种情况下,我必须知道cpu和gpu端的确切垂直度。所以我将每个顶点存储两次。如果我处理大量数据,镜像似乎并不高效,更不用说保持数据一致性的逻辑了。有更好的方法吗?或者这完全没问题,要在glBufferData调用后将垂直项保留在一个数组中?

您需要了解更多信息。这是您计划实例化的内容吗?你确定你的带宽有瓶颈吗

如果这是可以在GPU上模拟的,那么只需在GPU上进行模拟,这样就可以将内存保留在这一侧,而不会招致CPU到GPU之间的传输惩罚

如果需要将其放在CPU端进行碰撞检测,则有几个选项:

  • 更新那些改变的。如果所有缓冲区都在更改,您应该忽略此选项,但是您可以映射缓冲区并更新它,并且只有在更新了所需的范围后才尝试刷新它

  • 发送一个位移。如果您最终拥有大量数据,您可能只需要发送一个旋转和中心位置来减少“每个顶点”的更新,并且可能能够利用几何体着色器。。。不过,我已经读到,这些可能会影响性能,所以您应该考虑它,但准备好配置。

  • 如果必须更新所有数据,则可以流式传输数据,请参阅

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

您还必须了解,要求对海量数据进行操作和快速传输往往是相互冲突的话题,您必须更明智地考虑您计划做什么,具体取决于您在这里谈论的数据量


我想回答一些更具体的问题,但我只是在瞎说,因为我不知道您的数据限制是什么以及您使用的是什么硬件。

如果您想在对象之间执行碰撞检测,请查看边界体积和简化的碰撞外壳。有多种方法可以进行更精确的比较,但很少需要“1对1”的比较。我当然不知道你项目的背景。我没有任何确切的代码,因为我是在理论上问。我想构建一个2D游戏,我计划创建一个包含vao和对象垂直方向的类。我的想法是修改垂直,并在每次对象移动时更新缓冲区。在这种情况下,我不断地更新缓冲区。如果我没有错的话,在CPU和GPU之间移动数据是很慢的,这就是为什么我应该避免这样做。我仍然需要更多的信息。例如,您的帧速率是多少?它是由vsync或某个常量绑定的,还是无界的?你为什么要把所有的方块都送过来?您应该只发送屏幕上可见的内容。屏幕上的对象数量可能很小,因此您可能可以在没有真正注意到的情况下转移它们。这里的另一个问题是,这是过早的优化,特别是如果您还没有考虑过剔除。数据传输并没有那么慢,你可以在每一帧发送大量的数据,然后一切正常(我自己也做过)。