2.0 KiB
2.0 KiB
2026-10-13 工作日志
修复:toon 材质所有模型联动、无法单独设基础纹理
问题:shader/toon_apply.gd 用 material_override = toon.tres 把同一个共享 ShaderMaterial 实例挂给所有 MeshInstance3D,导致
- 改
toon.tres影响全部模型; 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,无法自动语法校验。