使用即时几何体
与SurfaceTool或ArrayMesh不同, :ref:`ImmediateGeometry <class_ImmediateGeometry>`是一个实际的节点.作为一个节点,它可以快速添加到场景中,并获得可视化输出.它使用像SurfaceTool一样的OpenGL 1.x风格的API,但它实际上是为了在动态创建网格而设计的.
用这个节点生成复杂的几何体(几千个顶点),即使只做一次,效率也很低.相反,它的设计是为了生成每一帧变化的简单几何体.
在开始之前,你应该通过调用 clear()
来清除几何体.这可以确保你没有在前一帧的几何体上进行构建.如果你想在帧之间保留几何体,不要调用 clear()
.
要开始生成几何体,必须调用 begin()
. begin()
将一个 PrimitiveType
作为参数. PrimitiveType
是一个OpenGL概念,它指示GPU如何根据给定的顶点来安排基元,无论是三角形、线、点等.完整的列表可以在 :ref:`Mesh <class_mesh>`类参考页面中找到.
一旦你调用了 begin()
,就可以开始添加顶点了.每次添加一个顶点,首先使用 set_****()
添加顶点的特定属性,如法线或UV(例如 set_normal()
).然后调用 add_vertex()
来添加一个带有这些属性的顶点.例如 “add_vertex()” :
GDScript
# Add a vertex with normal and uv.
set_normal(Vector3(0, 1, 0))
set_uv(Vector2(1, 1))
add_vertex(Vector3(0, 0, 1))
只有在调用 add_vertex()
之前添加的属性才会被包含在该顶点中.
最后,当添加了所有的顶点后,调用 end()
来表示已经完成了网格的生成.
下面的示例代码绘制了一个三角形.
GDScript
extends ImmediateGeometry
func _process(_delta):
# Clean up before drawing.
clear()
# Begin draw.
begin(Mesh.PRIMITIVE_TRIANGLES)
# Prepare attributes for add_vertex.
set_normal(Vector3(0, 0, 1))
set_uv(Vector2(0, 0))
# Call last for each vertex, adds the above attributes.
add_vertex(Vector3(-1, -1, 0))
set_normal(Vector3(0, 0, 1))
set_uv(Vector2(0, 1))
add_vertex(Vector3(-1, 1, 0))
set_normal(Vector3(0, 0, 1))
set_uv(Vector2(1, 1))
add_vertex(Vector3(1, 1, 0))
# End drawing.
end()