Szukaj…


Wprowadzenie

Obiekt tablicy wierzchołków przechowuje sposób, w jaki opengl powinien interpretować zestaw VBO.

Zasadniczo pozwoli ci to uniknąć wywoływania glVertexAttribPointer za każdym razem, gdy chcesz renderować nową siatkę.

Jeśli nie chcesz zajmować się VAO, możesz po prostu utworzyć i powiązać go podczas inicjalizacji programu i udawać, że nie istnieją.

Składnia

  • void glEnableVertexAttribArray (GLuint attribIndex);

  • void glDisableVertexAttribArray (GLuint attribIndex);

  • void glVertexAttribPointer (GLuint attribIndex, rozmiar GLint, typ GLenum, GLboolean znormalizowany, GLsizei stride, const GLvoid * wskaźnik);

  • void glVertexAttribFormat (indeks atrybutu GLuint, rozmiar GLint, typ GLenum, znormalizowany GLboolean, offset względny GLuint);

  • void glVertexAttribBinding (GLuint attribIndex, GLuint bindingIndex);

  • void glBindVertexBuffer (indeks wiązania GLuint, bufor GLuint, przesunięcie GLintptr, krok GLintptr);

Parametry

parametr Detale
attribIndex lokalizacja atrybutu wierzchołka, do którego tablica wierzchołków będzie przekazywać dane
rozmiar liczba składników do pobrania z atrybutu
rodzaj Typ C ++ danych atrybutów w buforze
znormalizowany czy mapować typy liczb całkowitych na zakres zmiennoprzecinkowy [0, 1] (dla niepodpisanego) czy [-1, 1] (dla podpisanego)
wskaźnik bajt przesunięty do bufora do pierwszego bajtu danych atrybutu (rzut na void* z powodów starszego typu)
offsetowy przesunięcie bajtu podstawowego od początku bufora do miejsca, w którym zaczynają się dane tablicy
relativeOffset przesunięcie do określonego atrybutu względem przesunięcia podstawowego dla bufora
krok liczba bajtów z danych jednego wierzchołka do następnego
bufor obiekt bufora, w którym przechowywane są tablice wierzchołków
bindIndex indeks, z którym zostanie powiązany obiekt bufora źródłowego

Uwagi

Oddzielna konfiguracja formatu atrybutów VAO może współpracować z glVertexAttribPointer (ten drugi jest zdefiniowany w odniesieniu do tego pierwszego). Musisz jednak zachować ostrożność.

Oddzielna wersja formatu atrybutu ma odpowiedniki bezpośredniego dostępu do stanu (DSA) w 4.5. Będą miały te same parametry, ale zamiast korzystać z powiązanego VAO, modyfikowany VAO jest przekazywany jawnie. Podczas korzystania z bufora indeksu DSA dla glDrawElements można ustawić za pomocą glVertexArrayElementBuffer(vao, ebo);

Wersja 3.0

Każdy atrybut jest powiązany z liczbą składników, typem, znormalizowanym, przesunięciem, krokiem i VBO. VBO nie jest jawnie przekazywany jako parametr, ale zamiast tego jest buforem powiązanym z GL_ARRAY_BUFFER w momencie wywołania.

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

Wersja 4.3

4.3

OpenGL 4.3 (lub ARB_separate_attrib_format) dodaje alternatywny sposób określania danych wierzchołków, który tworzy separację między formatem danych powiązanych dla atrybutu a źródłem obiektu buforowego, który dostarcza dane. Więc zamiast VAO na siatkę, możesz mieć VAO na format wierzchołka.

Każdy atrybut jest powiązany z formatem wierzchołka i punktem wiązania. Format wierzchołka składa się z typu, liczby składników, czy jest znormalizowany, i względnego przesunięcia od początku danych do tego konkretnego wierzchołka. Punkt powiązania określa, z którego bufora atrybut pobiera dane. Oddzielając je, możesz łączyć bufory bez ponownego określania formatów wierzchołków. Możesz także zmienić bufor, który dostarcza dane do wielu atrybutów za pomocą pojedynczego wywołania wiązania.

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

Następnie podczas losowania trzymasz vao związane i zmieniasz tylko wiązania buforowe.

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow