Zoeken…


Invoering

Het Vertex Array Object slaat op hoe opengl een set VBO's moet interpreteren.

In essentie kunt u voorkomen dat u glVertexAttribPointer aanroept telkens wanneer u een nieuwe mesh wilt renderen.

Als u niet wilt omgaan met VAO's, kunt u er eenvoudig een maken en binden tijdens de initialisatie van het programma en doen alsof ze niet bestaan.

Syntaxis

  • void glEnableVertexAttribArray (GLuint attribIndex);

  • void glDisableVertexAttribArray (GLuint attribIndex);

  • void glVertexAttribPointer (GLuint attribIndex, GLint-grootte, GLenum-type, GLboolean genormaliseerd, GLsizei stride, const GLvoid * pointer);

  • void glVertexAttribFormat (GLuint attribIndex, GLint-grootte, GLenum-type, GLboolean genormaliseerd, GLuint relatieve offset);

  • void glVertexAttribBinding (GLuint attribIndex, GLuint bindingIndex);

  • void glBindVertexBuffer (GLuint bindingIndex, GLuint buffer, GLintptr offset, GLintptr stride);

parameters

parameter Details
attribIndex de locatie voor het hoekpuntkenmerk waarnaar de hoekpuntmatrix gegevens zal voeden
grootte het aantal componenten dat uit het kenmerk moet worden gehaald
type Het type C ++ van de kenmerkgegevens in de buffer
genormaliseerd of u hele typen wilt toewijzen aan het drijvende-kommabereik [0, 1] (voor niet-ondertekende) of [-1, 1] (voor ondertekende)
wijzer de byte-offset in de buffer naar de eerste byte van de gegevens van het attribuut (om void* te void* cast void* )
compenseren de basisbyte-offset vanaf het begin van de buffer tot waar de arraygegevens beginnen
relativeOffset de verschuiving naar een bepaald kenmerk, ten opzichte van de basisverschuiving voor de buffer
stride het aantal bytes van de gegevens van de ene hoekpunt naar de volgende
buffer het bufferobject waar de hoekpuntmatrices zijn opgeslagen
bindingIndex de index waaraan het bronbufferobject wordt gebonden

Opmerkingen

De afzonderlijke VAO-configuratie van het attribuutformaat kan samenwerken met glVertexAttribPointer (het laatste wordt gedefinieerd in termen van het eerste). Maar je moet voorzichtig zijn wanneer je dit doet.

De versie van de afzonderlijke attribuutindeling heeft equivalenten in Direct State Access (DSA) in 4.5. Deze hebben dezelfde parameters, maar in plaats van de gebonden VAO te gebruiken, wordt de VAO die wordt gewijzigd expliciet doorgegeven. Bij gebruik van DSA kan de glDrawElements voor glDrawElements worden ingesteld met glVertexArrayElementBuffer(vao, ebo);

Versie 3.0

Elk attribuut is gekoppeld aan een aantal componenten, type, genormaliseerd, offset, stap en VBO. De VBO wordt niet expliciet als parameter doorgegeven, maar is in plaats daarvan de buffer gebonden aan GL_ARRAY_BUFFER op het moment van de aanroep.

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

Versie 4.3

4.3

OpenGL 4.3 (of ARB_separate_attrib_format) voegt een alternatieve manier toe om de hoekpuntgegevens op te geven, waardoor een scheiding ontstaat tussen het formaat van de gegevens gebonden voor een attribuut en de bufferobjectbron die de gegevens levert. Dus in plaats van een VAO per mesh, kunt u een VAO per hoekpuntformaat hebben.

Elk kenmerk is gekoppeld aan een hoekpuntindeling en een bindpunt. Het hoekpuntformaat bestaat uit het type, het aantal componenten, of het is genormaliseerd, en de relatieve offset vanaf het begin van de gegevens tot dat specifieke hoekpunt. Het bindingspunt geeft aan uit welke buffer een attribuut zijn gegevens haalt. Door de twee te scheiden, kunt u buffers binden zonder hoekpuntformaten opnieuw te specificeren. U kunt ook de buffer wijzigen die gegevens levert aan meerdere kenmerken met een enkele bind-aanroep.

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

Vervolgens houd je tijdens het tekenen de vao gebonden en wijzig je alleen de bufferbindingen.

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow