標準のopengl 4.0+の機能と仕様を考慮して; ジオメトリとシェイプは次の 2 つの方法で作成できることがわかりました。
VAO と VBO を利用する。
シェーダー プログラムの使用。
形状を作成する標準的な方法はどれですか?? それらは互いに一致していますか?それとも、ジオメトリと形状を作成するための 2 つの異なる方法ですか?
VAOとVBOは、どのジオメトリを描画するか(頂点ごとのデータを指定)についてはどうでしょうか。シェーダープログラムは、それらを描画する方法(提供された各頂点、各フラグメントなどに適用されるプログラム)に関するものです。
ジオメトリはVAOとVBOを使用してGPUに読み込まれます。
ジオメトリシェーダーは、アップロードされたものに基づいて新しいジオメトリを生成します。それらを使用して、パーティクル、シャドウ(シャドウボリューム)などの特殊効果をより効率的に作成します。
テッセレーションシェーダーは、ディスプレースメントマッピングなどのいくつかのエフェクトのジオメトリを細分化するのに役立ちます。
私は強く(本当に強く好きです)これを読むことを強くお勧めしますhttp://fgiesen.wordpress.com/2011/07/09/a-trip-through-the-graphics-pipeline-2011-index/
完全な事実を並べてみましょう。
シェーダーには入力が必要です。変化する入力がなければ、すべてのシェーダー呼び出しでまったく同じ値が生成されます。それがシェーダーの仕組みです。ドローコールを発行すると、多数のシェーダー呼び出しが開始されます。この描画呼び出し内で呼び出しごとに変化する唯一の変数in
は変数です。したがって、なんらかの入力を使用しない限り、すべてのシェーダーが同じ出力を生成します。
ただし、実際に物を含む VAO が絶対に必要というわけではありません。有効な属性を持たない VAO でレンダリングすることは完全に合法です (サポートしていないドライバーもあります) (ただし、インデックス付きレンダリングではなく、配列レンダリングを使用する必要があります)。その場合、頂点シェーダーへのすべてのユーザー定義入力 (存在する場合) は、定数であるcontext stateで埋められます。
頂点シェーダーには、システムによって生成されるその他の組み込みの頂点ごとの入力があります。すなわち gl_VertexID。これは、この特定の頂点を一意に識別するために OpenGL によって使用されるインデックスです。頂点ごとに異なります。
したがって、たとえば、このインデックスに基づいて、ユニフォーム バッファ、バッファ テクスチャ、またはその他のメカニズムを介してジオメトリ データを自分で取得できます。または、インデックスに基づいて手続き的に頂点データを生成できます。または、他の何か。そのデータをテッセレーション シェーダーに渡して、生成されたデータをテッセレーションすることができます。または、ジオメトリ シェーダーを使用して、必要なことを何でも行うことができます。ただし、そのインデックスを実際のデータに変換するかどうかはあなた次第です。
ジオメトリと形状は、次の2つの方法で作成できることを確認しました。
どちらでもありません。最新のOpenGL-4では、データとプログラムの両方が必要です。
VBOとVAOには、生のジオメトリデータが含まれています。シェーダーは、生データを画面上のピクセルに変換するプログラム(通常はGPUで実行されます)です。
頂点シェーダーを使用して、頂点を移動したり、組み込み式と頂点インデックスから生成したりできます。これは、以降のオープン gl バージョンで組み込み属性として使用できます。
頂点シェーダーとジオメトリ シェーダーの違いは、頂点シェーダーが 1:1 マッピングであるのに対し、ジオメトリ シェーダーはより多くの頂点を作成できることです。たとえば、NURBS やパーリン ノイズ ベースの地形などの自動 Level of Detail 生成に利用できます。