This commit is contained in:
2026-10-13 19:39:58 +08:00
parent ed1a9949c8
commit a1d7007241
4 changed files with 79 additions and 15 deletions
+25
View File
@@ -0,0 +1,25 @@
# 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,无法自动语法校验。