サーチ…


前書き

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

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
    }
}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow