Files
agame/.workbuddy/memory/2026-10-13.md
T
2026-10-13 19:39:58 +08:00

2.0 KiB
Raw Blame History

2026-10-13 工作日志

修复:toon 材质所有模型联动、无法单独设基础纹理

问题:shader/toon_apply.gd 用 material_override = toon.tres 把同一个共享 ShaderMaterial 实例挂给所有 MeshInstance3D,导致

  1. 改 toon.tres 影响全部模型;
  2. material_override 整包覆盖,丢失模型自带贴图,无法给单个模型设 base_texture。

方案:重写 shader/toon_apply.gd

  • 为每个 MeshInstance3D 的每个 surface 复制独立材质实例(cartoon_material.duplicate(),含 next_pass 描边的复制),通过 set_surface_override_material(i, mat) 逐面挂载。
  • 自动从 mesh.surface_get_material(i) 提取原始贴图(BaseMaterial3D.albedo_texture 或已有 ShaderMaterial 的 base_texture)写入各自的 base_texture。
  • 新增导出项:base_texture_override(手动指定单模型贴图,优先级最高)、use_original_texture、use_material_override(兼容旧整包模式,默认关)。
  • toon.tres 降级为"模板":脚本每次应用时拷贝其非贴图参数作为初值,之后各模型独立。

关键文件:shader/toon_apply.gd(uid 未变,场景引用 assets/test/test.tscn 仍有效) 相关:shader/toon.tres(基础 cel-shader + outline next_pass)、shader/cel-shader-base.gdshader、shader/outline.gdshader(outline 用 global uniform,全局限定)

修复报错:get_shader_uniform_list 不存在

  • 报错:Nonexistent function 'get_shader_uniform_list' in base 'ShaderMaterial'。
  • 原因:该方法属于 Shader,不属于 ShaderMaterial。
  • 修复:改为 cartoon_material.shader.get_shader_uniform_list()(先判空)。
  • 同时把 get_surface_override_material(mi.material_override) 返回的 Material 用显式 is ShaderMaterial 判断 + 声明式 var x: ShaderMaterial 赋值,避免隐式向下转换告警。
  • 环境:Godot 4.7,Forward Plus,config_version=5。本机未找到 Godot CLI,无法自动语法校验。