在我的引擎中,我使用在CPU上计算的Perlin噪声算法来创建无限地形。
创建地形的过程如下:
- 如果相机靠近卸载的补丁,请创建它
- 计算给定边界的513x513噪声阵列
- 计算法线,切线,双法线,索引
- 将数据传递给vbo
优点:
- 仅在需要时才需要渲染
- 容易发生碰撞
骗局
- 在3,1s(一个线程)中创建了缓慢的64513x513补丁。对于每个图块,约20ms的噪声产生,约25ms的顶点,法线,切线,双切线,索引。当摄像机快速移动时,用户会注意到瓷砖正在加载。
- 内存消耗???
现在我想知道如何通过在GPU上完全生成地形来加快速度,但是存在一些疑问:
- 如果着色器每帧都运行一次,难道这种计算能力会浪费一遍又一遍地计算噪声吗?可以通过将结果写入RBGA纹理中并随后在顶点着色器中进行置换来避免这种情况,但会增加内存使用量。另一方面,如果创建速度非常快,则只有可见的图块应保留在内存中。但是,分离缓冲区会导致gpu-cpu同步,这可能会使应用程序变慢(我对吗?)
- 如果地形只是由顶点着色器置换的平坦网格,则需要在CPU上执行相同的工作来计算给定点处的碰撞高度和法线。
- 这只是一个概念,但是为了加快所有速度,我考虑将网格投影到视口上,因此只使用了很少量的顶点。您认为这行得通吗?
我的最后一个问题是:
在GPU上创建无限地形的最佳/最快/广泛使用的技术是什么?
8
请注意,在GPU上创建地形将使执行碰撞检测,拾取检测或几乎任何类型的与地形的交互变得困难。
—
MichaelHouse
计算着色器(DX10或11)可用于在GPU上生成地形。但是正如Byte56所述,您将需要将值拉回GPU以便与之交互。msdn.microsoft.com/en-us/library/windows/desktop/...
—
UnderscoreZero
在GPU上创建地形对我来说是个坏主意。它可能会起作用,但我认为,如果仅在CPU端生成地形并将标准绘图内容发送到GPU,它可能会好一些。
—
本杰明·丹格·约翰逊
只是我的经验;我实际上是用aparapi做到这一点的,实际上使该死的事情起作用了。但实际上最终要比仅由CPU执行工作要慢。我认为是因为向/从gpu发送数据的开销。如果我没有记错的GPU才真正工作,如果相对于数据的大小计算为大(以及绝对值大)
—
理查德刺痛