Skip to content

ADR-069: 材质面板纹理支持审计与推进路线

日期: 2026-07-09 状态: 调研落档 — 材质面板当前仅支持 4 标量乘率,贴图槽位归 outfit,PBR 流延续 ADR-024 决策延期


背景

用户问「材质功能是否支持除颜色贴图之外的纹理(高光、法线等)」。审计 frontend/src/scene/manager/material.tsfrontend/src/menus/model-material.tsfrontend/src/outfit/outfit.tsfrontend/src/scene/render/renderer.tsfrontend/src/scene/manager/model-loader.ts,并 grep 全仓贴图槽位使用。

结论:当前材质面板(颜色维度)与 outfit(贴图维度)是 ADR-015 / ADR-020 共同确立的两套正交系统,有意为之,非 bug。本 ADR 落档审计事实并给出推进路线,不引入新决策


审计事实

1. 材质面板支持的维度(material.ts + model-material.ts

MaterialCategoryParams (L42-47) 仅 4 个标量:

字段类型语义对应 StandardMaterial 字段
diffuseMulnumber × 3(Color3 乘率)漫反射颜色乘率diffuseColor.r/g/b
specularMulnumber × 3高光色乘率specularColor.r/g/b
shininessnumber光泽度specularPower
ambientMulnumber × 3环境光乘率ambientColor.r/g/b

_OrigMat (L53-58) 备份同步也只有这 4 项。_applyAll (L285-319) 只写这 4 项,不读不写任何 *Texture 字段,不调 .level_captureinstanceof StandardMaterial 才备份。

UI(model-material.ts)三层菜单 buildMatBatchLevel / buildPerMatLevel / buildMatRootLevel / buildMatListLevel 全部只用 addSliderRow × 4无任何贴图控件

2. 贴图槽位走 outfit(outfit.ts

  • TextureSlotKey (L26-27) = 'diffuseTexture' | 'toonTexture' | 'sphereTexture' | 'bumpTexture' | 'emissiveTexture' — 5 槽
  • _collectSlotMappings (L55-60) 枚举:sm.diffuseTexture / mmdSm.toonTexture / mmdSm.sphereTexture / sm.bumpTexture / sm.emissiveTexture
  • 三层优先级 byMaterial > byCategory > all > 原始贴图,逐材质备份 _origTextures
  • arch §17 明确贴图替换归 outfit,颜色维度归材质面板 — 正交设计

3. renderer.ts 里的后挂反射

renderer.ts L470-525:启用时把 ReflectionProbe.cubeTexture 强转注入所有 PMX 材质 reflectionTexture,用 reflectionColor.set(intensity×3) 调强度。该路径未入 _origValues 快照、未进材质面板 UI、未关联 _capture,属全局后处理开关,非材质级。

4. 全仓 grep 结论

  • specularTexture | opacityTexture | ambientTexture | lightmapTexture | roughnessTexture | metallicTexture — frontend/src 零命中
  • 材质实例化只用 StandardMaterialMmdStandardMaterialoutfit.ts 通过 interface declaration 局部扩展
  • PBRMaterial / NodeMaterial / CustomMaterial / PBRCustomMaterial 实际 import 或实例化
  • model-loader.ts 通过 MmdStandardMaterialProxy 注入,babylon-mmd PMX 加载器自动把 PMX 声明的贴图塞对应槽位,但本项目 _capture 未备份这些贴图

用户语义对照表

用户问的「高光等」能否调原因
高光强度·色·光泽度✅ 能specularMul + specularColor + shininess
高光贴图 specular map❌ 不能StandardMaterial.specularTexture 全仓零使用,UI 未暴露
法线贴图强度✅ 能(P1)bumpTexLevel 已实现,范围 0-3
toon 贴图开关/替换⚠️ 仅通过 outfit 系统材质面板无 toon 感知,但 toonTexLevel 强度可调
sphere 贴图强度✅ 能(P1)sphereTexLevel 已实现,范围 0-3
自发光强度/颜色✅ 能(P2)emissiveMul + emissiveTexLevel 已实现
环境反射强度⚠️ 半能(renderer.ts reflectionColor.set)全局开关非材质级
粗糙/金属 PBR❌ 完全不能全仓只认 StandardMaterial,无 PBRMaterial

根因(3 条)+ P1/P2 解决状态

  1. ADR-015 锁死标量分类乘率模型 — ✅ P1+P2 已扩展:新增 emissiveMul 和 5 槽 *.TexLevel,与既有 4 字段完全同构
  2. 贴图替换归 outfit(ADR-020) — ✅ P1 的 *.TexLevel 与 outfit 正交不冲突;outfit 换贴图本体,level 调强度,两码事
  3. renderer.ts reflectionTexture 注入是后挂 — 未解决,维持全局后处理语义

推进路线(P0~P5)

延续 ADR-015 / ADR-020 / ADR-024 既有边界,不新立决策。

优先级项目状态改动量与既有系统关系默认推荐
P1贴图强度滑块(*.level✅ 已完成_origValues 备份 diffuseTexture.level / bumpTexture.level / toonTexture.level / sphereTexture.level / emissiveTexture.level,UI 加 level 滑块 — 与 outfit 不撞(outfit 换贴图本体,level 是强度)已实现
P2emissiveMul 颜色乘率✅ 已完成与现有 4 字段并列加一个,复用滑块位置已实现
P3specularTexture 开关+加载未启动PMX 不原生带,需 .mcupreset 自定义扩展;多数 MMD 模型用 sphere 代替高光低优先,等用户场景出现实际诉求再启动
P4自带文件替换贴图未启动中大与 outfit 撞,建议统一到 outfit 走临时 variant 路线不另起炉灶
P5PBR 工作流(roughness/metalness)未启动延续 ADR-024 延期决策 — babylon-mmd morph 绑死 StandardMaterial,未解不提上路线,等 babylon-mmd 支持 PBR material proxy

路线原则

  • 惰性推进P1/P2 是材质面板分内事,收益直接;P3~P5 全部等用户场景显性触发或上游依赖突破后再启动 — P1/P2 已完成,P3-P5 维持惰性原则
  • 正交不破坏P1 的 level 滑块与 outfit 换贴图本体互不冲突,outfit 换贴图后 level 仍可调 — 已验证
  • renderer.ts 反射:暂不纳入材质面板控制,维持全局后处理语义;若未来用户明确要求逐材质反射,再开新 ADR
  • PBR 不再独立评估:ADR-024 已给致命风险(morph 失效),本 ADR 不重复论证

三个拍板点(默认推荐)

  1. P1 贴图强度滑块 — ✅ 已完成
  2. P2 emissiveMul — ✅ 已完成
  3. renderer.ts reflectionTexture 纳入材质面板控制 — 默认推荐纳入;维持 ADR-024 的全局后处理语义更清晰,逐材质反射属另一层概念
  4. PBR 流(roughness/metalness)提上路线 — 默认推荐提;延续 ADR-024 延期决策,等 babylon-mmd 上游突破

不修改的文件

本 ADR 仅落档审计与路线,无代码改动


关联 ADR

  • ADR-015 材质编辑器 UI 重构 + 逐材质开关 — 标量乘率模型的源头
  • ADR-020 换装系统 — 贴图维度归属
  • ADR-024 渲染增强 Phase 2 — reflectionTexture 后挂路径 + PBR 延期决策(morph 致命风险)