在GPU上生成地形


9

在我的引擎中,我使用在CPU上计算的Perlin噪声算法来创建无限地形。

创建地形的过程如下:

  • 如果相机靠近卸载的补丁,请创建它
  • 计算给定边界的513x513噪声阵列
  • 计算法线,切线,双法线,索引
  • 将数据传递给vbo

优点:

  • 仅在需要时才需要渲染
  • 容易发生碰撞

骗局

  • 在3,1s(一个线程)中创建了缓慢的64513x513补丁。对于每个图块,约20ms的噪声产生,约25ms的顶点,法线,切线,双切线,索引。当摄像机快速移动时,用户会注意到瓷砖正在加载。
  • 内存消耗???

现在我想知道如何通过在GPU上完全生成地形来加快速度,但是存在一些疑问:

  • 如果着色器每帧都运行一次,难道这种计算能力会浪费一遍又一遍地计算噪声吗?可以通过将结果写入RBGA纹理中并随后在顶点着色器中进行置换来避免这种情况,但会增加内存使用量。另一方面,如果创建速度非常快,则只有可见的图块应保留在内存中。但是,分离缓冲区会导致gpu-cpu同步,这可能会使应用程序变慢(我对吗?)
  • 如果地形只是由顶点着色器置换的平坦网格,则需要在CPU上执行相同的工作来计算给定点处的碰撞高度和法线。
  • 这只是一个概念,但是为了加快所有速度,我考虑将网格投影到视口上,因此只使用了很少量的顶点。您认为这行得通吗?

我的最后一个问题是:

在GPU上创建无限地形的最佳/最快/广泛使用的技术是什么?


8
请注意,在GPU上创建地形将使执行碰撞检测,拾取检测或几乎任何类型的与地形的交互变得困难。
MichaelHouse

1
计算着色器(DX10或11)可用于在GPU上生成地形。但是正如Byte56所述,您将需要将值拉回GPU以便与之交互。msdn.microsoft.com/en-us/library/windows/desktop/...
UnderscoreZero

在GPU上创建地形对我来说是个坏主意。它可能会起作用,但我认为,如果仅在CPU端生成地形并将标准绘图内容发送到GPU,它可能会好一些。
本杰明·丹格·约翰逊

只是我的经验;我实际上是用aparapi做到这一点的,实际上使该死的事情起作用了。实际上最终要比仅由CPU执行工作要慢。我认为是因为向/从gpu发送数据的开销。如果我没有记错的GPU才真正工作,如果相对于数据的大小计算为大(以及绝对值大)
理查德刺痛

Answers:


2

好吧,如果我想尝试使用GPU来处理此类事情,我想我会选择执行compute / opencl / cuda。

但是,无论使用GPU还是CPU(实际上是我做的),我都会以异步方式进行操作,以决定当前帧需要一些新地形可能为时已晚(例如,考虑1000ms / 60 = 16.666ms,整个框架都希望适合)。

开始在辅助线程上生成(或从压缩文件加载)地形,并将其提供给游戏的其余部分,并在该工作者完成操作后进行渲染,通常这将是下一帧,或者可能是其后的帧,因此用户不会真正注意到那里的差异,但是可以使事情变得更顺畅。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.