如何使用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
关键改动说明
- 颜色绑定修正:将
set_color()移至add_vertex()的循环内部,确保每个顶点都能获取对应面的颜色。 - 材质设置:在
_ready()中创建VertexColorMaterial并赋值给material_override,让引擎渲染时使用顶点颜色。如果想用StandardMaterial3D,可替换为以下代码:var mat = StandardMaterial3D.new() mat.vertex_color_use_as_albedo = true material_override = mat
内容的提问来源于stack exchange,提问作者mic
相关产品推荐
相关产品推荐

