ImmediateGeometryの使用

Unlike the SurfaceTool or ArrayMesh, ImmediateGeometry is an actual node. Being a node makes it quick to add to a scene and get visual output. It uses an OpenGL 1.x-style API like SurfaceTool, but it's actually designed to create meshes on the fly.

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

開始する前に、clear() を呼び出してジオメトリをクリアする必要があります。これにより、前のフレームのジオメトリに基づいて構築しないことが保証されます。フレーム間でジオメトリを保持したい場合は、`` 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()