下面来看崖壁工具。
这个工具的目的是在大型地形表面上生成崖壁几何体,它作为地表之上一个具有更多细节的“皮肤”。
总览
这部分的演讲内容很大,所以我将给出这部分的总览:
以前的技术
以前:
这是一张FarCry5 的截图,在没有使用崖壁技术的情况下:
这是在地形上加了崖壁几何体之后:
那么这是怎么工作的呢?
工具的输入
在Houdini中,我们使用了地形的斜率属性,以它为起点。然后删掉所有斜率低于某一个阙值的表面。这就构成了我们崖壁的几何输入。
另外,这样做也很有趣。因为它也扮演一种玩家的视觉线索,它提示了玩家哪一种地形是太陡峭而无法走过的。而这个斜率就是我们用来生成峭壁的正确的阙值。
由于我们是从地形拿到mesh的,所以mesh自然会在斜坡上有拉伸,就像我们这里看到的:
我们通过remesh来得到一致的三角形。
地质分层
还有个有趣的现象我们想用这个工具重现:地质分层。
它们是岩石和土壤随着时间堆积而形成的,明显可见的水平线。
每个地层都有一个随机的厚度,它将为每个切片分配一个地层ID。地层ID可以用来随机化地层颜色作为一个调试试图,就像我们在这里看到的:
然后在编辑器中,我们也有用来控制地层角度的预设。用户将通过绘制在地形上的RGB输入来控制它们,Houdini将使用它来驱动地层角度参数。
结果是,我们得到了三个不同角度的地层线:
我们选择的角度是与我们的地形最匹配的。
但是就像看到的这样,地层的线条看起来太工整了,不自然。因此为了摆脱这种现象,我们做了一些别的事情来制造一些混乱。
所以首先我们生成一个噪声,用来将输入分成两组。为了得到更大的分块,我们的噪声将先产生在较低的分辨率上,随后再被转换到较高的分辨率上。
利用这个噪声,我们将崖壁分成两组,就像这样:
然后我们对两组分别使用了不同的Seed来运行地层工具,这样就打破了之前工整的地层线。
现在,几何体已经准备好来产生一些体积了。
形状
所以,每个地层都以不同的厚度挤出,然后使用组合的置换贴图进行位移。
在这个状态下,几何体仍旧有很高的面数,所以我们做了一步优化的操作,减少三角形数目。
然后,在导出之前,几何体也被分割成几个单独的mesh,精确来说就是每个Sector一个。这是为了更好地加载和streaming。下图每个颜色代表了一个Sector:
注意,我们实际上并没有在这一步对几何体进行切割。由于每个三角形都知道自己所属的Sector是哪个,所以我们就用这个信息来划分mesh。
以上就是崖壁的mesh部分。但崖壁工具还有其他很酷的功能。
着色
在继续之前,我需要解释一下我们的崖壁在游戏中是如何着色的。我们使用的我们称之为“崖壁着色器”。你们中的一些人可能已经看到了我的同事昨天关于FarCry5地形技术的演讲。如果感兴趣的话可以看看,应该能在Vault上找到。
不管怎样,这个着色器所做的是将物体渲染在与地形相同的Pass上。所以崖壁将使用它正下方的地形的纹理。所以如果我们在崖壁下面有草,则崖壁也会部分有草纹理。因此为了避免这种情况,我们需要确保挤出的崖壁的正下方也是崖壁纹理。
地形数据
出于这个原因,我们使用最终挤压出的崖壁mesh,来重新投射一些属性回地形上。
所以我们做出了崖壁mask,还转换了地层属性。
从我们刚刚传输的地层属性中,我们首先生成一个颜色层,它将在世界中创建出一种宏观的色调变化。
值得一提的是,这种颜色本来也可以存到崖壁mesh的顶点色上,但我们没有这样做,原因有两个:
- 首先,我们想要即便是在很远的距离上也保持住地形的颜色,而崖壁mesh在距离很远的时候是不会被加载的。
- 另外,我们也希望能尽可能地减少崖壁mesh的存储空间。
另外值得一说的是,我们已经有了一个“颜色修改层”在地形上,因此我们可以直接将颜色合并到这一层上。
崖壁侵蚀
然后,从我们转移到地形的崖壁mask中,我们通过运行流动模拟进一步对其进行扩展。 分散在崖壁表面的点会沿着斜坡向下流动,从而产生侵蚀效果。 侵蚀区域保留了原始地层颜色。
然后,使用这些侵蚀数据,我们还在地形表面上散布碎石。
它们会作为点云在之后导出给编辑器。
地形纹理
然后,我们从mask中生成地形纹理ID。
我们还使用噪声来混和两个不同的崖壁纹理,这么做的目的是为了摆脱纹理的重复平铺现象。
植物生长表面
工具的另一个特点是,我们可以在合适的崖壁表面上散布植被。
为了找出哪个表面是可行的,我们将朝上的表面分离出来,并简单地检查其上方向上是否有障碍物。
可以看下游戏中的效果:
导出
最后,这是导出到编辑器中的数据:
这是游戏中一些有趣的程序化生成崖壁的截图: