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

如何使用SurfaceTool设置网格面颜色?surface_tool.set_color失效问题

解决SurfaceTool.set_color顶点颜色不生效的问题

你的代码有两个关键问题导致顶点颜色未生效,以下是修复方案:

问题1:颜色与顶点的绑定逻辑错误

SurfaceTool的set_color()是为后续添加的顶点设置颜色,你当前每个面仅调用一次set_color()再连续添加4个顶点,结合索引复用原始顶点的方式,会导致颜色无法正确关联到每个顶点。正确做法是在每个add_vertex()之前调用set_color(),确保每个顶点都绑定对应颜色。

问题2:材质未启用顶点颜色支持

即使Mesh的顶点颜色数据正确,默认的StandardMaterial3D不会自动使用顶点颜色,需要手动开启该功能,或直接使用专门的VertexColorMaterial。


修复后的完整代码

extends MeshInstance3D

func _ready():
    create_colored_cube()
    # 设置支持顶点颜色的材质
    var mat = VertexColorMaterial.new()
    material_override = mat

func create_colored_cube():
    # Define cube data
    var vertices = [
        Vector3(-0.5, -0.5, -0.5), Vector3(-0.5, -0.5, 0.5), Vector3(-0.5, 0.5, 0.5), Vector3(-0.5, 0.5, -0.5),
        Vector3(0.5, -0.5, -0.5), Vector3(0.5, -0.5, 0.5), Vector3(0.5, 0.5, 0.5), Vector3(0.5, 0.5, -0.5)
    ]
    var faces = [
        [3, 2, 1, 0], [4, 5, 6, 7], [0, 1, 5, 4], [1, 2, 6, 5], [2, 3, 7, 6], [4, 7, 3, 0]
    ]
    var colors = [
        Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW, Color.MAGENTA, Color.CYAN
    ]

    # Create a new ArrayMesh and SurfaceTool
    var mesh = ArrayMesh.new()
    var surface_tool = SurfaceTool.new()
    surface_tool.begin(Mesh.PRIMITIVE_TRIANGLES)

    # Loop through each face
    for i in range(faces.size()):
        var face_color = colors[i]
        # 为当前面的每个顶点单独设置颜色后添加
        for j in range(4):
            surface_tool.set_color(face_color)  # 每个顶点前设置颜色
            surface_tool.add_vertex(vertices[faces[i][j]])
        # Add two triangles for this face
        surface_tool.add_index(i*4)
        surface_tool.add_index(i*4 + 1)
        surface_tool.add_index(i*4 + 2)
        surface_tool.add_index(i*4)
        surface_tool.add_index(i*4 + 2)
        surface_tool.add_index(i*4 + 3)

    # Generate normals and tangents
    surface_tool.generate_normals()
    surface_tool.generate_tangents()

    # Commit to the mesh
    surface_tool.commit(mesh)

    # Set the MeshInstance's mesh
    self.mesh = mesh

关键改动说明

  1. 颜色绑定修正:将set_color()移至add_vertex()的循环内部,确保每个顶点都能获取对应面的颜色。
  2. 材质设置:在_ready()中创建VertexColorMaterial并赋值给material_override,让引擎渲染时使用顶点颜色。如果想用StandardMaterial3D,可替换为以下代码:
    var mat = StandardMaterial3D.new()
    mat.vertex_color_use_as_albedo = true
    material_override = mat
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 16:45:07