サーチ…
前書き
Vertex Array Objectは、OpenGLが一連のVBOを解釈する方法を格納します。
本質的には、新しいメッシュをレンダリングするたびにglVertexAttribPointerを呼び出さないようにします。
VAOを扱いたくない場合は、プログラムの初期化中にVAOを作成してバインドし、存在しないふりをするだけです。
構文
void glEnableVertexAttribArray(GLuint attribIndex);
void glDisableVertexAttribArray(GLuint attribIndex);
void glVertexAttribPointer(GLuint attribIndex、GLintサイズ、GLnum型、GLboolean正規化、GLsizei stride、const GLvoid *ポインタ);
void glVertexAttribFormat(GLuint attribIndex、GLintサイズ、GLenumタイプ、GLboolean正規化、GLuint相対オフセット)。
void glVertexAttribBinding(GLuint attribIndex、GLuint bindingIndex);
void glBindVertexBuffer(GLuint bindingIndex、GLuintバッファ、GLintptrオフセット、GLintptrストライド);
パラメーター
パラメータ | 詳細 |
---|---|
attribIndex | 頂点配列がデータを供給する頂点属性の場所 |
サイズ | 属性から引き出されるコンポーネントの数 |
タイプ | バッファ内の属性データのC ++型 |
正規化された | 浮動小数点範囲[0、1](符号なしの場合)または[-1、1](符号付きの場合)に整数型をマップするかどうか。 |
ポインタ | 属性データの最初のバイトまでのバッファへのバイトオフセット(従来の理由からvoid* にキャスト) |
オフセット | バッファの先頭から配列データの開始位置までの基本バイトオフセット |
relativeOffset | バッファの基本オフセットに対する特定の属性へのオフセット |
ストライド | 1頂点のデータから次の頂点のデータまでのバイト数 |
バッファ | 頂点配列が格納されているバッファオブジェクト |
bindingIndex | ソースバッファオブジェクトがバインドされるインデックス |
備考
別個のアトリビュートフォーマットVAOセットアップは、 glVertexAttribPointer
相互運用できます(後者は前者の定義で定義されています)。しかしそうするときには注意が必要です。
別の属性フォーマットバージョンは、4.5の同等の直接的なアクセス(DSA)を持っています。これらは同じパラメータを持ちますが、バインドされたVAOを使用する代わりに、変更されるVAOは明示的に渡されます。 glDrawElements
DSAインデックスバッファを使用する場合、 glVertexArrayElementBuffer(vao, ebo);
で設定できますglVertexArrayElementBuffer(vao, ebo);
バージョン3.0
各属性は、コンポーネント数、タイプ、正規化、オフセット、ストライドおよびVBOに関連付けられています。 VBOはパラメータとして明示的に渡されるのではなく、呼び出し時にGL_ARRAY_BUFFERにバインドされたバッファです。
void prepareMeshForRender(Mesh mesh){
glBindVertexArray(mesh.vao);
glBindBuffer(GL_ARRAY_BUFFER, mesh.vbo);
glVertexAttribPointer (posAttrLoc, 3, GL_FLOAT, false, sizeof(Vertex), mesh.vboOffset + offsetof(Vertex, pos));//will associate mesh.vbo with the posAttrLoc
glEnableVertexAttribArray(posAttrLoc);
glVertexAttribPointer (normalAttrLoc, 3, GL_FLOAT, false, sizeof(Vertex), mesh.vboOffset + offsetof(Vertex, normal));
glEnableVertexAttribArray(normalAttrLoc);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh.ebo); //this binding is also saved.
glBindVertexArray(0);
}
void drawMesh(Mesh[] meshes){
foreach(mesh in meshes){
glBindVertexArray(mesh.vao);
glDrawElements(GL_TRIANGLES, mesh.vertexCount, GL_UNSIGNED_INT, mesh.indexOffset);
}
}
バージョン4.3
OpenGL 4.3(またはARB_separate_attrib_format)では、頂点データを指定する別の方法が追加され、属性にバインドされたデータの形式とデータを提供するバッファオブジェクトソースの間に分離が作成されます。したがって、メッシュごとにVAOを使用する代わりに、VAOを頂点フォーマットごとに使用できます。
各属性は、頂点フォーマットとバインディングポイントに関連付けられています。頂点フォーマットは、タイプ、コンポーネント数、正規化されているかどうか、データの開始からその特定の頂点までの相対オフセットから構成されます。バインディングポイントは、属性がそのデータを取得するバッファを指定します。 2つを分離することで、頂点フォーマットを再指定せずにバッファをバインドできます。また、単一のバインドコールで複数の属性にデータを提供するバッファを変更することもできます。
//accessible constant declarations
constexpr int vertexBindingPoint = 0;
constexpr int texBindingPoint = 1;// free to choose, must be less than the GL_MAX_VERTEX_ATTRIB_BINDINGS limit
//during initialization
glBindVertexArray(vao);
glVertexAttribFormat(posAttrLoc, 3, GL_FLOAT, false, offsetof(Vertex, pos));
// set the details of a single attribute
glVertexAttribBinding(posAttrLoc, vertexBindingPoint);
// which buffer binding point it is attached to
glEnableVertexAttribArray(posAttrLoc);
glVertexAttribFormat(normalAttrLoc, 3, GL_FLOAT, false, offsetof(Vertex, normal));
glVertexAttribBinding(normalAttrLoc, vertexBindingPoint);
glEnableVertexAttribArray(normalAttrLoc);
glVertexAttribFormat(texAttrLoc, 2, GL_FLOAT, false, offsetof(Texture, tex));
glVertexAttribBinding(texAttrLoc, texBindingPoint);
glEnableVertexAttribArray(texAttrLoc);
引き分けの間、あなたはバオの束縛を保ち、バッファバインディングだけを変更します。
void drawMesh(Mesh[] mesh){
glBindVertexArray(vao);
foreach(mesh in meshes){
glBindVertexBuffer(vertexBindingPoint, mesh.vbo, mesh.vboOffset, sizeof(Vertex));
glBindVertexBuffer(texBindingPoint, mesh.texVbo, mesh.texVboOffset, sizeof(Texture));
// bind the buffers to the binding point
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh.ebo);
glDrawElements(GL_TRIANGLES, mesh.vertexCount, GL_UNSIGNED_INT, mesh.indexOffset);
//draw
}
}