37. 表面和材质
第 9 章用 Albedo 给地板换了个暖灰色。换完一看,是「灰色塑料」,不是「灰色石头」。差别在哪里?
塑料表面光滑均匀,反射规整。石头有起伏、有划痕、有缝隙阴影。靠近看时这些细节让眼睛知道:这是真表面,有重量、有触感。
PBR(Physically Based Rendering,基于物理的渲染)通过几张配合的贴图把这些细节表达出来。这一章把 PBR 的几个通道一次铺开。
PBR 的几张贴图
Section titled “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 能把一面光秃秃的墙变成「砖墙」。
给地板加一张木纹 Normal
Section titled “给地板加一张木纹 Normal”第 9 章那个 Mat_Floor_WarmGray 现在还是纯色塑料感。给它加一张 Normal Map:
- 找一张 wooden plank 木地板的 PBR 贴图集。免费来源:CC0Textures(ambientcg.com)、Poly Haven(polyhaven.com)。下载 1K 或 2K 分辨率的「木地板」材质包。
- 解压会得到一组贴图,命名通常类似:
WoodFloor_color.jpg(Albedo)WoodFloor_normal.jpg(Normal)WoodFloor_roughness.jpg(Roughness)WoodFloor_AO.jpg(Occlusion)
- 把这组文件拖到 Unity 的
Assets/Textures/WoodFloor/。 - 选中
WoodFloor_normal.jpg,Inspector 里Texture Type要改成Normal map,然后Apply。
- 选中
Mat_Floor_WarmGray,Inspector 里:Albedo槽拖入WoodFloor_color.jpg。这一步会覆盖之前的纯色,Albedo 显示成贴图。Normal Map槽拖入WoodFloor_normal.jpg。它出现在 Normal Map 字段后面。- 调一下
Normal Map强度(默认1)。0.5弱化效果,2加强。
- 把 Smoothness 调到
0.4左右(木地板比石头光滑,但比金属粗糙)。
放回到房间里,开个全局光,地板现在不再是均匀塑料,而是有木纹纹理 + 微妙凹凸的木地板。
Tiling:让贴图重复
Section titled “Tiling:让贴图重复”地板贴图通常是 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 加缝隙阴影
Section titled “第二节:Occlusion 加缝隙阴影”Occlusion(环境光遮蔽)让模型缝隙、凹陷处自动变暗。木地板的板缝、砖墙的缝、衣服的褶皱,没有 Occlusion 就显得平。
用法:
- 选中
Mat_Floor_WarmGray。 Occlusion槽拖入WoodFloor_AO.jpg。- 旁边的
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 当地板。这一章拆细:
| 物体 | Metallic | Smoothness | 备注 |
|---|---|---|---|
| 油漆墙 | 0 | 0.1 | 较粗糙的乳胶漆墙 |
| 石头 | 0 | 0.05 | 几乎看不见反光 |
| 木地板(哑光) | 0 | 0.3 | |
| 木地板(清漆) | 0 | 0.7 | 反射明显 |
| 玻璃 | 0 | 0.95 | Metallic 也是 0 |
| 抛光金属 | 1 | 0.85 | 高反射 |
| 哑面金属 | 1 | 0.4 | 工业金属 |
| 布料 | 0 | 0.05 | |
| 皮革 | 0 | 0.2 |
这是经验起点,不是金科玉律。具体材质值得自己拨着试,每改 0.05 就 Build & Test 进去看一眼,几次之后会形成自己的直觉。
Metallic = 0 的非金属物体,反射是「环境光的灰白部分」(无色彩反射),很普遍。Metallic = 1 的纯金属物体,反射会带 Albedo 的颜色(金的反射偏黄、铜的反射偏红)。中间值(0.3–0.7)现实里很少出现,避免使用。
第四节:Detail Map:近距离细节
Section titled “第四节:Detail Map:近距离细节”玩家走到墙边贴脸看时,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 不是必需,但加一张会让贴脸观感提一档。
第五节:VRChat 里能用哪些 Shader
Section titled “第五节:VRChat 里能用哪些 Shader”Unity 自带几种 Shader:Standard、Standard (Specular setup)、Unlit,加上 URP 的一组。VRChat 世界对 Shader 没有强制限制(除了 Quest,下面会讲),但实务上常见的几类:
Standard(内置渲染管线)
Section titled “Standard(内置渲染管线)”最稳的入门选择。所有 PBR 输入都有,能跟 Lightmap、Light Probe、Reflection Probe 配合。
适合:第一次做 VRChat 世界,所有材质先全用 Standard,搭出来再考虑要不要换。
Unlit / Toon
Section titled “Unlit / Toon”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 也能跑(性能更好)。
项目内做选择
Section titled “项目内做选择”实务起点:
- PC only 世界:Standard Shader 全套,需要发光物体用 Standard 的 Emission(不切 Unlit)。
- PC + Quest 世界:PC 版用 Standard 或社区 Toon,Quest 版用 VRChat Mobile。两套 Material 要分开维护。
- 极致性能 PC 世界:直接全用 VRChat Mobile,PC 端绰绰有余。
第六节:贴图导入设置
Section titled “第六节:贴图导入设置”Project 面板选中一张贴图,Inspector 顶部一组关键字段:
Texture Type Default / Normal map / Sprite ...sRGB (Color Texture) ✓ (只有 Albedo / Detail Albedo 勾,其他不勾)Generate Mip Maps ✓Mip Map Filtering Box (默认)Anisotropic Level 1Wrap 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。
自己做一面砖墙
Section titled “自己做一面砖墙”挑一个练习:把一面墙做成砖墙。
- 从 Poly Haven 或 ambientcg.com 下载
Brick Wall的 PBR 包(1K 或 2K)。 - 把贴图导入 Unity,按上文的 Texture Type 设置。
- 新建材质
Mat_Wall_Brick:Shader = Standard,Albedo / Normal / Occlusion 全部贴上,Smoothness0.15,Metallic0,Normal 强度1.5。 - Tiling 设到
4, 3(让砖块尺寸合理)。 - 烘焙 Lighting(接第 36 章)。
烘焙完之后,墙面会有:
- 砖缝处的暗角(Occlusion)
- 砖块表面的颗粒细节(Normal)
- 接受了房间的光(Lightmap)
把房间环境光降到很低(夜晚状态),单靠一盏暖色 Point Light 照过来,砖墙的纹理会显出强烈的明暗对比。这就是 PBR 的力量。
一份发布前材质检查
Section titled “一份发布前材质检查”- Albedo / Detail Albedo 勾了 sRGB
- Normal / Metallic / AO 没勾 sRGB
- 所有 Normal Map 的 Texture Type = Normal map
- 所有贴图 Max Size 设到「够用就好」(不是默认 2048)
- Quest 版本贴图单独设 Android 1K
- 同一物体不混用 PBR Standard 和 Unlit(容易出色调割裂)
- 重复使用的材质用同一个材质资产,不要复制十份
自己改三组对比
Section titled “自己改三组对比”挑一个或几个改:
- 一面墙做两个材质副本:一个只有 Albedo,一个 Albedo + Normal + Occlusion。烘焙完对比。
- 把同一个材质 Tiling 从
1改到4再改到12,看墙面尺度感的变化。 - 给金属球做三个 Smoothness 版本:
0.2、0.6、0.95。在同一光照下对比反射感。