1

这个问题分为两个(大部分)独立的部分

我目前的设置是我在游戏空间中有很多Objects。每个都有一个分配给它的 VBO,它保存每个顶点的顶点属性数据。如果Object想要更改其顶点数据(位置等),它会在内部数组中执行此操作,然后调用glBufferSubDataARB以更新 GPU 中的版本。

现在我明白这是一件可怕 的事情,所以我正在寻找替代品。一个表现出来的就是有一些管理的东西,一开始有一个大的 VBO,Objects 可以从它请求空间,并在其中编辑点。这降低了加载 VBO 的开销,但在创建和调试这样的野兽(基本上是整个内存管理系统)时会花费大量的精力/时间。

我的问题((a)部分)是这是否是执行此操作的“最佳”方法,或者是否有我没有想到的更好的方法。

这样的系统应该允许尽可能快地轻松添加/删除顶点和编辑它们。

(b) 部分是关于对每个对象采取的一些简单动作,即旋转和平移。目前我正在移动每个顶点(哎哟),但这必须有更好的选择。我正在考虑将旋转和平移矩阵上传到我的着色器以在那里进行。这看起来不错,但我有点担心更改uniform变量的开销。这样做最终对我有利吗?变量变化的速度有多快uniform

4

1 回答 1

2

上次我检查了进行缓冲区更新的首选方法是孤立的。基本上,每当您想更新缓冲数据时,您都会调用glBindBuffer缓冲区,这会使缓冲区的当前内容无效,然后使用glMapBuffer/写入新数据glBufferSubdata

因此:

  1. 为您的静态数据使用单个大 VBO 确实是一个好主意。您必须注意允许的最大 VBO 大小,并在必要时将静态数据拆分为多个 VBO。但这在大多数情况下可能是过度优化(即“我不会打扰”)。
  2. 经常更新的数据应该分组在同一个 VBO 中(使用 = GL_STREAM_DRAW),你应该使用孤立来更新它。

不幸的是,这些东西的实际性能因不同的实现而异。这家伙在实际游戏中做了一些测试,可能值得一读。

对于您问题的第二部分,显然使用制服是这样做的方法。是的,有一些(很少)开销,但它肯定比在每一帧流式传输所有数据要好 1000 倍。

于 2013-09-09T18:38:54.317 回答