APP下载

使用Covermap实现地形细节

消息来源:baojiabao.com 作者: 发布时间:2024-05-20

报价宝综合消息使用Covermap实现地形细节

最近把以前的文章翻出来发到知乎上,有几位朋友都比较关注我提到的Covermap效果,此文对Covermap的使用进行小结。整理资料时去百度Google搜寻了一下Covermap这个关键词,发现它并不是在游戏引擎中常见的术语。这个词沿用于我们的自研引擎中的Covermap技术,使用一张颜色纹理覆盖在地形表面,可以简单理解为一种对地形的偏色。后来我们在Unity专案中使用这种技术,用于实现地形的明暗及纹理细节,扩充套件于草地和其他场景物件上。

1、对Covermap的理解

常见的地形制作都是使用Heightmap+Splatmap来实现地形和纹理层混合的效果。

我们使用Covermap主要是为了解决地形细节不够,地形和草的光照问题。在地形上叠加一张Covermap,从顶检视对映到地形表面,增加地形的表现细节。

2、Covermap的Shader实现

由于草的本身不受其他光照影响,它的着色基本上就是一个diffusecolor,所以,以草的Shader为例来介绍一下Covermap的Shader实现。

我们需要宣告两个引数,一个引数_Covermap用于纹理的取样,预设颜色为“gray”灰色。将预设颜色定义为灰色,是因为可以在灰色的基础上进行叠亮或减暗。

另一个引数_CoverMappingRect是为了设定Covermap的对映范围,方便在世界座标中做对齐。预设为(0,0,512,512),如果我们建立的地形大小为512,座标在[0,0,0],那么Covermap的纹理会准确的对映在地形上。如果地形有偏移,我们需要将偏移的值设定给_CoverMappingRect引数。

在返回颜色值时,只需要简单的乘上Covermap纹理的颜色,也就是*_Covermap_var.rgb*2。这里的乘2是为了将灰色转为1,预设的Covermap颜色为灰,即*_Covermap_var.rgb*2 = 1,不会对最终效果有任何影响。如果Covermap纹理贴图上的颜色值>0.5,那么最后显示的颜色会变亮,<0.5,最后显示的颜色会变暗。建议Covermap在Gamma空间下制作,线上性空间使用时勾选sRGB。

从上面的实现来看,Covermap在Shader里的运算很简单,它的开销就在于对Covermap纹理贴图的取样,和两次乘法运算。Covermap纹理贴图的精度不超过1024的情况下,一般不会有太大的效能影响。

Covermap的原理和技术实现都很简单,我们将它应用于游戏的效果表现中,最重要的还是美术流程上的制作过程。

我们把Covermap的制作流程划为地形制作流程的一部分,在WorldMachine的地形制作流程中增加光照方位、水纹等输出纹理,然后在Photoshop中通过图层合并。

上图演示了从WorldMachine中输出Covermap的图层细节的例子。首先我们需要调整光照的方向与游戏场景中的灯光方向一致,得到一张有光照方向明暗关系的图,用于调整Covermap的光照。然后可以补充一些其他细节,以水纹为例,从侵蚀效果中得到水纹细节图,用于增加Covermap的细节。

上图可以看到Covermap的制作层级,我们会在灰色的背景图上新增不同的图层,这些图层是通过地形的高度资讯得到的选区。我们需要选出背光面叠加背光灯颜色,选出受光面叠加主光源的颜色,然后还可以增加一些纹理和路面的区域和偏色调整。

一般的制作思路都是地形直接参与光照烘焙,但是当地形尺寸达到1024的级别时,一般会出现两个问题,一个是烘焙耗时,一个是对地形做切分优化后烘焙会有接缝。我们想用Covermap来取代地形的光照烘焙,所以在专案的某个阶段我们在3dsMax中烘焙一张阴影图。还有前文说到的草是不受任何光照的,所以草地也需要其他物件的阴影细节。

制作的流程是这样的:

我们将场景物件和地形一起汇出,在3dsMax中模拟一盏场景同角度的灯光,然后新增一个摄像机进行对位,渲染出一张阴影图。将阴影图叠加到Covermap的最后一层。

如果要使用实时阴影,就需要储存两张Covermap进行切换,一张是不带max投影的。而对于草地,使用带max投影的Covermap即可。

下图可以看到最后应用在地形上的效果:

2019-11-17 09:52:00

相关文章