我有一个存储在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
会很好。听起来不错吗?
答案 0 :(得分:3)
您应使用缓冲区对象mapping。您可以将缓冲区对象作为内存数组访问,实际上可以访问稀疏顶点。司机(希望)会为你优化它。
使用GL_DYNAMIC_DRAW
是正确的。