Recherche…


Introduction

L'objet Vertex Array stocke comment opengl doit interpréter un ensemble de VBO.

Essentiellement, cela vous évitera d'appeler glVertexAttribPointer à chaque fois que vous voulez rendre un nouveau maillage.

Si vous ne voulez pas traiter avec les VAO, vous pouvez simplement en créer un et le lier pendant l'initialisation du programme et prétendre qu'ils n'existent pas.

Syntaxe

  • annuler glEnableVertexAttribArray (GLuint attribIndex);

  • void glDisableVertexAttribArray (GLuint attribIndex);

  • void glVertexAttribPointer (GLIINT attribIndex, GLint size, type GLenum, GLboolean normalisé, GLsizei stride, const GLvoid * pointeur);

  • voI glVertexAttribFormat (GLIINT attribIndex, taille GLint, type GLenum, GLboolean normalisé, GLuint relativeoffset);

  • void glVertexAttribBinding (GLuint attribIndex, GLuint bindingIndex);

  • annuler glBindVertexBuffer (GLuint bindingIndex, tampon GLuint, décalage GLintptr, foulée GLintptr);

Paramètres

paramètre Détails
attribIndex l'emplacement de l'attribut de sommet auquel le tableau de verte alimentera les données
Taille le nombre de composants à extraire de l'attribut
type Le type C ++ des données d'attribut dans le tampon
normalisé s'il faut mapper des types entiers à la plage à virgule flottante [0, 1] (pour unsigned) ou [-1, 1] (for signed)
aiguille le décalage d'octet dans le tampon au premier octet des données de l'attribut (converti en void* pour des raisons héritées)
décalage le décalage d'octet de base depuis le début du tampon vers lequel les données du tableau commencent
relativeOffset le décalage à un attribut particulier, par rapport au décalage de base du tampon
foulée le nombre d'octets des données d'un sommet vers le suivant
tampon l'objet tampon où sont stockés les tableaux de sommets
bindingIndex l'index auquel l'objet tampon source sera lié

Remarques

La configuration VAO de format d'attribut distinct peut interopérer avec glVertexAttribPointer (ce dernier est défini en termes de l'ancien). Mais vous devez faire attention en le faisant.

La version séparée du format d'attribut a des équivalents d'accès direct à l'état (DSA) dans 4.5. Ceux-ci auront les mêmes paramètres mais au lieu d'utiliser le VAO lié, le VAO en cours de modification est passé explicitement. Lors de l'utilisation de DSA, le tampon d'index pour glDrawElements peut être défini avec glVertexArrayElementBuffer(vao, ebo);

Version 3.0

Chaque attribut est associé à un nombre de composants, à un type, à une normalisation, à un décalage, à une foulée et à un VBO. Le VBO n'est pas passé explicitement en paramètre mais est la mémoire tampon liée à GL_ARRAY_BUFFER au moment de l'appel.

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

Version 4.3

4.3

OpenGL 4.3 (ou ARB_separate_attrib_format) ajoute une autre manière de spécifier les données de sommet, ce qui crée une séparation entre le format des données liées à un attribut et la source de l'objet tampon qui fournit les données. Donc, au lieu d'avoir un VAO par maillage, vous pouvez avoir un format VAO par sommet.

Chaque attribut est associé à un format de sommet et à un point de liaison. Le format de sommet se compose du type, du nombre de composants, de sa normalisation et du décalage relatif entre le début des données et ce sommet particulier. Le point de liaison spécifie le tampon à partir duquel un attribut prend ses données. En séparant les deux, vous pouvez lier des tampons sans spécifier de format de sommet. Vous pouvez également modifier le tampon qui fournit des données à plusieurs attributs avec un seul appel de liaison.

//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);

Ensuite, pendant le tirage au sort, vous maintenez le vao lié et ne modifiez que les liaisons de tampon.

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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow