VAOs en OpenGL

Iniciado por 4dr14n31t0r, 28 Enero 2017, 19:22 PM

0 Miembros y 1 Visitante están viendo este tema.

4dr14n31t0r

Por lo que tengo entendido, se supone que si llamas a glBindVertexArray, a partir de ahi cuando llames al metodo glBindBuffer el buffer asociado se guardara en el VAO. De modo que si haces esto:

Código (cpp) [Seleccionar]
glBindVertexArray(VAOs[0]);
glBindBuffer(GL_ARRAY_BUFFER, VBOs[0]);
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_DYNAMIC_DRAW);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,2*sizeof(GLfloat),(void*)0);


Entonces a partir de aqui cada vez que hagas esto:
Código (cpp) [Seleccionar]
glBindVertexArray(VAOs[0]);

Automaticamente seria como si estuvieras haciendo esto: (Aunque no lo "haces" porque ya esta hecho, solo restauras el buffer que ya esta "hecho")
Código (cpp) [Seleccionar]

glBindBuffer(GL_ARRAY_BUFFER, VBOs[0]);
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_DYNAMIC_DRAW);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,2*sizeof(GLfloat),(void*)0);


Pero cuando hago varios VAOs y a cada VAO le pongo un VBO, por alguna razon cuando pongo el primer, segundo o tercer VAO y compruebo cual es el VBO actual, se me queda en el ultimo VBO con el que llame al metodo glBindBuffer. ¿Por que? Yo digo algo asi:
Código (cpp) [Seleccionar]
glBindVertexArray(VAOs[0]);
glBindBuffer(GL_ARRAY_BUFFER, VBOs[0]);
glBindVertexArray(VAOs[1]);
glBindBuffer(GL_ARRAY_BUFFER, VBOs[1]);
glBindVertexArray(VAOs[2]);
glBindBuffer(GL_ARRAY_BUFFER, VBOs[2]);

glBindVertexArray(VAOs[0]);
GLint n;
glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &n);
std::cout << "VBO ACTUAL: " << n << std::endl;//Imprime VBOs[2] pero deberia imprimir VBOs[0]

ivancea96

No has puesto glVertexAttribPointer tras cada glBindBuffer. glBindBuffer no modifica el VAO.

4dr14n31t0r

#2
Entonces cuando llamo a glVertexAttribPointer es cuando lo meto dentro del VAO? ok
Pero entonces ¿Como puedo guardar en un VAO varios VBOs? ¿Y como puedo usarlos?

ivancea96

Mm te dejoe ste link que encontré con un ejemplo: http://www.morethantechnical.com/2013/11/09/vertex-array-objects-with-shaders-on-opengl-2-1-glsl-1-2-wcode/

El primer argumento de glVertexAttribPointer es el índice en el que almacenará el VBO. Luego, en el vertex shader, se asignará los valores del VBO a los attribute en las posiciones que mandaste en el primer argumento. (Todo esto lo ves mejor con el código de la web esa, los 2 primeros bloques de código)