【发布时间】:2012-10-25 02:21:42
【问题描述】:
我有一个地形网格存储在 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。所以我可以调用 glBufferSubData,从索引 6 开始,到 18 结束:
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 会很好。这听起来对吗?
【问题讨论】: