2. 纹理的种类
程序员之间有一句流行的谚语:“输入的是垃圾,输出也会同样是垃圾”。如果您不知道您正在向着色器输入什么,您只会得到垃圾的效果。那么,标准着色器支持哪些不同类型的纹理输入,它们各自有什么作用呢?让我们来找出答案!
漫反射/基础色(Albedo/Diffuse)
首先,我们有基础贴图。基础贴图看似平淡无奇,但非常重要。这是您的材质的主要颜色来源!您在这里放置的是其他引擎可能会称为颜色或漫反射图的同类纹理。进一步详细说明——Albedo(阿尔贝多)是一个衡量多少光线打在表面上被反射而不被吸收的指标。
注意“不被吸收”这部分,稍后您会发现他的重要性。
此外,我们有纹理的颜色。注意这不是一个纹理!但这里有一些重要而常被忽视的事情——当您从Blender导出模型时,Blender通常会将材料颜色改为灰色。当Unity加载模型时,它也会将材料中的颜色设置为灰色,使得材料显得更加暗淡!因此,每当您在Unity中加载一个新模型时,您应该确保材料颜色是白色且完全不透明的。
法线贴图(Normal Maps)
接下来,我们有法线贴图。法线贴图定义了材料表面与网格不同的细节。
如果您在阅读这个指南,您可能不知道法线是什么。让我为您解释!您看,网格是由顶点组成的,顶点是空间中的点,它们构成多边形。一个网格中的多边形不仅仅是空间中的三个点。它存储着关于多边形面向哪个方向的信息——法线。这决定了网格的照明。不好的法线意味着奇怪的缝隙和扭曲,与我们的预期不符。好的法线意味着在所有正确的地方看起来柔和且圆润,在其他地方则硬而尖锐!
想想网格面本身。您可以在一个平坦的简单平面上放置一个纹理,并覆盖它的颜色,但它底下仍然是一个简单的平面。所以,有人有了一个好主意,使用一个纹理来调整法线,覆盖它的细节。纹理可以比网格更抽象地细致,对吧?这就是法线贴图的作用。
在Unity中,这些在导入后存储在一种特殊格式中,这就是为什么您需要将导入的新法线贴图标记为法线贴图的原因。如果一个纹理被指定为法线贴图而没有作为法线贴图导入,Unity通常会显示警告。
如果您有来自另一个游戏引擎的法线贴图,它可能会有不同的方向。您可以通过观察一个轴上的脊状物看起来像凸起,反之亦然来判断。特别是为Unreal Engine制作的法线贴图总是反向的。在当前版本的Unity中,一旦纹理设置为法线贴图,您可以通过勾选“翻转G通道”选项来修正这一点。
如果您正在查看没有法线贴图的资产,不需要惊慌,因为如果您没有法线贴图,它并不是必需的。它只增加照明细节。如果您愿意,您可以自己生成它们:
有关法线贴图方向的更多详细信息,以及默认情况下,哪些应用程序支持导出的表格
镜面反射和金属贴图(Specular and Metallic Maps)
镜面反射贴图是一个复杂的主题。许多关于镜面反射贴图的文章都集中在讨论特定游戏或引擎是如何处理它们的,以及它们固有的特定折衷和简化。然而,有一点是清楚的,镜面反射贴图专注于闪亮的东西。
在Unity中,这种光泽由遵循PBR原则的两个组成部分定义。有一部分确定哪些区域是吸光的,比如金属,而不是反光的,比如纸。这存储在金属贴图的红色通道中。还有一部分决定哪些区域具有平滑且反射的表面,如抛光木材,而不是像生锈金属那样的粗糙表面。这存储在金属贴图的透明度中。这些属性被称为金属度和光滑度。
在正确的术语中,像布料这样的非金属表面被称为电介质。打在它们表面的光会在内部反弹,产生均匀的颜色;基础色光。另一方面,金属导电,因此反射撞击它的光子,并吸收未反射的光;产生镜面反射光。
这就涵盖了金属贴图。但等等,镜面反射贴图呢?事实证明,拥有一个同时包含基础色和镜面反射颜色的贴图,以及一个更简单的贴图来定义哪些部分是金属哪些部分不是,而不是拥有两个完整的颜色贴图会占用更多内存,这要容易得多。然而,金属贴图无法很好地表示像布料或皮肤这样既非金属又不硬的材料。因此,只需将镜面反射贴图视为定义特定类型的光泽的方式,而金属度贴图仅定义某物是不是金属。这是标准和标准(镜面反射)之间的区别。
在一个镜面反射系统中,材料的金属部分在镜面反射贴图的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文档。