Estou começando a aprender OpenGL hoje com este tutorial: http://openglbook.com/the-book/
Cheguei ao capítulo 2, onde desenho um triângulo, e entendo tudo, exceto VAOs (esta sigla está OK?). O tutorial tem este código:
glGenVertexArrays(1, &VaoId);
glBindVertexArray(VaoId);
Embora eu entenda que o código é necessário, não tenho ideia do que ele faz. Embora eu nunca use o VaoId além desse ponto (exceto para destruí-lo), o código não funciona sem ele. Presumo que seja porque é obrigatório, mas não sei por quê. Esse código exato precisa apenas fazer parte de todos os programas OpenGL? O tutorial explica VAOs como:
Um Vertex Array Object (ou VAO) é um objeto que descreve como os atributos de vértice são armazenados em um Vertex Buffer Object (ou VBO). Isso significa que o VAO não é o objeto real que armazena os dados do vértice, mas o descritor dos dados do vértice. Os atributos do vértice podem ser descritos pela função glVertexAttribPointer e suas duas funções irmãs glVertexAttribIPointer e glVertexAttribLPointer, a primeira das quais exploraremos a seguir.
Não entendo como o VAO descreve os atributos do vértice. Eu não os descrevi de forma alguma. Ele obtém as informações do glVertexAttribPointer? Eu acho que deve ser isso. O VAO é simplesmente um destino para as informações do glVertexAttribPointer?
Por outro lado, o tutorial que estou seguindo é aceitável? Há algo que devo observar ou um tutorial melhor a seguir?
fonte
glVertexAttribPointer
VertexArrayMacro
ou algo semelhante.Os Vertex Array Objects são como macros em programas de processamento de texto e similares. Uma boa descrição pode ser encontrada aqui .
As macros apenas lembram as ações que você executou, como ativar este atributo, vincular aquele buffer, etc. Quando você chama
glBindVertexArray( yourVAOId )
, ele simplesmente reproduz aquelas vinculações de ponteiro de atributo e vinculações de buffer.Portanto, sua próxima chamada para desenhar usa o que foi vinculado pelo VAO.
VAO's não armazenam dados de vértice . Não. Os dados do vértice são armazenados em um buffer de vértice ou em uma matriz de memória do cliente.
fonte
Sempre penso no VAO como um conjunto de buffers de dados usados pelo OpenGL. Usando OpenGL moderno, você criará um VAO e Objetos de buffer de vértice.
A próxima etapa é vincular os dados a um buffer:
Neste ponto, o OpenGL vê:
Agora podemos usar glVertexAttribPointer para dizer ao OpenGL o que os dados no buffer representam:
OpenGL agora tem os dados no buffer e sabe como os dados são organizados em vértices. O mesmo processo pode ser aplicado a coordenadas de textura, etc., mas para coordenadas de textura haveria dois valores.
Em seguida, você pode vincular textura e desenhar matrizes, você vai querer criar um sombreador Vert e Frag, compilá-lo e anexá-lo a um programa (não incluído aqui).
fonte
VAO é um objeto que representa o estágio de busca de vértice do pipeline OpenGL e é usado para fornecer entrada para o sombreador de vértice.
Você pode criar um objeto de matriz de vértices como este
Primeiro vamos fazer um exemplo simples. Considere esse parâmetro de entrada em um código de sombreador
Para preencher este atributo, podemos usar
Embora o objeto de matriz de vértice armazene esses valores de atributos estáticos para você, ele pode fazer muito mais.
Depois de criar o objeto de array de vértices, podemos começar a preencher seu estado. Pediremos ao OpenGL para preenchê-lo automaticamente usando os dados armazenados em um objeto buffer que fornecemos. Cada atributo de vértice obtém dados de um buffer vinculado a uma das várias ligações de buffer de vértice. Para este fim usamos
glVertexArrayAttribBinding(GLuint vao, GLuint attribindex, GLuint bindingindex)
. Também usamos aglVertexArrayVertexBuffer()
função para vincular um buffer a uma das vinculações de buffer de vértice. Usamos aglVertexArrayAttribFormat()
função para descrever o layout e formato dos dados e, finalmente, habilitamos o preenchimento automático do atributo por meio de chamadaglEnableVertexAttribArray()
.Quando um atributo de vértice é ativado, o OpenGL alimenta dados para o sombreador de vértice com base no formato e nas informações de localização que você forneceu com
glVertexArrayVertexBuffer()
eglVertexArrayAttribFormat()
. Quando o atributo é desabilitado, o sombreador de vértice receberá as informações estáticas que você fornece com uma chamada paraglVertexAttrib*()
.E codificar em um shader
Afinal, você precisa ligar para
glDeleteVertexArrays(1, &vao)
.Você pode ler o OpenGL SuperBible para entendê-lo melhor.
fonte