【问题标题】:OpenGL 2.1: Rebuffering sub-region in VBOOpenGL 2.1:在 VBO 中重新缓冲子区域
【发布时间】: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 会很好。这听起来对吗?

【问题讨论】:

    标签: opengl vbo


    【解决方案1】:

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

    GL_DYNAMIC_DRAW的使用是正确的。

    【讨论】:

      猜你喜欢
      • 2012-08-08
      • 1970-01-01
      • 1970-01-01
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      相关资源
      最近更新 更多