OpenGL 3.x+ を使用して、背景 (2D) のクワッドを描画しようとしています。四角形は非推奨であるため、目標は 2 つの三角形を使用して画面いっぱいの四角形を作成することです。動作していますが、ここにあるすべてについて 100% 明確ではありません。
設定
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 を与えなかったので、どうやってそれをアップロードしたことを知るのでしょうか?
- はわかり
描く
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()
明らかです。
クリーンアップ、私はこれが正しいと思いますか?
glBindBuffer(GL_ARRAY_BUFFER, 0); glDeleteBuffers(1, &positionBufferObject);
セットアップ/クリーンアップは一度だけ行います。
ボーナスポイント:
- これはこれをレンダリングする最も効果的な方法ですか? 3.x+ では即時モードが使用されなくなったため、送信して「バッチ」でレンダリングすることになっていることを読みました [?]。また、配列は 1 つしかないため、この場合、バッチ処理はパフォーマンスに役立ちませんが、描画する vertxArrays が「非常に多数」であるとしたら、同じプロセスでしょうか?
- セットアップでは、配列 ID を positionBufferObject として格納していますが、レンダリング ループでハードコードされています。十数個の配列を使用すると混乱するように思えますが、変数をハードコーディングする代わりに変数を使用するのが良い方法ではないのはなぜですか?