跳转到内容

材质与Shader导出

  • 入口MaterialFileMetarialUitls.WriteMetarial
  • 格式LAYAMATERIAL:04.lmat
  • 查表配置MetarialPropData.json

本节是总纲——先按 shader 名查到映射配置,决定后续映射方式。 WriteMetarialmaterial.shader.nameMaterialPropsConfigs:查到就按配置导出;查不到时:未启用自定义 Shader 导出则跳过该材质,启用则转交自定义 Shader 导出

实测 Ellen_Body_MatStandard,配置把它映射为 Laya 的 PBR 材质类型:

Unity 材质检查器

导出前 · Unity: Standard shader,反射率 / 金属 / 法线 / 发射(HDR 青色)等贴图槽与参数。

导出后 LayaAir 材质

导出后 · LayaAir: type 变 PBR,反照率 / 法线 / 自发光 / 遮挡 / 金属光泽贴图,金属度 / 光滑度 / Alpha 测试阈值齐全。

映射剔除 / 混合 / 深度等渲染状态到 Laya 字段。 写入 s_Cull(剔除)、s_Blend / s_BlendSrc / s_BlendDst(混合因子)、alphaTest + alphaTestValuerenderQueuematerialRenderMode。普通材质(本页主题的 Standard/PBR 等)的混合因子经 GetSrcBlend / GetDstBlend 把 Unity 的 _SrcBlend / _DstBlend 整数值用 switch 逐项映射到 Laya 的混合枚举。(自定义 Shader 与粒子材质走另一条按枚举名映射的路径,不在此处。)

将配置中的各贴图槽映射到 Laya 字段并导出。 遍历配置的贴图槽,material.GetTexture(uName) → 导出 TextureFile → 加入 textures 数组(带 layaName)。内置资源贴图跳过unity_builtin_extra 等);法线贴图标 isNormal。平铺偏移走 tillOffset 写 Vector4。

普通颜色直接写入;HDR 超亮颜色分解为颜色 + 强度两部分。 普通颜色直接写 rgba;HDR 颜色(如自发光)分量 > 1,超出 0–1 范围,于是 DecomposeHdrColor 把它拆成压缩颜色 + 强度两部分:颜色分量先按最大分量缩放、再夹到上限 0.749k_MaxByteForOverexposedColor),并经 LinearToGammaSpace 转到 Gamma 空间后写 rgba;强度是按最大分量反算得出(1 / scaleFactor不等于 Unity 强度滑杆的原值),单独写到 hdrName(如 u_EmissionIntensity)。

转换示意:Unity HDR 颜色 RGB(0,143,191) 强度 2 —(DecomposeHdrColor)→ 压缩颜色(≤0.749,Gamma 空间)+ 反算强度 = Laya 自发光颜色 + 强度分离。

Unity HDR 自发光颜色选择器

导出前 · Unity:「发射」(Emission) 的 HDR 颜色选择器——颜色 RGB(0,143,191),强度滑杆 = 2,颜色超亮。

导出后 LayaAir 自发光颜色与强度

导出后 · LayaAir: 拆成**「自发光颜色」(青)+「自发光强度」**两个独立字段——HDR 分解完成。

逐个映射 float,部分带条件规则按情况切换取值来源。 material.GetFloat(uName) → 写 layaName。支持 rule 条件改名:如材质有 _MetallicGlossMap 贴图时,光滑度改为从 _GlossMapScale 读取(Laya 端字段仍是 u_Smoothness,变的只是去 Unity 材质取值的属性名)。isGamma 标记的值经 LinearToGammaSpace 转换。

按材质实际特性追加宏开关。 下面三类来源各自对应一种触发条件:

来源触发条件
floatValue某 float 等于指定值 → 加宏
TextureValue某贴图存在 → 加宏(如有法线贴图 → NORMALTEXTURE
keyWorld某 shader keyword 启用 → 加宏

天空盒作为特例单独导出,生成 .cubemap 而非仅 .lmat 场景天空盒材质若是 Skybox/6 Sided,走 WriteSkyMetarial:把 6 个面的贴图写入一个 .cubemap 文件,材质 .lmat 的 type 为 SkyBox,引用该 cubemap。

Unity 天空盒 Shader支持导出去向
Skybox/6 SidedWriteSkyMetarial.cubemap(6 面)+ SkyBox 材质
Skybox/Procedural普通查表 → SkyProcedural(SkyTint / GroundColor)
Skybox/Panoramic普通查表
Skybox/Cubemap当前版本未支持单张 Cubemap 天空盒导出 → 跳过,不生成 cubemap

6 面天空盒材质

导出前 · Unity: Skybox/6 Sided 材质,Front / Back / Left / Right / Up / Down 六个面贴图。

LayaAir 中的天空盒

导出后 · LayaAir: 6 面合成的 .cubemap 在场景中渲染出天空,右侧为 cubemap 属性。


本页基于插件 1.1.7 源码与实测整理。