ImmediateGeometryの使用

SurfaceToolやArrayMeshとは異なり、ImmediateGeometry は実際のノードです。ノードであると、シーンにすばやく追加して視覚的な出力を得ることができます。 SurfaceToolのような"OpenGL 1.x"スタイルのAPIを使用しますが、実際にはその場でコンテンツを作成するように設計されています。

このノードを使用して複雑なジオメトリ(数千個の頂点)を生成することは、1 回だけ実行された場合でも非効率的です。代わりに、すべてのフレームを変更する単純なジオメトリを生成するように設計されています。

Before starting, you should clear the geometry by calling clear(). This ensures that you are not building upon the geometry from the previous frame. If you want to keep geometry between frames, do not call clear().

ジオメトリの生成を開始するには、begin() を呼び出す必要があります。begin()PrimitiveType を引数として取ります。PrimitiveType はOpenGLの概念で、三角形、線、点などの頂点に基づいてプリミティブを配置する方法をGPUに指示します。完全なリストは Mesh のクラスリファレンスページにあります。

`` begin()`` を呼び出したら、頂点の追加を開始する準備ができています。頂点を1つずつ追加します。まず、set _ ****() を使用して、法線やUVなどの頂点固有の属性を追加します(例: 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()