2

三角形、四角形、五角形を表示する OpenGL 4.3 を使用した簡単なプログラムを作成しました。次の配列で頂点を定義しました。

vec2 vertices[NumPoints] = {
    vec2(-1, -0.75), vec2(-0.75, -0.25), vec2(-0.5, -0.75), //Triangle
    vec2(0, -0.25), vec2(0.5, -0.25), vec2(0.5, -0.75), vec2(0, -0.75), //Quad
    vec2(0.25, 0.25), vec2(0.5, 0.5), vec2(0.75, 0.25), vec2(0.65, 0), vec2(0.35, 0) // pentagon
};

簡潔にするために、定型コードのほとんどを省略します。私の表示機能には、次のコードがあります。

glDrawArrays(GL_TRIANGLES, 0, 3); // draw the points
glDrawArrays(GL_TRIANGLE_FAN, 3, 4); //quad
glDrawArrays(GL_TRIANGLE_FAN, 7, 5); //polygon

すべて正常に動作し、問題はありません。ただし、事前に必要な頂点の数を正確に把握する必要がある場合、複雑なシーンを作成するのはかなり面倒でほとんど不可能に思えます。ここで何か不足していますか?また、円を作成する必要がある場合、GL_TRIANGLES だけを使用してどのように作成すればよいでしょうか?

4

2 に答える 2

1

実際のアプリケーションでは、シーン内に複数のオブジェクトがあり、各オブジェクトに複数のサブオブジェクトがあるシーン管理があります。オブジェクトは、頂点データと対応する描画呼び出しを生成し、それらを適切にスケジュールします。

たとえば、辺の長さという 1 つのプロパティを持つ立方体オブジェクトを作成できます。その単一のプロパティから、立方体をレンダリングするために必要な頂点の完全なセットを生成します。

立方体プリミティブを別の互換性のあるオブジェクトに変換することも選択できます。たとえば、高さ、幅、深さの 3 つのプロパティを持つボックス プリミティブ、または面で構成される任意のポリゴン メッシュであり、エッジで構成されます。頂点でできています。

さまざまなシーン オブジェクトをこのような順序で並べ替えて、3D グラフィックスが苦労する典型的なボトルネックであるドロー コールの数を最小限に抑えることをお勧めします。インスタンス化と適応 LOD を組み合わせることで、パフォーマンスを大幅に向上させることができます。

円の場合 - プリミティブ モードで最も効率的に描画するには、三角ファンを使用します。しかし、円プリミティブをポリゴン メッシュに変換すると、正三角形をレンダリングできます。円を描くために必要な頂点の数が増えます。扇形三角形では、最初の三角形に 3 つの頂点が必要で、追加のセグメントごとに追加の頂点が 1 つだけ必要です。通常の三角形では、円のセグメントごとに 3 つの頂点が必要になります。

于 2013-04-12T23:15:25.673 に答える