Использование ImmediateGeometry¶
В отличие от SurfaceTool или ArrayMesh, ImmediateGeometry является фактическим узлом. Наличие узла позволяет быстро добавлять элементы в сцену и получать визуальный результат. Он использует API в стиле OpenGL 1.x, такой как SurfaceTool, но на самом деле он предназначен для создания сеток на лету.
Генерация сложной геометрии (несколько тысяч вершин) с помощью этого узла неэффективна, даже если это делается только один раз. Вместо этого он предназначен для создания простой геометрии, которая меняется в каждом кадре.
Перед началом работы вы должны очистить геометрию, вызвав clear()
. Это гарантирует, что вы не опираетесь на геометрию предыдущего кадра. Если вы хотите сохранить геометрию между кадрами, не вызывайте clear()
.
Чтобы начать генерировать геометрию, вы должны вызвать begin()
. begin()
принимает PrimitiveType
в качестве аргумента. PrimitiveType
- это концепция OpenGL, которая инструктирует графический процессор, как расположить примитив на основе заданных вершин, будь то треугольники, линии, точки и т.д. Полный список можно найти на странице ссылок на классы Mesh.
После того, как вы вызвали begin()
, вы готовы начать добавлять вершины. Вы добавляете вершины по одной за раз. Сначала вы добавляете атрибуты, специфичные для вершин, такие как нормали или UVS, используя set_****()
(например, set_normal()
). Затем вы вызываете add_vertex()
, чтобы добавить вершину с этими атрибутами. Например:
# 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()
, чтобы сигнализировать о том, что вы закончили генерировать сетку.
Приведенный ниже пример кода рисует один треугольник.
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()