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 材质
标准工作流
- 拓扑准备: 确保合并模型的 UV 不重叠
- UV 排布: 按视觉权重分配空间(脸/上半身 50%+,鞋子/配饰 <10%)
- 材质统一: 所有子 Mesh 替换为 1 个共享材质
- 重绘/烘焙: 将原贴图投影至新 UV 上
- 导出: 检查图集尺寸(推荐 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 优化铁律
- 关闭
Forward Add额外光照通道(改为 1 个 Pass) - 避免
GrabPass(截屏),极其消耗 GPU - Quest 端关闭
Real-time GI与Reflection 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 UVs或Flip Y可能导致法线朝内(模型变黑) - 解决: Inspector 勾选
Fix Normals,或 Blender 导出时启用Y-Up+Apply Transform
UV 镜像与背面渲染
- 原 MToon 依赖 Stencil 或特殊 Pass 渲染背面
- 转标准 Shader 时背面会消失
- 解决: 开启
Cull Off(双面渲染),或分离背面并翻转法线
轮廓线(Outline)兼容性
- VRChat 对 Stencil 缓冲支持不稳定
- 建议: 将 MToon 轮廓替换为 Vertex Extrusion(顶点外扩) 或 Z-Offset 模式