当物体表面并非是纯色的时候,比如带波点,斑纹或者表面有刮痕或被裂纹等,这些效果该如何实现呢?
这里我们需要提到一个概念是贴图(Maps)。Maps是覆盖在游戏物体上的2D图片,用来设置表面的颜色、specularity或metalness、物理纹理或其他相关属性。包含maps的图片文件称为纹理(Textures)。
纹理是什么
纹理(Textures)可以看做是普通的图像文件,比如BMP,TIF,PNG和JPG。图像文件中的数据通过通道(channels)进行组织。黑白图像(也称为灰度度,grayscale image)只有一个通道来表示每个像素的灰度值。彩色图像一般需要RGB三个通道,每个像素使用RGB值来表示具体的某种颜色。还有一些图像文件格式会使用四通道:RGBA,A表示alpha,用来调节透明度。
图像文件中的通道数据可以看做是数字矩阵。在材质中,这些数字可以表示颜色或透明度之外的其他属性,比如smoothness,specularity或metalness,甚至是顶点的法线信息等。
艺术家们通常通过Blender、3DMAX等3D建模软件来创造他们的3D模型,这些软件也能够生成模型所需的纹理文件。我们也可以使用普通的2D图像文件当做纹理来使用,如下图所示:
查看纹理文件属性
我们可以点击一个纹理文件,然后在其Inspector面板中查看其属性。
其中Texture Type可以选择纹理的类型,比如法线贴图、2D精灵、UI元素、光照贴图等。Texture Shape是贴图形状,可以是2D平面、2D平面数组,也可以是Cube或3D的。另外,在底部预览窗口中,可以选择纹理的单个通道比如R/G/B来看单个通道的值。
另外,可以双击纹理文件,其效果就和我们在资源管理器中双击打开图片文件一样,会使用图片预览器或PS等软件来打开图片(取决于图片的默认打开方式)。
当我们在材质窗口中,将我们的纹理拖动到了Inspector的Base Map左边的方框中后,还可以设置Base Map的颜色,这样可以得到纹理原始颜色和所选颜色的叠加的效果,如下图:
Tiled Textures
在材质的Inspector面板中,可以看到Surface Inputs下有Tiling和Offset两个选项。
Tiling决定了mesh表面上会重复多少次纹理,这个值越高,我们的纹理就重复地越多,单个纹理看起来也就更小。
Offset决定了我们从纹理的哪个位置开始应用到物体表面上。比如X设置为0.5表示从纹理的一半宽度的地方开始tiling。
这两个值在Editor中可以根据需要自行设置,如下图,我将Tiling设置为5,Offset设置为X=0.5,Y=0.5,效果如下:
UV贴图
对于一些简单的形状如球体或长方体,纹理映射到物体mesh的哪个位置似乎不会影响很大。但对于其他复杂的物体就不是这样了。比如对于一个人形角色的身体来说,其表面上可能会有皮肤,衣服,这些所有的东西都在一个材质中。此时如果纹理映射的位置不正确,则角色就会看起来非常奇怪了,比如该是耳朵的地方,显示的却是眼睛(刻意而为除外^_^)。
当在建模软件中创建3D模型时,软件会生成上面所提到的纹理,生成的过程称为UV映射(UV mapping)。3D建模软件如Blender,Maya,3DMax等,会生成UV坐标的2D坐标集。UV坐标和普通的2D空间的XY坐标是类似的。UV坐标和mesh有关系,而和场景中的3D空间无关。
UV映射表示的过程是将3D模型的表面展开到一个平面,并将2D纹理贴图到这个平面上。在这个过程中,建模软件生成要被重新包裹到模型上的纹理的UV坐标。