2

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

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

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

  1. 将VB和IB上传到GPU很慢吗?当数据上传到 GPU 时,播放器会注意到闪烁吗?

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

任何有关此概念的信息将不胜感激。

谢谢!

4

1 回答 1

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. 您上传内容的方式对渲染性能没有影响。但是,它会影响加载地图本身所需的时间。如果您希望玩家能够在没有烦人的加载阶段的情况下穿越大世界,您将不得不按需上传较小的补丁。

于 2011-06-09T13:56:37.613 回答