2011-06-09 32 views
2

我创建一个地形引擎,目前我一次上传整个地形VB(顶点缓冲区)和IB(索引缓冲)的GPU,因为地形不巨大。目前是256x256。上传顶点和索引缓冲区到GPU

现在,让我们说,我想创建一个使用Perlin杂点生成高度图一个程序地形。我可以生成“补丁”并一次性向GPU上传补丁的所有VB和IB,但是随着玩家移动很远并且必须生成新的补丁,那么我将不得不生成新补丁并将其上传到GPU。我在脑海中遇到的困惑或问题有:

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

  2. 会表现更好,如果我上传了补丁的VB和IB逐步向GPU,而不是所有的人都在一次?基本上我在问VB和IB的大小是否很重要。

任何关于这个概念的信息将不胜感激。

谢谢!

回答

2

通常你会在一些小补丁,这为玩家一起移动,你会流分割的地形。在我的地形引擎中,我永远不会将索引缓冲区放入缓冲区对象中,因为LOD机制会不断更改绘制哪些顶点以及绘制什么顺序以改善早期Z. 256×256是合理的补丁大小,尤其是在您使用像quadtrees结构。

所以你能做的就是为装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. 您上传东西的方式对渲染性能没有影响。但是它对加载地图本身需要多长时间有影响。如果你希望玩家能够遍历大型世界,而不需要烦人的加载阶段,你需要按需上传较小的补丁。

+0

令人惊讶的是,今晚我会做一些测试,看看它是如何发展的。感谢您提供非常详细的答案。但是关于“自己加载地图需要多长时间”,让我们假设VB和IB已准备好上传(缓存在vram上),上传到GPU时VB和IB的大小不会有关系,if VB可能有1000x1000顶点的补丁,那么我应该注意到快门,对吧?越少,上传到GPU的速度越快? – raRaRa 2011-06-09 14:13:33

+0

@raRaRa:vram是什么意思?显卡上的RAM?那么,这就是GPU RAM,这就是缓冲区对象的全部内容。如果它已经加载到系统RAM中:是的,这个值越大,上传的时间就越长。但最终的重点是上传的顶点总数,如果它们有很多小块或大块,它们没有什么大的区别。如果你渲染的场景需要所有的视觉细节,他们将全部以任何方式上传,然后才能绘制任何内容。 – datenwolf 2011-06-09 14:37:04

+0

我的意思是系统内存。但是,是的,我也意味着逐渐上传很多小块,同时一次上传所有小块。 – raRaRa 2011-06-09 14:42:09