使用即时几何体

与SurfaceTool或ArrayMesh不同, ImmediateGeometry 是一个实际的节点. 作为一个节点, 它可以快速添加到场景中, 并获得可视化输出. 它使用像SurfaceTool一样的OpenGL 1.x风格的API, 但它实际上是为了在动态创建网格而设计的.

用这个节点生成复杂的几何体(几千个顶点), 即使只做一次, 效率也很低. 相反, 它的设计是为了生成每一帧变化的简单几何体.

在开始之前, 你应该通过调用 clear() 来清除几何体. 这可以确保你没有在前一帧的几何体上进行构建. 如果你想在帧之间保留几何体, 不要调用 clear() .

必须调用 begin() 才能开始生成几何体 。begin() 将一个 PrimitiveType 作为参数。PrimitiveType(图元类型)是 OpenGL 的概念,用于指示 GPU 如何根据给定的顶点来安排图元,可以是三角形、线、点等。完整的列表可以在 Mesh 的类参考页面中找到。

一旦你调用了 begin() , 就可以开始添加顶点了. 每次添加一个顶点, 首先使用 set_ **** () 添加顶点的特定属性, 如法线或UV(例如 set_normal() ). 然后调用 add_vertex() 来添加一个带有这些属性的顶点. 例如 “add_vertex()” :

GDScript

  1. # Add a vertex with normal and uv.
  2. set_normal(Vector3(0, 1, 0))
  3. set_uv(Vector2(1, 1))
  4. add_vertex(Vector3(0, 0, 1))

只有在调用 add_vertex() 之前添加的属性才会被包含在该顶点中.

最后, 当添加了所有的顶点后, 调用 end() 来表示已经完成了网格的生成.

下面的示例代码绘制了一个三角形.

GDScript

  1. extends ImmediateGeometry
  2. func _process(_delta):
  3. # Clean up before drawing.
  4. clear()
  5. # Begin draw.
  6. begin(Mesh.PRIMITIVE_TRIANGLES)
  7. # Prepare attributes for add_vertex.
  8. set_normal(Vector3(0, 0, 1))
  9. set_uv(Vector2(0, 0))
  10. # Call last for each vertex, adds the above attributes.
  11. add_vertex(Vector3(-1, -1, 0))
  12. set_normal(Vector3(0, 0, 1))
  13. set_uv(Vector2(0, 1))
  14. add_vertex(Vector3(-1, 1, 0))
  15. set_normal(Vector3(0, 0, 1))
  16. set_uv(Vector2(1, 1))
  17. add_vertex(Vector3(1, 1, 0))
  18. # End drawing.
  19. end()