跳转至

title: VRChat 材质与纹理优化 created: 2026-05-01 updated: 2026-05-01 type: reference tags: [vrchat, material, texture, atlas, shader, optimization]


🎨 VRChat 材质与纹理优化

纹理图集、贴图压缩、Shader 对比、通道打包、VRM 材质转换的完整指南。

1. 纹理图集(Texture Atlas)

原理

将多个独立小纹理合并到一张大纹理中,模型不同部分分配不同 UV 区域。

  • 核心优势: 大幅减少 Draw Call,触发 Dynamic/Static Batching
  • VRChat 限制: Quest ≤ 8 材质, PC ≤ 15 材质

标准工作流

  1. 拓扑准备: 确保合并模型的 UV 不重叠
  2. UV 排布: 按视觉权重分配空间(脸/上半身 50%+,鞋子/配饰 <10%)
  3. 材质统一: 所有子 Mesh 替换为 1 个共享材质
  4. 重绘/烘焙: 将原贴图投影至新 UV 上
  5. 导出: 检查图集尺寸(推荐 2048² 或 4096²,勿盲目 8K)

⚠️ 顶点解耦(关键避坑)

合并纹理时必须先复制顶点,否则共享顶点被多个 SubMesh 重复变换会导致 UV 爆炸:

❌ 错误做法:直接修改共享 UV(同一顶点被多次变换 → UV 范围膨胀到 10+)
✅ 正确做法:
  1. 按 SubMesh 独立遍历
  2. 使用 Dictionary<int, int> 映射原始索引 → 新索引
  3. 遇到新顶点:复制顶点数据 + 对该 SubMesh 做一次 UV 变换
  4. 遇到已有映射:复用新索引
  5. 合并新 Mesh

常用工具

工具 适用引擎 特点
Mesh Baker Unity 行业标准,支持 Mesh 合并、材质打包、法线/UV 烘焙(付费)
TexTools Blender 免费开源,UV 排布、纹理烘焙与导出
Modular Avatar Unity 非破坏性工作流,自动网格合并

2. 贴图压缩格式

PC 平台

格式 质量/体积 推荐用途
BC7 高画质,支持 8-bit Alpha ✅ Albedo/Alpha 贴图首选
BC1/DXT1 无 Alpha 或 1-bit 硬透明 低优先级贴图(鞋底、内部网格)
BC5/DXTnm 法线专用,去除 Z 轴通道 ✅ 法线贴图(体积减少 33%)

Quest 平台

格式 质量/体积 推荐用途
ASTC 6×6 画质优先 ✅ Quest 主流推荐
ASTC 8×8 性能优先 低优先级贴图
ETC2 老旧格式 ❌ 不推荐

| ASTC 6×6 | 画质优先 | ✅ Quest 主流推荐 | | ASTC 8×8 | 性能优先 | 低优先级贴图 | | ETC2 | 老旧格式 | ❌ 不推荐 |### ⚠️ sRGB 设置铁律 | 贴图类型 | sRGB 开关 | 原因 | |:---|:---|:---| | Albedo / Base Color | ✅ 开启 | 颜色数据需要 Gamma 校正 | | Normal | ❌ 关闭 | 法线数据是线性值,开启会发黑 | | Smoothness / Metallic | ❌ 关闭 | 灰度数据需线性空间 | | Emission | ❌ 关闭 | 发光强度需线性空间 | | Mask / AO | ❌ 关闭 | 遮罩/环境光遮蔽是线性值 |

❌ Crunch 压缩

Avatar 禁用 Crunch:大幅增加解压耗时与卡顿,严重影响加载与切换瞬间帧率。

3. Shader 对比

Shader 性能 核心特性 推荐场景
Unity Standard 🔴 极高 PBR 光照,功能冗余 ❌ 已淘汰,Draw Call 高
Poiyomi Toon 🟡 中高 动态光照、MatCap、视差、轮廓线、多 Pass PC 高质量 Avatar
LilToon 🟢 低 轻量二次元、MatCap、Emission 打包 Quest 首选
MToon (VRM) 🟢 极低 VRM 官方标准,纯二次元着色 ✅ 直接导入的 VRM 模型

Shader 优化铁律

  1. 关闭 Forward Add 额外光照通道(改为 1 个 Pass)
  2. 避免 GrabPass(截屏),极其消耗 GPU
  3. Quest 端关闭 Real-time GIReflection Probes 过度采样

4. 材质合并策略

场景 策略 原因
静态身体/衣物 ✅ 合并 无动态切换,可触发 Batching
物理骨骼部件 ⚠️ 谨慎 合并后 Bounds 变大,可能导致远处裁剪
透明度混合部件 ❌ 分离 透明渲染需独立排序,合并导致深度穿插
不同 Shader 部件 ❌ 分离 无法 Batch,导致渲染管线错误

通道打包(Channel Packing)

将多个灰度数据合并到单张贴图的 R/G/B/A 通道,减少纹理采样次数:

  • Emission 打包: 自发光强度存入 Albedo 的 Alpha 通道 → 省一张贴图内存
  • Mask 打包: R=金属度, G=高光, B=AO, A=透明度
  • 法线压缩: BC5/DXTnm 格式存储,去除蓝色通道(Z 轴可由 XY 计算)

5. VRM 材质转换注意事项

MToon 烘焙差异

  • Unity 的 GI 与 UniVRM 烘焙逻辑不同
  • 面部过暗/过曝 → 调整 Shading Grade Map 或关闭 Receive GI 意事项

MToon 烘焙差异

  • Unity 的 GI 与 UniVRM 烘焙逻辑不同
  • 面部过暗/过曝 → 调整 Shading Grade Map 或关闭 Receive GI### 法线翻转(Normal Flipping)
  • VRM 多使用 DirectX 规范法线
  • Unity 导入时勾选 Swap UVsFlip Y 可能导致法线朝内(模型变黑)
  • 解决: Inspector 勾选 Fix Normals,或 Blender 导出时启用 Y-Up + Apply Transform

UV 镜像与背面渲染

  • 原 MToon 依赖 Stencil 或特殊 Pass 渲染背面
  • 转标准 Shader 时背面会消失
  • 解决: 开启 Cull Off(双面渲染),或分离背面并翻转法线

轮廓线(Outline)兼容性

  • VRChat 对 Stencil 缓冲支持不稳定
  • 建议: 将 MToon 轮廓替换为 Vertex Extrusion(顶点外扩)Z-Offset 模式