将Vertex和Index缓冲区上传到GPU

时间:2011-06-09 11:57:23

标签: opengl gpu gpu-programming terrain vertex-buffer

我正在创建一个地形引擎,目前我正在将整个地形VB(顶点缓冲区)和IB(索引缓冲区)立即上传到GPU,因为地形不是很大。目前它是256x256。

现在,假设我想创建一个使用perlin噪声生成高度图的程序性地形。

我可以生成“补丁”并立即将补丁的所有VB和IB上传到GPU,但是当玩家移动很远并且必须生成新的补丁时,我将不得不生成新的补丁补丁并将其上传到GPU。我心中的困惑或问题是:

  1. 将VB和IB上传到GPU是否很慢?当数据上传到GPU时,玩家会注意到闪烁吗?

  2. 如果我将补丁的VB和IB逐渐上传到GPU而不是一次全部上传,那么性能会更好吗?基本上我问的是VB和IB的大小是否很重要。

  3. 非常感谢有关此概念的任何信息。

    谢谢!

1 个答案:

答案 0 :(得分:2)

通常你会将你的地形分成几个小的补丁,当玩家移动时你会将其分流。在我的地形引擎中,我从不将索引缓冲区放在缓冲区对象中,因为LOD机制会不断更改绘制的顶点,并且绘制的提前Z. 256×256的顺序是合理的补丁大小,特别是如果您使用像四叉树这样的结构。

所以你可以做的是加载9个地形补丁,每个补丁的大小选择一个方式,可见范围在中心补丁周围的边界附近结束。

   |   |
---+---+---
   | C |
---+---+---
   |   |

当玩家在C补丁中移动时,可见范围确保他无法超越加载区域。一旦玩家进入另一个补丁,从另一侧包裹补丁,即

 A |   |
---+---+---
 B | X-> C
---+---+---
 C |   |

将瓷砖A,B,C重新映射到

       |   | A'
    ---+---+---
       ->C | B'
    ---+---+---
       |   | C'

A',B',C'回收A,B,C的记忆,但用新内容填充。由于玩家从远端进入新的C补丁,即只能看到新补丁的较近部分,你可以在几帧上加载A',B',C'的内容。

回答你的两个问题:

  1. 上传几何图形实际上是一个相当快速的过程,因此没有显示停止。您不会看到闪烁,因为数据上传发生在渲染帧之间,并且只有在数据更新后才会开始绘制命令。

  2. 上传内容的方式对渲染效果没有影响。但是它会影响加载地图本身所需的时间。如果您希望玩家能够遍历大型世界而不会在中间加载烦人的阶段,那么您将需要按需上传较小的补丁。