手把手教你在游戏引擎中实现地形系统 | GAMES104实录 - 现代游戏引擎:从入门到实践

本期为GAMES104《现代游戏引擎:从入门到实践》视频公开课文字实录第20期。本课程由GAMES(图形学与混合现实研讨会)发起,游戏引擎技术专家王希携手游戏引擎一线开发者共同研发。

课程共计22个课时,将介绍现代游戏引擎所涉及的系统架构,技术点,引擎系统相关的知识。为配合学习实践,课程组在 GitHub 上开源了小引擎Piccolo,上线1个月即获得了2900+star, 累计下载量已超过20000+。

以下内容为公开课视频转文字版本,为阅读通顺,有删减

01「地形的材质」

有了地形的几何表达之后,我们接下来就需要给地形上色,也就是材质处理。我们先从最简单的方法开始,首先,地形上覆盖的仍然是各种材质。我们在上一节课中介绍了各种各样的材质模型,这里我们使用MR(Metallic-Roughness)模型我们需要保存Base Color、法线方向、Roughness,而Metallic数值也作为Alpha通道的数值编码到Base Color的图片中,还有高度图需要保存。

如果需要将几种材质混合在一起,还需要一个Splatting贴图,即混合贴图,这个贴图的每个通道对应了一种材质的权重。我们可以通过艺术家画的一些笔刷将各种材质混合在一起。下图中的右下图虽然效果不佳,但很好地解释了什么叫做材质混合,这就是最简单的材质混合效果。

这种混合将每个材质渲染的结果按照Alpha混合方法混合在一起,这种方法其实是有问题的。因为在真实的世界中,各种材质是按照一定的逻辑混合在一起的。比如下图中从沙子逐渐向石头过渡时,如果使用阿尔法混合,就可以看到一个很柔和的区域,但这种效果并不真实,因为看起来就像在石头上蒙了一层沙子,而沙子浮在了石头缝上,这和我们真实观察到的情况不一样。比如右图中的石头和草丛,在草和石头过渡的地方,草会先从石头缝中间蔓延过去,而不会直接长在石头上面。

聪明的图形工程师们想出了一个技巧,即利用我们之前存储的高度场纹理,在两种材质过渡区域中,如果发现需要混合两种材质,就使用物体的高度对权重进行调整。比如某种物体高度高一些,权重就下降得慢一点。而如果物体的高度较低,那么权重就会很快降低。这样就能够实现沙子好像入侵到石头中,但又不会长在石头上的效果。大家如果仔细看下图,就会发现,图中的效果比前面的效果自然了很多。

我们通过一个简单的高度比较,就能够形成上图中的效果。这个效果也有一个问题,即这种效果在两种颜色的切换(也就是两种材质间的切换)是一个01切换。这种01切换在近处看问题不大,但当相机发生移动时,这种切换可能会变成高频信息,会产生很多抖动。当我们位于远处以很低的视角观察这个地形时,切换位置的分界线处会显得比较突出,这时我们仍然可以通过一定的技巧进行处理,即我们可以为高度值添加一个偏移(Bias)。在上节课中,我们介绍阴影的时候就介绍过,很多问题都可以通过添加一定的偏移(Bias)来解决。这里我们加上了0.2的扰动,在数学上,当两种材质的加权高度差小于0.2时,我们就不使用01切换,而使用各自的权重进行插值。这样在过渡区域还是会有一点点颜色的混合,看起来也比较自然,而且混合效果看上去也会更稳定。

这是一种比较常见的纹理Splatting算法,大家自己写代码时,可以尝试一下对不加偏移和加偏移的两种效果进行一下对比,这两种效果还是有区别的。我们在课件中也提供了原作者的原文链接,大家可以参考一下,其实就是几行简单的Shader代码。

在实战中,纹理Splatting处理起来没有上述那么简单,因为我们介绍纹理Splatting时只在三四种材质之间进行混合。而在真实的游戏中,动辄就是几十种甚至上百种材质。在现代GPU中,我们使用纹理数组(Texture Array)来存储这些纹理,即将所有的颜色纹理打包成一个数组。

大家可能听说过两个特别容易混淆的概念,一个叫做3D纹理,一个叫做纹理数组。同学们经常会将这两个概念混用,但这两个概念是有区别的。

对于3D texture来说,当我们在对其进行采样时,在当前的mipmap精度下,我们需要对其上下左右前后八个点进行采样。我们可以理解成采样需要落在一个XY平面上,而3D纹理还有一个Z坐标,当我们对任意点进行采样时,Z坐标可能不会精确地落在每一层的纹理上,而是需要对Z坐标的上一层的四个点进行采样,然后进行双线性插值,而对于下一层的四个点,也得进行采样,并进行双线性插值,然后对这两个插值的结果再进行一次插值,这样才能得到我们需要的纹理值。所以3D纹理的采样是一个三线性插值,因此采样的消耗很大。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值