OpenGL 2.1:在VBO中重新缓冲子区域

时间:2012-01-04 23:45:29

标签: opengl vbo

我有一个存储在VBO中的地形网格。网格是由直角三角形组成的网格。换句话说,它看起来像一个带有对角线的直线网格。网格的宽度和高度是已知的,因此很容易计算给定XY的顶点索引,反之亦然。

地形网格将是可编辑的。我的问题涉及在编辑地形时重新缓冲顶点数据。我将能够确定任何编辑操作弄脏的顶点的矩形区域,所以很明显我更愿意仅重新填充那些并且让其余部分独立。

首先想到的是glBufferSubData。但我无法想出一种方法来布置我的VBO,glBufferSubData只会影响脏顶点。例如,假设我的网格是5 x 5个顶点。 (它实际上会更大;这只是一个例子。)像这样:

 0  1  2  3  4
 5  6  7  8  9
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24

(上图中的每个数字代表顶点与VBO起点的偏移量。)

假设中心的3 x 3区域需要重新缓存。这意味着我想要点击顶点6,7,8,11,12,13,16,17和18.所以我可以从索引6开始并在18结束时调用glBufferSubData

  0   1   2   3   4
  5  *6  *7  *8  *9
*10 *11 *12 *13 *14
*15 *16 *17 *18  19
 20  21  22  23  24

(在上图中,标有*的顶点被重新缓存。)

请注意,顶点10,14和15不是脏的,但它们会被重新缓存,因为它们位于glBufferSubData的范围内。这让我觉得效率低下。对于大型网格,在大多数情况下,我会以更多的方式重新缓存数据。

这个问题有一个众所周知的解决方案吗?我应该每行调用一次glBufferSubData(这会解决当前的问题,但会有自己的开销)吗?或者标准只是为了缓冲全部范围并消耗不必要的写作成本?

此外,有时会发生地形编辑但不经常发生。如果是这样,它将被动画化,因此在动画发生时必须重复更新脏顶点。我在想GL_DYNAMIC_DRAW会很好。听起来不错吗?

1 个答案:

答案 0 :(得分:3)

您应使用缓冲区对象mapping。您可以将缓冲区对象作为内存数组访问,实际上可以访问稀疏顶点。司机(希望)会为你优化它。

使用GL_DYNAMIC_DRAW是正确的。