8

さまざまな頂点属性の VBO を持つ VAO があります: 頂点位置、頂点法線、および要素配列 VBO (すべて STATIC_DRAW) で、インスタンスのレンダリングに必要なものは次のとおりです。

glBindVertexArray(vao);
glDrawElements(GL_TRIANGLES, <count>, <type>, 0);

ただし、インスタンスごとに異なる頂点テクスチャ (s、t) 座標を使用して、オブジェクトの複数のインスタンス (私は OS X GL 3.2 コア プロファイル BTW に制限されています) を描画したいと考えています。texcoord VBO は STREAM_DRAW ヒントを使用します (ただし、DYNAMIC_DRAW を使用するとうまくいく可能性があります)。

VAO をバインドし、現在の texcoord VBO をバインドし、 を介して属性ポインタを設定glVertexAttribPointerし、VAO をファイナライズして、glBindVertexArray(0)異なるテクスチャ座標で新しいインスタンスを描画する方が効率的ですか? それとも、VAO を更新するためのコストがかかるため、これはお粗末なアプローチになるのでしょうか? バインドされたVAO で texcoord VBO を更新するのはどうglBufferSubDataですか?

間違った選択は大幅なリファクタリングにつながるため、別々のアプローチをベンチマークする前に、いくつかのフィードバックをいただければ幸いです。

4

1 に答える 1

3

複数の VAO を作成するだけです。頂点配列オブジェクトは軽量で、頂点配列を一度にセットアップするために使用されます...

VBO は複数の VAO にバインドできるため、作業がより簡単かつ迅速になります。

ある時点で別の属性構成が必要な場合は、古い VAO を破棄して新しい VAO を作成します。

于 2012-08-30T14:47:33.803 に答える