Skip to main content

贴图与材质

既然我们已经有了模型,那现在也是时候为模型表面添加一些细节了。此类操作需要通过 materials(材质)实现,materials(材质)可以应用于模型的表面,并且可以将一个着色器,一个或多个纹理结合在一起。

 

创建 materials(材质)

要创建一个 materials(材质),请在项目选项卡中右键单击,然后选择 Create > Material。默认着色器是 Standard Shader(标准着色器),它是一种基于物理的着色器,也被称为 PBR 着色器

 

Post Processing(后处理)

在深入了解 PBR 着色器 之前,我们应该先在场景中设置 post processing(后处理)。此操作可以通过 VRWorldToolkit 轻松实现。在顶部菜单栏中点击 VRWorld Toolkit > Post Processing > Setup Post Processing,然后单击 OK 即可。默认设置应该是足够理想的,但如果您想进行更多的调整,我建议您首先阅读 Silent 的这篇指南

 

获取材质

您可以前往 ambientCG 网站寻找您喜欢的木地板纹理,记下它的大小尺寸(我们稍后会用到)。

请确保纹理尺寸为正比,因为非正方形纹理可能会需要更多的处理步骤,优化程度更低,压缩效果也不理想。

找到并下载 1K PNG 格式的纹理文件,然后进行解压缩。

接下来在 project(项目窗口)中创建一个名为 _materials 的新文件夹,将解压缩后的文件拖入创建好的 Unity 文件夹内进行导入即可。

 

PBR 着色器

本章节会是最深度涉及理论的课程,因为理解 PBR 着色器的工作原理是制作正确、美观的材质的必要条件。只使用一个 PBR 着色器便可以确保所有材料都应用一致的光照,就像现实生活中一样。PBR 基于真实的物理原理,所以要理解 PBR,您必须了解光在现实世界中如何与物体表面相互作用。

取色器(color picker)

当光线照射到表面时,一部分被反射,一部分被材料吸收。反射的光线使物体可见,而被吸收的波长则决定了表面的颜色。您可以通过点击 albedo(有时也称为 diffuse 或 base color)的 取色器(color picker)来设置基本颜色。

在 取色器(color picker)窗口中,红色、绿色和蓝色通道位于底部。上方则是取色器 UI,其中上下方向控制色值,左右方向控制饱和度,周围的轮盘则用于控制色调。然而,这种设置存在误导性,因为当您增加饱和度时,色值会随之减少。更令人困惑的是,色值减少的程度取决于色调,其中黄色是最亮的,蓝色是最暗的。此处视频 更详细地介绍了这个问题,需要时常注意。

specularity(镜面反射)参数

下一个参数是 specularity(镜面反射),它决定了光线在表面上的反射方式。100% specular(反射)的表面会将所有击中它的光线以相同角度进行反射。而另一个极端就是 diffuse reflection(漫反射),光线将会在材质随机内部反弹,然后反射至随机方向。

在 shader 展开栏中,您会看到一个标准(standard)着色器和一个标准光滑度(standard specular)着色器。这两种着色器对PBR的应用方式不同,因为金属和非金属(即电介质)之间有着截然不同的属性。电介质通常没有镜面反射成分,而金属通常没有漫反射成分。镜面反射工作流程给了艺术家更多的控制,但也允许创造在物理上不可能的材质。因此,(metallic workflow)金属工作流程通常更简单、更直观;在使用具有 specularity(镜面反射)贴图的材质时,建议使用(metallic workflow)金属工作流程

Smoothness(平滑度)参数

标准(standard)着色器 上还有另一个参数:smoothness(平滑度),此滑块控制反射的清晰度。许多材料,如许多金属,可能都具有很强的反射性,但反射仍然可能是模糊的。这由于表面上许多微小的缺陷造成,虽然肉眼看不见,但仍然影响光线的反射角度。

fresnel(菲涅耳)参数

PBR 的另一个关键组成部分是(fresnel)菲涅耳,它会自动应用;一个表面与光线所处角度越大反射得更多。此外,对于透明表面来说(如水在湖面上),视线在垂直于表面时 透射性 最大,在平行于表面时 反射性 最大。您可以在 spherical material previews(球形材质预览)中轻松看到菲涅耳效果。

地板材质实践

现在让我们将 albedo(反射率)纹理映射到材料的正确位置上。您可以看到纹理是如何平铺在表面上的,但如果我们引入一个2米高的胶囊作为玩家参考,木板看起来会显得太小。因此,为了获得正确的平铺比例,我们需要根据从纹理源网站获取的尺寸(单位:米),使用计算器计算出1除以这些尺寸的值,将其填入材料中的 X 和 Y 平铺参数,从而得到正确的比例。

diffuse(漫反射)/ albedo(反射率)贴图

在寻找纹理时,您会看到 diffuse(漫反射)albedo(反射率)两种类型的纹理,它们都应该被放入 Matreial(材料)的基础颜色通道。两者的区别在于:漫反射纹理包含了无方向性的阴影信息(例如由于裂缝而难以照射到的区域),而反射率纹理则将所有阴影信息移到 AO(环境光遮蔽)贴图中。这样做的好处是材料可以根据光照变化做出响应,例如在照射手电筒时也能正确呈现。

让我们将 AO(环境光遮蔽)贴图添加到 Matreial(材料)中。为了确保其正确显示,请在 Project(项目窗口)中选择纹理,并在Inspector(检查窗口)中取消勾选"sRGB(颜色纹理)"选项,因为 AO 贴图是灰度纹理。

Normal Map(法线贴图)

大多数表面都展现出细节,这些细节在几何层面难以很好地再现。这就是法线贴图的作用所在。将其放入适当的插槽中,单击"修复现在"按钮,您应该能看到材料呈现出更好的立体感。法线贴图通过改变每个纹理像素中光线反射的角度(也称为法线矢量)来实现这一效果。

法线贴图中的每个像素都表示一个向量,其中红色表示水平,绿色表示垂直,蓝色表示深度。法线贴图中的"默认"蓝紫色表示50%红色,50%绿色和100%蓝色,这表示相应表面照明角度没有变化。

Height Map(高度贴图)

Height Map(高度贴图)用于在 Matreial(材料)中模拟深度。这也应该设置为非 sRGB,与 AO 贴图类似。当我们应用它时,我们应该能看到材料发生变化,但可能看起来有些不太自然。这是因为Unity中使用了一种称为"视差映射"的技术来近似展现它们,但当以锐角观看时它会出现断裂。通常我也不将强度设置得很高,无论是默认的 0.02 还是更低。

 

Reflection(反射)

我们讨论了很多关于反射的内容。您可能注意到,木地板的反射看起来并不十分准确,反而像是反射了天空。这是因为物体的反射设置采用了默认的天空盒。要更改此设置,请在层次结构中右键单击反射探测器,并进入"照明">"反射探测器"菜单。

反射探测器本质上是一个 360 度相机,可以捕捉其周围的球形视图。得到的图像称为立方体贴图,用于物体的反射效果。

将反射探测器放置在房间的中央位置。在检查器窗口中的反射探测器组件下,应该有两个按钮。首先单击左侧的"边界"按钮,这将设定反射探测器影响的范围。而右侧的"探测器原点"按钮则用于设置反射探测器的捕捉位置。

窗户材质实践

现在让我们为窗户制作材质!创建一种新材质,将其命名为玻璃,并将其拖到窗户上。将渲染模式更改为透明,选择阿尔贝多颜色窗口,并在RGBA通道下减小A通道到0。A通道代表透明度,它控制透明度。现在将平滑度增加到最大。现在我们有了一个可以透过的窗户!请注意,如果您增加金属性或高光,透明度会降低。请记住,增加高光不仅会减少基色,还会降低透明度。

要理解的下一个重要概念是材料槽。每个多边形都分配有一个材料,材料槽是网格的一部分。当您单击对象时,可以在检查器窗口的底部看到分配的材料。

 

material slots(压缩纹理)

为了确保每个访问者能够顺利下载纹理文件,我们应当始终选择对纹理进行压缩。为了实现这一点,您可以在检查器中单击纹理文件,然后选中 crunch compression 选项。这样一来,您的纹理文件将会变得更小,虽然会有一些压缩失真(但并不会引起任何人的注意或关注)。接着,您可以点击 Android 图标,并选中“覆盖 Android 设置”。在格式选项下,选择 RGBA 压缩 ASTC 6x6 块(这种压缩算法可以确保我们的纹理在 Quest 上显示效果不会太糟糕。或者,您也可以选择 4x4 块来获得更好的压缩效果,不过文件大小会稍大一些)。此外,我们还需将两个平台上的最大纹理大小进行调整,这将最大程度地影响世界的下载大小。

除了上述设置外,还有一些其他的调整是我们应该进行的。在“高级”选项下,勾选 流式传输Mip地图(这是 VRChat 所必需的),将过滤器改为 三线性 ,并将 Aniso 级别调整为 8。接着,点击右上角的滑块图标跳转到检查器(即在问号气泡和三个垂直点之间的位置),以创建一个预设。这样一来,从现在开始导入的每个纹理都将遵循此预设的设置(除了从 UnityPackage 导入的纹理)。

此外,您还可以使用 VRWorldToolkit>Quick Functions>Mass Texture Importer,在其中一次性调整场景中的所有纹理。在世界构建完成后,您可以通过进入 VRWorld Toolkit>World Debugger>Build Report,查看所有资产按文件大小从大到小排列的报告,以便更清晰地了解世界中的各种纹理。

可惜的是,Unity 的标准着色器不支持直接插入粗糙度贴图。粗糙度贴图可以在材质中提供不同的平滑度,增加现实感(例如,在潮湿的道路上会有水坑,水坑会显得很光滑,而道路则不会)。Unity 仅支持将平滑度贴图(即光泽贴图的反面)作为金属或透明度纹理的 Alpha 通道。实现粗糙度贴图的方法有很多种:

  • 使用不同的着色器,如 Autodesk Interactive(或 Moochie 标准、Silent Filamented 等其他社区着色器,这将在后续课程中介绍)
  • 使用插件,如 SmartTexture,将粗糙度贴图打包到透明度或金属纹理中,检查颜色反转并使用亮度(在使用时存在崩溃风险,不要忘记保存!)
  • 使用图像编辑软件,如 GIMP,为透明度或金属纹理创建 Alpha 通道和图层蒙版,反转粗糙度贴图,复制并粘贴为 Alpha 通道,最后导出。

image.png

这个木纹纹理就是一个很好的例子,展示了平滑度贴图在不同材质之间的差异;需要注意的是,钉子具有较高的光泽度和光滑度,而木材具有较少的光泽度和变化的中间光滑度,这与纹理的颗粒相匹配。

 

UV

在 UV 窗口和 UV 缝合方面,单击 ProBuilder 选项卡中的UV编辑器。UV坐标告诉网格如何将纹理投影到面上。在 UV 编辑方面,ProBuilder 会为您完成大部分工作,但最重要的是了解如何进行UV缝合。要执行此操作,请在打开 UV 窗口的情况下,单击场景视图中的某个面,然后按住 Shift 并单击另一个相邻面。通过这样的操作,UV 将缝合在一起,使纹理在面之间连续无缝。

现在您可以探索其他纹理来装饰房间,然后进入下一个阶段:照明!