贴图原理与作用

什么是贴图?为什么渲染一个物体要贴那么多层贴图?他们都是起的什么作用?

什么是贴图

物体是三维的,但物体的表面是二维的,所以我们可以使用图片来铺满物体的表面,图片上的每个点跟物体表面上的每个点一一映射,这个图片就叫颜色纹理或者叫 UV 贴图。根据这种映射关系,计算机就可以从颜色纹理当中,找到坐标点的颜色信息映射到三维物体表面某个点上去。颜色纹理保存的就是每个点的 RGB 颜色。

但是三维物体表面的细节,不仅仅只是有颜色,可能还需要包括物体的其它特性:金属度、粗糙程度、透明程度、凹凸感等等。那么这些材质和几何信息该如何表达呢?

如果能够把这些信息以类似颜色纹理的形式保存成一个贴图的话,就可以同样的通过 UV 布局去映射到物体的表面。

我们可以把从 0 到 1 渐变的数值区间,用从黑到白渐变的颜色区间把他们对应起来,这样参数滑条当中表示的某一个数值,就可以用从黑到白当中的某个灰度值来表示。

21345f2fa1f2164102647d40b5107492.png

然后在纹理空间中,每个 UV 坐标点的灰度,以图像的形式存储在贴图当中。计算机就可以根据贴图的灰度,对应的计算出相应三维座标点的材质参数值,并且渲染相应的材质效果。

常见的物体表面特性与灰度图的关系如下所示:

  • 纹理贴图:表示表面的颜色和纹理图案,用于增加表面的细节和视觉效果(不一定是灰度图)。
  • 光滑度贴图:表示表面的光滑度,黑色表示最粗糙,白色表示最光滑。
  • 金属度贴图:表示表面的金属度,黑色表示非金属,白色表示全金属。
  • 透明度贴图:表示表面的透明度,黑色表示完全不透明,白色表示完全透明。
  • 高度图/凹凸贴图:表示表面的凹凸不平程度,黑色表示最低点,白色表示最高点。
  • 法线贴图:表示表面的法线方向,用于模拟高精度几何细节,增加真实感(不是灰度图)。
  • 环境光遮蔽贴图:表示表面在环境光遮蔽下的亮度变化,黑色表示最暗,白色表示最亮。

为了更简明的说明这个关系,我们可以在 Blender 中新建一个纹理,用一个黑白对比明显的函数纹理:棋盘格。棋盘格纹理的灰度值不是 0 就是 1,没有 0-1 中间的灰度值。在人眼看来,棋盘格是一张黑白交错的图像,但计算机看到的是一个 0101 的数值矩阵。

edbbf66917fb60a01f567551a1e5f595.png

同一张棋盘格图片,当我们将其作为不同类型的贴图来使用时,渲染出来的效果也是不一样的。

颜色-粗糙度.jpg

示意图 1:纹理贴图效果/粗糙度贴图效果

颜色-金属度.jpg

示意图 2:纹理贴图效果/金属度贴图效果

下面我们再来看一个具体的木质纹理贴图例子。

木质纹理.png

如上图所示,左侧球体是渲染后的结果,它有彩色的木纹图案,有高光,如果放大看还能看到表面的粗糙度。这其实就是右侧四张贴图综合表现的结果!不同于刚刚的棋盘格,一张贴图已经不能满足不同特性的渲染了,所以每个特性需要有一张自己的图。

可是刚刚我们说的不是灰度图吗,为什么法线贴图是蓝紫色的??

这是因为法线贴图是一种特殊的贴图,它存储的是物体表面法线的信息,法线贴图中的颜色值表示法线向量在三个分量上的值,而不是颜色本身。

如下图所示,物体表面一个点的法线(紫色线段)是一个三维向量,包含了三个分量 (T,B,N),无论紫色线如何变化,都可以使用切线空间中的 TBN 三个向量来表示(线性代数),法线贴图存储的就是 TBN 的值。

3454c30496a84b8478a4c9ae989997d3.png

三个值使用灰度图就不好存储了,所以我们换了个方式,把三个向量对应到 RGB 颜色值上来存储。法线的取值范围是 -1~1,RGB 取值范围 0~255。当法线没有偏移时候,RGB 对应的值为 (127,127,255),是一种蓝紫色,有偏移时会偏红或偏绿,所以法线贴图普遍为稍微带点红绿色的蓝紫色图片。

f2691efcc6d3ee7455322192818b323b.png

其实其他几种贴图也可以使用彩色图来表示,但是灰度图就已经够了,没有必要增加计算量。

常见的起凹凸作用的贴图

一共四种:凹凸贴图、法线贴图、位移贴图、AO 贴图

人眼的成像也是二维的,那大脑是如何判断物体表面的凹凸的?答案是阴影!

6b1dbd2c574de068c4c6637e923a7133.png

比如上面这幅图(左侧),感觉上有很多凸起的圆和三角结构,这是因为在这些结构右下方的部分变暗了。而我们生活的世界多数光源比如说阳光、灯光都是来自斜上方,所以只要把这一部分变暗,即使它只是一个二维的平面图像也会让我们产生凹凸的感觉。

现在我把这幅图,旋转 180 度(上图右侧),这样感觉上原来凸起的部分,恰好就变成凹下去的。产生这种变化的原因,还是因为阴影的位置。所以只要给出一个高度值,让计算机计算出因高度变化而产生的法线改变,进而根据光线的方向和法线的夹角,自动计算出哪些区域需要变暗,就可以在平滑的面上模拟出凹凸感,这也就是凹凸贴图的基本原理。

最开始人们使用凹凸贴图通过记录相邻点之间的高度差,来模拟凹凸感的,所以也叫“高度图”。高度图通常使用灰度图像来表示,每个像素值表示该像素所在位置的高度值。为了将高度图转化为凹凸贴图,可以通过计算相邻像素之间的高度差来计算出法线向量,然后根据法线向量和光线的入射角度计算出光照强度。但由于凹凸贴图只存储了高度信息,因此无法准确地模拟表面的细节,而且需要较高分辨率的高度图才能获得较为真实的效果

为了解决这些问题,后来的凹凸贴图改用法线贴图来表示表面的凹凸感。法线贴图存储了表面每个点的法线向量,可以更加准确地模拟表面的细节,并且相对于高度图来说,法线贴图需要的存储空间更小,处理速度更快

textures_height_map.png

左:法线贴图;右:高度图

d230e62b3fe90dbc685253498d685da3.png

法线贴图示意

凹凸贴图和法线贴图都是通过扰动法线,在视觉上产生凹凸的假象,并没有使物体表面产生真正的凹凸。如下图所示,当把物体放平或在球体上渲染时,凹凸感消失了。

96ae3c93553dbf125a13a25683e35e8d.png

这时候就该位移贴图 (displacement mapping) 出场了,位移贴图可以让物体表面的点的位置移动一个距离,产生真正的凹凸。

05327a95f4752172a42b79d44ea8cf3d.png

位移贴图原理示意

位移贴图改变了网格中的顶点位置,每个点的位移量由位移贴图中的灰度值决定,位移贴图和凹凸贴图一样也是高度图,用灰度值保存位移的距离也就是高度差,所以也可以直接使用凹凸贴图进行置换。

4c70df24b54db7fe0513a7610507f853.png

各类贴图表现对比,左起:基本模型、凹凸贴图、法线贴图、位移贴图

接下来说说环境光遮蔽贴图。在现实世界中,光线在通过空气和其他物体时会受到散射和吸收,因此物体表面受到的光照不是均匀的,有些区域会比其他区域更暗。

环境光遮蔽就是用来模拟这种效果的技术。它通过检测物体表面上每个点周围的遮蔽情况来计算该点受到的环境光照强度。具体来说,它通过发射多个光线来检测该点与周围物体之间的遮蔽情况,从而计算出该点的环境光照强度。环境光遮蔽通常用于实时渲染中,可以使场景看起来更加逼真。它可以用于模拟各种不同的环境光照条件,如室内、室外、阴天、晴天等。

在贴图中,环境光遮蔽通常被称为 AO 贴图(Ambient Occlusion Map),它是一种基于物体表面的几何形状信息计算出的灰度图像。AO 贴图中,黑色表示物体表面上的点周围有很多遮蔽物,而白色则表示该点周围没有遮蔽。灰度值的深浅程度表示遮蔽的程度,越浅越少遮蔽,越深则越多遮蔽。

57e1178f1cab642302534ed0c8bb57e3.png

使用了 AO 贴图的场景(右),物体连接处呈现出环境光遮蔽效果

在渲染过程中,AO 贴图会和其他贴图一起被应用到物体表面上。AO 贴图可以用于增加物体表面的细节,使其看起来更加真实。同时,AO 贴图也可以用于计算阴影,因为它可以提供物体表面各点之间的遮蔽情况,可以用来计算出阴影的强度。

参考

  • B 站 - 小昕讲堂
  • https://www.blend4web.com/doc/en/textures.html