PMX 风格化 PBR 烘焙原理¶
配置、规则注册、上下文和诊断命令见 API reference。
1. 工作方式¶
PMX 原始材质主要提供基础纹理、漫反射色、高光色和高光强度,并不直接包含完整的 PBR 纹理。KasugaLib 在客户端资源加载阶段执行一次预烘焙:
- 读取 PMX 材质的数值属性,生成自动转换参数。
- 依次应用 Java 注册规则和玩家 JSON 规则。
- 根据基础纹理的亮度梯度生成法线纹理。
- 生成符合当前 LabPBR/Iris 路径的 specular 纹理。
- 将基础色、法线和 specular 分别拼接到三个对应 atlas。
- 把结果写入磁盘缓存,后续资源重载优先复用。
自动参数¶
smoothness:由 PMXshininess映射得到。f0_code:由 PMX 高光颜色的平均值生成,自动值限制在 4–90,不会自动猜测金属。subsurface:默认 0。normal_strength:默认 0.08。emission:默认 0。
输出通道¶
法线纹理:
| 通道 | 内容 |
|---|---|
| R | 编码后的切线空间 X |
| G | 编码后的切线空间 Y |
| B | AO,当前为 255 |
| A | Height,当前为 255,即不启用视差高度 |
Specular 纹理:
| 通道 | 内容 |
|---|---|
| R | Perceptual smoothness |
| G | Dielectric F0 或 LabPBR 金属代码 |
| B | Porosity/SSS;非零 SSS 会映射到 65–255 |
| A | Emission |
法线采样在纹理边界使用 repeat/wrap,与 PMX 可重复 UV 的行为一致。
2. 材质变体、缓存与加载¶
独立材质变体¶
atlas 标识由“源纹理 + 最终 PBR 参数”共同决定:
- 相同源纹理、相同参数:复用同一个变体。
- 相同源纹理、不同参数:生成独立变体和独立法线/specular sprite。
- 同一 atlas 标识如果再次绑定不同源图或参数:立即抛出冲突错误,不再静默平均。
GPU、CPU 与缓存¶
- 首选在渲染线程通过离屏 framebuffer 和 MRT 一次生成法线、specular 两个输出。
- GPU shader 不可用时,本次会话自动切换到确定性的 CPU reference baker。
- GPU baker 的 GLSL 位于
assets/kasuga_lib/shaders/pbr/stylized_bake.vsh和stylized_bake.fsh。 - GPU baker 会显式保存、清零并恢复
GL_PIXEL_PACK_BUFFER、GL_PIXEL_UNPACK_BUFFER以及 pack/unpack 的 row-length/skip 状态。
加载性能¶
- 修复 PMX 顶点去重中的线性
indexOf查找,将大模型的近似 O(n²) 路径改为哈希索引。 - 不再把未使用的基础纹理副本重复放入 PBR atlas。
- PBR 磁盘缓存使用资源加载线程并行预取,只有未命中项才回到渲染线程执行 GPU 烘焙。
- 同一源图和 profile 的内容哈希会在一次加载中复用。
BufferedImage直接转换为NativeImage,不再先编码为内存 PNG 再解码。- CPU fallback 同时最多执行两个 bake,避免占满所有资源加载线程。
- 世界内资源重载采用分代发布:新模型先在后台构建,atlas 和 sprite 映射全部 ready 后再在游戏线程原子替换;重载期间暂停 Kasuga 模型绘制,并清理被替换模型的旧 backend instance。
烘焙发生在加载/重载阶段,不在每帧执行。通道的实际视觉效果取决于宿主与 shaderpack;多参数变体会增加 atlas 面积。算法或通道语义变化必须使旧缓存失效。