OpenGL 2.1:VBO中的拒绝子区域

OpenGL 2.1:VBO中的拒绝子区域,opengl,vbo,Opengl,Vbo,我有一个地形网格存储在VBO中。网格是由直角三角形组成的网格。换句话说,它看起来像一个带对角线的直线网格。网格的宽度和高度是已知的,因此很容易计算给定XY的顶点索引,反之亦然 地形网格将是可编辑的。我的问题涉及在编辑地形时拒绝顶点数据。我将能够确定被任何编辑操作弄脏的顶点的矩形区域,所以显然我更喜欢只拒绝那些,而不去理会其余的 首先想到的是glBufferSubData。但是我不能想出一种方法来布置我的VBO,这样glBufferSubData只会影响脏顶点。例如,假设我的网格是5 x 5个顶点

我有一个地形网格存储在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起点的偏移。)

假设需要回绝中心的3x3区域。这意味着我要点击顶点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\u DYNAMIC\u DRAW
会很好。这听起来对吗?

您应该使用缓冲区对象。您可以作为内存数组访问缓冲区对象,实际上是访问稀疏顶点。驱动程序(希望)会为您优化它

使用
GL\u DYNAMIC\u DRAW
是正确的