GPU Pro2 - 3.Procedural Content Generation on the GPU
这篇文章着重介绍了基于Brownian 噪声和高度图在GPU中实时生成和渲染无限大地形系统。
Procedural content generation (PCG)程序化生成在许多游戏中已经有广泛应用,从简单的随机物体摆放,到全自动生成武器,建筑或者AI等等。PCG在计算机图形学中最基本的应用之一就是基于高度图的地形生成。
现如今已经有许多不同的实时地形生成技术,大多数是利用过程化生成噪音去创建高度图。目前最新引人的技术是模拟1/f 噪音(called “pink noise”),因为这种噪音在自然中普遍存在,而且便于在现代gpu中实现,并且有很好的表现和速度。在这篇文章里,我们决定使用近似的不规则Brownian motion(fBM)(布朗运动)算法。
该方案使用了光谱混合(spectral synthesis,我也不知道咋翻译),计算了多层级噪音,最基础的噪音生成算法是Perlin噪音。尽管柏林噪音的实现已经完全依赖于GPU,但是由于其他的过程化生成算法,该算法依然不够快,因此我们采用了一个可以根据自身需要而进行配置的系统。
将地形分成多个正方形node(node的数量必须是高度图大小的出书,以避免生成后出现错误),将摄像机初始置于最中间,每个临近最中心node的四个node(上下左右)拥有边界碰撞体,当摄像机和其中任意一个发生碰撞时,新的高度图就会生成。基于摄像机的碰撞方向和碰撞体的位置,我们可以得到新的噪音UV坐标。这个操作和高度图生成算法保证了地形将是连续且无尽的。
比如下图:原先在中心,向左移动后于左侧node发生碰撞,根据碰撞位置,重新计算出与左侧node相邻的新的node信息。
该算法也利用了LOD系统,因为我们知道所有node的相对位置,所以可以提前计算出index buffer中的相关信息。中间的node最接近摄像机,所以应该有最低的LOD等级,也就是更多的三角形面片数量展示更多细节。
另外我们还模拟了侵蚀效果,最简单的侵蚀效果类型是thermal erosion,它是由于温度变化导致的。这个侵蚀算法通过迭代,利用附近点的高度计算出地形点的高度,该算法的实现用了两个pass,第一个pass计算出材质中需要移动到附近点的顶点数量,第二个pass中通过第一个pass提供的信息计算出实际效果。
地形中的树植被系统的实现分两个步骤,第一步生成树的密度图,它定义了树的布置信息。下一步,根据该信息实际渲染树的mehs。地形中的高度和坡度信息对生成树是最常用的参数,这两个信息可以由高度图和法线图轻松的得到。通过这两个信息以及一些我们自定义的参数,我们就可以生成地形中树的密度图。
有了密度图之后,我们不能直接将他用于在地形中生成树的植被,因为密度图可能对应非常巨大的世界空间,如果直接每个texel生成一棵树,那结果有可能植被会非常稀疏。因此,我们为每个类型的树设置了半径这个参数,代表这颗树会占多大地儿。我们的解决方法是将当前的patch根据这个patch中最大的那棵树的半径划分成gird,通过从密度图中取出的值以及占地空间两者一起决定出如何渲染树。通过摄像机的裁剪和LOD等技术,再加入Rayleigh-Mie atmospheric scattering我们就完成了地形系统的渲染。
概况下整个流程:
碰撞触发需要生成新一部分地形 -- 生成噪音 -- 计算erosion,生成高度图 -- 生成法线贴图 -- 生成树的密度图--生成树的真正位置信息--渲染场景