# 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,无法自动语法校验。