跳转到内容

37. 表面和材质

约 50 分钟 难度:进阶 动手章

第 9 章用 Albedo 给地板换了个暖灰色。换完一看,是「灰色塑料」,不是「灰色石头」。差别在哪里?

塑料表面光滑均匀,反射规整。石头有起伏、有划痕、有缝隙阴影。靠近看时这些细节让眼睛知道:这是真表面,有重量、有触感。

PBR(Physically Based Rendering,基于物理的渲染)通过几张配合的贴图把这些细节表达出来。这一章把 PBR 的几个通道一次铺开。

一份完整的 PBR 材质通常包含 5–6 张贴图,每张管一件事:

贴图用途颜色空间
Albedo(基础色 / Base Color)表面的「干色」,无光照下的纯颜色sRGB
Metallic金属度。0 = 非金属,1 = 纯金属Linear
Smoothness(粗糙度反向)表面光滑度。Unity Standard Shader 用 Smoothness(高=滑),有些 Shader 用 Roughness(高=粗)Linear
Normal Map表面凹凸的「假浮雕」,让平面看起来有细节Linear(重要)
Occlusion(AO)环境光遮蔽。模型缝隙、凹陷处自动变暗Linear
Height(可选)真实位移或视差贴图Linear

表里「颜色空间」一栏:sRGB 是按人眼感知校正过的存储刻度,适合存「颜色」;Linear(线性空间) 是物理刻度,适合存金属度、粗糙度、法线方向这种物理量。导入贴图时 sRGB 勾错(颜色图不勾、物理量图勾上)会让烘焙后的画面整体偏色,是新人最常遇到的「不知道为什么颜色不对」的原因之一。

不是每个 Material 都需要全套。最低配置 Albedo + Smoothness 就能用。要做出像「真的有材质」的效果,通常加 Normal Map 是性价比最高的一步。

第一节:用 Normal Map 让平面变粗糙

Section titled “第一节:用 Normal Map 让平面变粗糙”

Normal Map(法线贴图)记录的是「这个表面上每一点的朝向」。同一张平面 Mesh,配上 Normal Map 后光照会按贴图里的朝向算明暗,看起来像有凹凸。

注意是「看起来」。模型几何上还是平的,玩家从极近距离贴上去看,仍然能看出是平面。但在正常视距下,Normal Map 能把一面光秃秃的墙变成「砖墙」。

第 9 章那个 Mat_Floor_WarmGray 现在还是纯色塑料感。给它加一张 Normal Map:

  1. 找一张 wooden plank 木地板的 PBR 贴图集。免费来源:CC0Textures(ambientcg.com)、Poly Haven(polyhaven.com)。下载 1K 或 2K 分辨率的「木地板」材质包。
  2. 解压会得到一组贴图,命名通常类似:
    • WoodFloor_color.jpg(Albedo)
    • WoodFloor_normal.jpg(Normal)
    • WoodFloor_roughness.jpg(Roughness)
    • WoodFloor_AO.jpg(Occlusion)
  3. 把这组文件拖到 Unity 的 Assets/Textures/WoodFloor/
  4. 选中 WoodFloor_normal.jpg,Inspector 里 Texture Type 要改成 Normal map,然后 Apply
  1. 选中 Mat_Floor_WarmGray,Inspector 里:
    • Albedo 槽拖入 WoodFloor_color.jpg。这一步会覆盖之前的纯色,Albedo 显示成贴图。
    • Normal Map 槽拖入 WoodFloor_normal.jpg。它出现在 Normal Map 字段后面。
    • 调一下 Normal Map 强度(默认 1)。0.5 弱化效果,2 加强。
  2. 把 Smoothness 调到 0.4 左右(木地板比石头光滑,但比金属粗糙)。

放回到房间里,开个全局光,地板现在不再是均匀塑料,而是有木纹纹理 + 微妙凹凸的木地板。

地板贴图通常是 1m × 1m 的小块。一块 8m × 8m 的地板上贴一张 1 米的图,会被拉伸成马赛克糊掉。

Material Inspector 底部有 Tiling 字段,默认 1, 1:把它改成 8, 8,贴图在 X 和 Y 方向各重复 8 次,1 米一格的纹理跟世界尺度对得上。

注意 Tiling 改的是材质,不是物体。同一个材质用在不同尺寸的物体上时,Tiling 会按 UV 重复。如果想让某个特定物体用不同 Tiling,要单独做一个材质副本。

Offset 是贴图起点的偏移。一般保持 0, 0。在两块相邻地板有明显接缝时,给其中一块改一点 Offset,能错开接缝。

Occlusion(环境光遮蔽)让模型缝隙、凹陷处自动变暗。木地板的板缝、砖墙的缝、衣服的褶皱,没有 Occlusion 就显得平。

用法:

  1. 选中 Mat_Floor_WarmGray
  2. Occlusion 槽拖入 WoodFloor_AO.jpg
  3. 旁边的 Strength 默认 1,可保留。

进世界看,地板的板缝处现在有了一点点变暗的感觉,不再是平面贴图。

很多免费 PBR 包里 Occlusion 不单独提供,而是被打包到一张 ORM 图(Occlusion + Roughness + Metallic 三通道一张)。Unity Standard Shader 不直接支持 ORM,要用 URP(Universal Render Pipeline)或者社区 Shader。这时候选其中之一:

  • 把 ORM 拆成三张图(Photoshop 或 GIMP 拆通道)。
  • 换成支持 ORM 的 Shader。

实务上 VRChat 项目大多还在用 Built-in Render Pipeline(内置渲染管线),所以拆通道更稳妥。

第三节:Smoothness 决定金属还是布料

Section titled “第三节:Smoothness 决定金属还是布料”

第 9 章铺过 Smoothness = 0.25 当墙、0.4 当地板。这一章拆细:

物体MetallicSmoothness备注
油漆墙00.1较粗糙的乳胶漆墙
石头00.05几乎看不见反光
木地板(哑光)00.3
木地板(清漆)00.7反射明显
玻璃00.95Metallic 也是 0
抛光金属10.85高反射
哑面金属10.4工业金属
布料00.05
皮革00.2

这是经验起点,不是金科玉律。具体材质值得自己拨着试,每改 0.05 就 Build & Test 进去看一眼,几次之后会形成自己的直觉。

Metallic = 0 的非金属物体,反射是「环境光的灰白部分」(无色彩反射),很普遍。Metallic = 1 的纯金属物体,反射会带 Albedo 的颜色(金的反射偏黄、铜的反射偏红)。中间值(0.30.7)现实里很少出现,避免使用。

玩家走到墙边贴脸看时,1K 贴图被放大到几乎一比一像素,会糊成一片色块。Detail Map(细节贴图)解决这件事:在 Albedo 之上叠一张高频细节贴图(细小划痕、布料纹理、墙面颗粒),按比 Albedo 高得多的 Tiling 重复。

Standard Shader 里 Secondary Maps 区域:

  • Detail Albedo x2:细节色。
  • Detail Normal Map:细节法线。Tiling 设到 10 或更高。
  • Detail Mask:用一张遮罩控制 Detail 出现在哪些区域(不需要时全白即可)。

Detail Map 的好处:用一张小贴图(512×512)就能让大面积墙在近距离看起来仍有质感,不增加多少内存。

实际项目里 Detail Map 不是必需,但加一张会让贴脸观感提一档。

Unity 自带几种 Shader:StandardStandard (Specular setup)Unlit,加上 URP 的一组。VRChat 世界对 Shader 没有强制限制(除了 Quest,下面会讲),但实务上常见的几类:

最稳的入门选择。所有 PBR 输入都有,能跟 Lightmap、Light Probe、Reflection Probe 配合。

适合:第一次做 VRChat 世界,所有材质先全用 Standard,搭出来再考虑要不要换。

Unlit 系列不接受光照,物体表面颜色就是 Albedo(不带阴影、不带反射)。适合:发光招牌、UI 屏幕、纯装饰物体(Cube 当背景占位)。

社区里基于 Unlit 改的卡通 Shader(Toon Shader)多得是,最有名的几个:

  • lilToon:日本社区主流,免费开源,参数极多。
  • Poiyomi:avatar 圈最流行,世界也能用,免费。
  • Silent’s Filamented:注重 PBR 准确性,少参数。

这些都属于社区 Shader,不在官方支持范围内,但 VRChat 世界默认允许使用(PC 版本)。

VRChat Mobile Shader(Quest 强烈建议)

Section titled “VRChat Mobile Shader(Quest 强烈建议)”

Quest 平台对 Avatar Shader 有严格白名单;对世界而言自定义 Shader 在技术上仍然可用,但移动 GPU 上性能/兼容性风险很大,官方文档也建议默认走 VRChat 自带的 Mobile 系列。在 Inspector 里 Shader 下拉菜单选 VRChat/Mobile/...

  • VRChat/Mobile/Diffuse:最简单,Albedo + 烘焙光。
  • VRChat/Mobile/Bumped Diffuse:加 Normal Map。
  • VRChat/Mobile/Standard Lite:简化版 PBR。
  • VRChat/Mobile/Lightmapped:专为烘焙世界设计,性能最好。

PC 平台不强制 Mobile Shader,但用 Mobile 也能跑(性能更好)。

实务起点:

  1. PC only 世界:Standard Shader 全套,需要发光物体用 Standard 的 Emission(不切 Unlit)。
  2. PC + Quest 世界:PC 版用 Standard 或社区 Toon,Quest 版用 VRChat Mobile。两套 Material 要分开维护。
  3. 极致性能 PC 世界:直接全用 VRChat Mobile,PC 端绰绰有余。

Project 面板选中一张贴图,Inspector 顶部一组关键字段:

Texture Type Default / Normal map / Sprite ...
sRGB (Color Texture) ✓ (只有 Albedo / Detail Albedo 勾,其他不勾)
Generate Mip Maps ✓
Mip Map Filtering Box (默认)
Anisotropic Level 1
Wrap Mode Repeat (地板 / 墙) / Clamp (UI / Decal)
Filter Mode Bilinear (默认) / Trilinear (有重复 + 远视距时)
Default
├─ Max Size 2048
├─ Format Automatic
└─ Compression Normal Quality
Android (Quest 标签)
├─ Max Size 1024 ← Quest 强烈建议 1K 上限
└─ Format ASTC 6×6 (默认即可)

几个常被忽略的字段:

  • sRGB:Albedo / Detail Albedo 勾上(颜色感知用 sRGB 空间);Normal / Metallic / Smoothness / AO 不勾(这些是物理量,要用线性空间)。
  • Generate Mip Maps:保持开。能避免远处贴图闪烁,运行时只多一点点内存。
  • Max Size:尽量小。512 能用就别用 1024,1024 能用就别用 2048。每翻一倍内存翻 4 倍。
  • Android 标签:单独设 Quest 平台的 Max Size 1K。

挑一个练习:把一面墙做成砖墙。

  1. 从 Poly Haven 或 ambientcg.com 下载 Brick Wall 的 PBR 包(1K 或 2K)。
  2. 把贴图导入 Unity,按上文的 Texture Type 设置。
  3. 新建材质 Mat_Wall_Brick:Shader = Standard,Albedo / Normal / Occlusion 全部贴上,Smoothness 0.15,Metallic 0,Normal 强度 1.5
  4. Tiling 设到 4, 3(让砖块尺寸合理)。
  5. 烘焙 Lighting(接第 36 章)。

烘焙完之后,墙面会有:

  • 砖缝处的暗角(Occlusion)
  • 砖块表面的颗粒细节(Normal)
  • 接受了房间的光(Lightmap)

把房间环境光降到很低(夜晚状态),单靠一盏暖色 Point Light 照过来,砖墙的纹理会显出强烈的明暗对比。这就是 PBR 的力量。

  • Albedo / Detail Albedo 勾了 sRGB
  • Normal / Metallic / AO 没勾 sRGB
  • 所有 Normal Map 的 Texture Type = Normal map
  • 所有贴图 Max Size 设到「够用就好」(不是默认 2048)
  • Quest 版本贴图单独设 Android 1K
  • 同一物体不混用 PBR Standard 和 Unlit(容易出色调割裂)
  • 重复使用的材质用同一个材质资产,不要复制十份

挑一个或几个改:

  • 一面墙做两个材质副本:一个只有 Albedo,一个 Albedo + Normal + Occlusion。烘焙完对比。
  • 把同一个材质 Tiling 从 1 改到 4 再改到 12,看墙面尺度感的变化。
  • 给金属球做三个 Smoothness 版本:0.20.60.95。在同一光照下对比反射感。