贴图纹理的种类
当前内容仍在翻译校对中,可能存在谬误。
程序员之间流行着这样一句谚语:程序员之间流行着这样一句话:“输入的是垃圾,输出也会同样是垃圾”。如果您不知道自己给着色器输入的参数是什么,如果您不知道自己给着色器输入的东西是什么,您最终也只会得到糟糕的效果。那么,标准的着色器支持哪些不同类型的贴图输入?它们各自的作用又是什么呢?让我们来找出答案!
漫反射/基础色(Albedo/Diffuse)
首先,让我们来谈谈基础色。基础色虽然听起来很“基础”,其实它非常重要,因为它是您的材质球的主要颜色来源!它在其他游戏引擎里可能被称为颜色、主色或漫反射贴图。或者更进一步来说,Albedo 的意思在于它提供了一个光线打在物品表面的时候,有多少光线会被反射,有多少不被吸收的指标。
注意这里的“不被吸收”,稍后您会发现它的重要性。
此外,我们还需要注意纹理颜色。请注意,这里所述的纹理颜色并不是贴图的颜色!这是一个重要却经常被忽视的内容——当您从Blender导出模型时,Blender通常会将对象的材质变成灰色。而当Unity加载模型时,也会将材质设为灰色,这会让模型的表面看起来更加暗淡!所以,每当您在Unity中加载新模型时,务必确保纹理颜色是白色且完全不透明。
译者注:所谓“纹理颜色”在此处只是为了区分于“贴图颜色”而单独更改。结合作者表达的意思来看,其指向的应该是模型的网格初次导入到 Unity 的时候,在赋予材质球之前,Unity 为模型自动覆盖的白色外观。
法线贴图(Normal Maps)
接下来,让我们谈谈法线贴图。法线贴图可以赋予材质表面与模型表面形状不同的额外细节。法线贴图可以为材质表面带来与模型的网格形状不同的额外细节。
也许您正在阅读这篇指南,可能对法线不太了解。也许您阅读到这里的时候,对法线贴图不太了解。不用担心,让我来解释一下!网格是由多个顶点组成的,模型的网格是由多边形组成的,而每个顶点是空间中的一个点,它们互相连接,组成了多边形。多边形不仅仅是空间中三个点所构成的形状,它们互相连接组成了多边形。多边形不仅代表了空间中三个点所构成的形状,它还存储着有关多边形的表面垂直于哪个方向的信息——也就是法线方向。这会直接影响模型接受光照的效果。不正确的法线会导致模型表面出现怪异的缝隙和形变,与我们的期望不符。正确的法线会让表面在必要的地方看起来柔和圆润,在其他地方硬朗锐利!
想象一个网格,现在请在您的脑海中想象一个多边形,它是一个简单的平面,您可以为它添加贴图使其表现出细节,但在继续对网格进行细分之前,它将只是一个平坦的面。但由于它本身只是一个平坦的面,不会表现出更多的细节。所以,有人想到一个好主意,通过贴图来调整表面法线,以增加更多细节。以增加细节。显然,相比于直接修改网格本身,直接修改贴图可以更加细致,直接修改贴图可以更加细致和灵活,这就是法线贴图的作用。
在Unity中,这些贴图在导入后需要以特殊的格式读取,这就是为什么您需要在导入法线贴图之后,需要进入检查器将其标记为法线贴图的原因。如果一个贴图被指定为材质球的法线贴图,却没有作为法线贴图导入,Unity 会显示警告。
如果您导入了来自其他游戏引擎的法线贴图,它的法线方向可能是反的。您可以通过观察凸起和凹陷的形状来判断它的方向是否正确。尤其是为 Unreal Engine 制作的法线贴图,它们通常是反向的。在目前版本的Unity中,一旦将贴图设置为法线贴图,您可以通过勾选“Flip green channel”选项来纠正它的方向。
如果您导入的资产没有包含法线贴图,不用担心,如果作者没有做,拿就意味着它不是必需的。在这里法线贴图更多是用于改进照明效果的细节。如果您需要,可以尝试自己生成它们。
有关法线贴图方向的更多详细信息,以及默认情况下哪些应用程序支持导出的表格。
镜面反射贴图和金属度贴图(Specular and Metallic Maps)
镜面反射贴图(又称:高光贴图)是一个复杂的话题。许多关于镜面反射贴图的文章都专注于讨论特定游戏或引擎处理它们的方式,以及它们所特有的妥协和简化。许多关于镜面反射贴图的文章都专注于讨论特定游戏或渲染引擎处理它们的方式,以及它们各不相同的妥协和优化。然而,有一点是明确的,有一点是共同的,镜面反射贴图可以用来制作闪亮光泽的效果。
在Unity中,这种效果由遵循PBR原则的两个组成部分定义。第一部分决定哪些区域吸收光线,类似于金属;或者反射光线,类似于纸张。这些信息存储在金属度贴图的红色通道中。另一部分则决定哪些区域具有平滑且反射的效果,另一部分则决定哪些区域平滑且反光,类似经过抛光的木材;反之则是粗糙的表面,或者粗糙,如生锈的金属。这些信息存储在金属度贴图的透明度中,被称为金属度和光滑度。
若用正确的术语来表达,像布料这样的非金属表面被称为介电质材质。打在它们表面的光线会在内部反弹,产生均匀的颜色——基础色光;相反的,由于金属材质具有导电的特性,可以反射撞击它的光子,并吸收未反射的光——最终产生镜面反射光。
这涵盖了金属度贴图的功能。但镜面反射贴图呢?相比于直接使用两个完整的颜色贴图,使用一个同时包含基础色和镜面反射颜色的贴图,以及一个更简单的贴图来定义哪些部分是金属,将会占用更多内存,尽管这样制作起来要容易得多。然而,金属度贴图无法很好地表示像布料或皮肤这样既非金属又非硬物的材料。因此,将镜面反射贴图视为定义特定类型的光泽的方式,而金属度贴图则仅定义某物是否为金属。这就是Standard和Standard(Specular)之间的区别。
在镜面反射系统中,材料的金属部分在镜面反射贴图的RGB通道中定义,而Alpha仍然保留用于光滑度。这需要更多的内存,但当简单的遮罩无法满足需求时,它是有用的。一个很好的现实世界例子是具有闪亮的薄金属线的表面,角度或远处看,它们会因纹理过滤而失去金属贴图的光泽。但使用镜面反射贴图,它们将保持适当的光泽。
然而,如果您向一个物体添加金属/镜面反射贴图,您会注意到带有镜面反射的区域变暗了。这是因为能量守恒。一个材料不能同时完全是非金属的和金属的——只能是其中之一,或者是两者之间某种状态。因此,处理另一个引擎制作的镜面反射贴图时,可能需要适当编辑以进行调整。
总结:
- 金属贴图在贴图的红色通道中存储一个开/关值,指定材料的部分是否是金属。材料的基础色用于指定镜面反射的强度。
- 镜面反射贴图直接在贴图的颜色(RGB)通道中存储一个表示镜面反射的颜色值。
- 光滑度、光泽度或表面粗糙度的数值反向存储在透明度通道中,无论是在金属模式还是镜面反射模式中。
参考文献:
- https://google.github.io/filament/Filament.md.html Google 将 PBR 与其 Filament 引擎结合使用的指南。它由谷歌工程师编写并更深入地探讨了该主题。
- https://academy.allegorithmic.com/courses/b6377358ad36c444f45e2deaa0626e65
- https://marmoset.co/posts/pbr-texture-conversion/
- https://www.sharetextures.com/textures/blog/physically-based_rendering/
- https://google.github.io/filament/Material Properties.pdf Google 的 PBR 材料参考图表。这是制作贴图时手头有用的参考之一。
遮挡、高度和发光贴图(Occlusion, Height, and Emission Maps)
遮挡贴图(Occlusion Maps)
接下来是遮挡贴图,这些贴图包含环境阴影,通常指那些光线无法直接到达的裂缝和缝隙,除非光线直接照射进去。
对于像道具和角色这样的单一模型,您可以使用Blender进行烘焙,但结果取决于您的模型比例和UV映射。对于重复的贴图,例如砖墙、地砖或甚至一些泥土,您可以从法线或高度图生成它们。
在标准着色器中,绿色通道用于遮挡贴图。
高度贴图(Height Maps)
高度贴图在Unity中用于提供“视差遮挡”效果。它们基于高度贴图和您的视角来移动贴图。使用这种效果的成本在Unity中相对较低,但需注意,从错误的角度观看可能导致显示错误,因此要小心,不要设置得太高。
在标准着色器中,红色通道用于高度贴图。
发光贴图(Emission Maps)
发光贴图用于定义模型的发光区域。如果您为灯制作材料,那么灯需要能够发光。然而,发光贴图必须单独制作,特别是未发光的部分必须是黑色的!错误设置发光贴图可能使您的模型看起来非常奇怪。发光贴图通过与材质的发光颜色相乘。
小提示:对于夜光效果,使用发光强度为1.0。对于明亮的发光,使用发光强度约为5.0。
细节遮罩(Detail Mask)
接下来是细节遮罩,它控制下一节中细节贴图的应用方式。在细节遮罩为黑色的地方,细节贴图不会被应用。这使您可以让细节贴图影响模型的某些部分而不影响其他部分。
在标准着色器中,蓝色通道用于细节遮罩。
细节贴图(Detail Maps)
细节贴图是Unity与基础基色结合使用的贴图。这非常方便,因为您可以为其指定不同的平铺系数,使得在较少细节的贴图上覆盖图案,使其看起来更加细致。在实践中这看起来是一个好主意,但实际应用起来相当困难。
默认情况下,标准着色器中的细节贴图通过将基色与细节贴图相乘并加倍结果来应用。简单来说,中灰色的细节贴图不会产生任何效果,白色会使主色变亮,黑色会使其变暗。
细节法线贴图的工作方式类似于细节贴图,但用于法线。一个例子是在墙上应用图案,使其在与材料的其他部分不同的尺度上看起来更粗糙,增加其变化效果。或者通过细节贴图提供的特征增加深度。
对于细节贴图,一个重要的选项是设置它们的UV通道。就像网格提供UV来告诉它们贴图的位置一样,标准支持使用第二个UV图 specifically 来在网格上添加细节。这允许您,例如,有一件衣服,主色只包含布料部分,然后细节贴图只包含一个标志的图案。使用标志图案作为细节贴图,并将次级UV通道映射到标志图案的贴图,您可以结合两种贴图,在模型的材质球上渲染出清晰的标志图案。
更多关于细节贴图的详细信息,请参考Unity文档。