5

OpenGL 3.x+ を使用して、背景 (2D) のクワッドを描画しようとしています。四角形は非推奨であるため、目標は 2 つの三角形を使用して画面いっぱいの四角形を作成することです。動作していますが、ここにあるすべてについて 100% 明確ではありません。

  1. 設定

    GLuint positionBufferObject;
    GLfloat vertexPositions[] =
    {
        -1.0f, -1.0f, 0.0f, 1.0f,
        -1.0f,  1.0f, 0.0f, 1.0f,
         1.0f,  1.0f, 0.0f, 1.0f,
         1.0f, -1.0f, 0.0f, 1.0f,
        -1.0f, -1.0f, 0.0f, 1.0f,
    };
    glGenBuffers(1, &positionBufferObject);
    glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions), vertexPositions, GL_STATIC_DRAW);
    
    • はわかりvertexPositionsました。頂点の配列です。
    • glGenBuffers()と言っているのですが、1 つのバッファが必要で、id を&positionBufferObject?に割り当てます。
    • glBufferData()vertexPositionsを GPU のメモリにアップロードします。しかし、私が ID を与えなかったので、どうやってそれをアップロードしたことを知るのでしょうか?
  2. 描く

    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 5);
    glDisableVertexAttribArray(0);
    
    • glEnableVertexAttribArray()配列0で描画するつもりだと言っているだけですか?
    • glDrawArrays()- 2 つの頂点配列を描画したい場合はどうすればよいですか? レンダリングするものをどのように知るのですか? 上記のコマンドからそれを知っていますか?
    • よくわからglVertexAttribPointer()ない?
    • glDrawArrays()明らかです。
  3. クリーンアップ、私はこれが正しいと思いますか?

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glDeleteBuffers(1, &positionBufferObject);
    

    セットアップ/クリーンアップは一度だけ行います。

ボーナスポイント:

  • これはこれをレンダリングする最も効果的な方法ですか? 3.x+ では即時モードが使用されなくなったため、送信して「バッチ」でレンダリングすることになっていることを読みました [?]。また、配列は 1 つしかないため、この場合、バッチ処理はパフォーマンスに役立ちませんが、描画する vertxArrays が「非常に多数」であるとしたら、同じプロセスでしょうか?
  • セットアップでは、配列 ID を positionBufferObject として格納していますが、レンダリング ループでハードコードされています。十数個の配列を使用すると混乱するように思えますが、変数をハードコーディングする代わりに変数を使用するのが良い方法ではないのはなぜですか?
4

2 に答える 2

9

glGenBuffers(1, &positionBufferObject);は、「頂点バッファ オブジェクトを作成し、positionBufferObjectその ID です」と述べています。

glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);positionBufferObject現在のGL_ARRAY_BUFFERです」と表示されます。

glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions), vertexPositions, GL_STATIC_DRAW);vertexPositions「現在バインドされている ID GL_ARRAY_BUFFER( ) にアップロードします」と表示されpositionBufferObjectます。

glEnableVertexAttribArray(0);「頂点属性配列 0 が使用できるようになりました」と表示されます。

glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);「頂点属性配列 0 は、4 つの float のグループで構成されていると解釈される」と述べています。

glDrawArrays(GL_TRIANGLE_STRIP, 0, 5);「すべての有効な配列から 5 つのインデックスを使用して三角形のストリップを描画します」と言います。

glDisableVertexAttribArray(0);は、「頂点属性配列 0 で当分の間終了しました」と言います。

于 2011-04-29T02:49:02.200 に答える
4

複数の配列に関する user697111 の質問への回答は、非常に簡単です。

各頂点属性は、バッファ オブジェクトに関連付ける必要があります。glVertexAttribPointer でバッファ オブジェクトを指定するのではなく、関連付けは GL_ARRAY_BUFFER を介して行われます。glVertexAttribPointer (または任意の gl*Pointer 呼び出し) を呼び出すと、現在GL_ARRAY_BUFFER にバインドされているバッファーがその属性のソースとして使用されます。したがって、次のことを考慮してください。

glBindBuffer(GL_ARRAY_BUFFER, myPositionData);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, ..., 0);
glBindBuffer(GL_ARRAY_BUFFER, myColorData);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, ..., 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glDrawArrays(...);

アトリビュート 0 はバッファ オブジェクトから取得されmyPositionData、アトリビュート 1 はバッファ オブジェクトから取得されますmyColorData。呼び出す前に GL_ARRAY_BUFFER へのバインディングを取り消したという事実はglDrawArrays、これらの属性のデータがどこから来るかを変更しません。

于 2011-06-16T10:17:32.387 に答える