凹凸贴图是什么?
我们首先来看low-poly(多边形数较少)mesh和high-poly(多边形数量较多)mesh之间的不同。首先,最明显的不同就是high-poly能够表现出更多细节,但high-poly有比较大的性能开销。有没有一种比较折中的办法使得我们既能够让mesh看起来细节更加丰富,同时多边形数量尽可能少呢?
这种方法就是bump mapping,使用了凹凸贴图,可以在多边形数量较少的情况下,也能表项出较多的表面细节,性能上根更具优势。
在凹凸贴图中,有两种主要使用的贴图类型:法线贴图和高度贴图(视差贴图)。
法线贴图(normal map)会在整个表面上设置法线的值,这些值会在shader中使用,最终呈现出一种效果是这个表面的片元(像素)是朝向了不同的方向,计算结果可以使得表面呈现出凹凸的样子。
高度贴图(height maps)中的数据表达的是mesh的每个像素的相对高度。
法线贴图和高度贴图能够在不消耗过多算力的情况下,使得物体表面的细节更加真实丰富。
使用法线贴图
在Unity中,点击模型,在Inspector中选则对应材质,进入材质的Inspector面板,可以看到一个Normal Map的属性。
在这个例子中,这个模型的Normal Map已经有设置了法线贴图文件了。我们将Normal Map设置为None,对比看看效果。
使用高度贴图
高度贴图中的数据表示了每个像素相对于mesh的高度。通常它是一个单通道(灰度)贴图,其中每个像素值表示了从mesh表面算起的相对距离。如果我们使用RGB图像作为高度贴图,shader只会读取G通道值作为相对高度值。
这里以一个例子来看高度贴图的效果。在场景中,新增了一个立方体,在例子中我们创建了一个Pavement的材质,设置了对应的Base Map,Metallic Map,Normal Map等。然后我们应用材质到这个立方体上,效果如下:
调节一下Height Map,对比看看效果: