You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Godot中MeshDataTool.commit_to_surface调用为何不保留顶点颜色?

Godot中MeshDataTool重复提交丢失顶点颜色的问题

我是Godot新手,恳请各位多多包涵。

我遇到一个问题:通过create_from_surface与commit_to_surface组合修改网格顶点颜色后能正常显示,但如果再次用create_from_surface读取网格数据,未做任何修改就直接调用commit_to_surface提交,顶点颜色会丢失,网格恢复默认颜色。

请问这是预期行为吗?如果是,我是否需要逐个顶点把颜色数据保存到临时数组再重新读取来保留数据?这看起来效率很低,还是我遗漏了什么关键步骤?提前感谢!

初始问题代码

extends MeshInstance2D
var mdt = MeshDataTool.new()
# Called when the node enters the scene tree for the first time.
func _ready():
    mdt.create_from_surface(mesh, 0)
    var vertex_count = mdt.get_vertex_count()
    for i in range(vertex_count):
        mdt.set_vertex_color(i, Color((mdt.get_vertex(i).x),0,1))
    mdt.commit_to_surface(mesh) # Mesh shows as having a gradient from blue to purple
    mdt.create_from_surface(mesh, 0) # If I un-comment the next line, mesh shows as white 
    #mdt.commit_to_surface(mesh)
    #... 

解决方案(编辑补充)

感谢Ivy提供的优雅解决方案,问题立刻得到解决!后续我会移除调试用的重复create和commit操作,开始应用实际游戏逻辑。

关键修复点是:在每次调用commit_to_surface前先调用mesh.clear_surfaces(),这样就能保留顶点颜色数据了。

修改后的代码

extends MeshInstance2D
var mdt = MeshDataTool.new()
# Called when the node enters the scene tree for the first time.
func _ready():
    mdt.create_from_surface(mesh, 0)
    var vertex_count = mdt.get_vertex_count()
    for i in range(vertex_count):
        mdt.set_vertex_color(i, Color((mdt.get_vertex(i).x),0,1))
    mesh.clear_surfaces()
    mdt.commit_to_surface(mesh) # Mesh shows as having a gradient from blue to purple
    mdt.create_from_surface(mesh, 0) 
    mesh.clear_surfaces()
    mdt.commit_to_surface(mesh) # The gradient persists, yay!
    #... 

内容的提问来源于stack exchange,提问作者Samuli Viitasaari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 01:20:20