Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: 4dr14n31t0r en 28 Enero 2017, 19:22 pm



Título: VAOs en OpenGL
Publicado por: 4dr14n31t0r en 28 Enero 2017, 19:22 pm
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
  1. glBindVertexArray(VAOs[0]);
  2. glBindBuffer(GL_ARRAY_BUFFER, VBOs[0]);
  3. glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_DYNAMIC_DRAW);
  4. glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,2*sizeof(GLfloat),(void*)0);

Entonces a partir de aqui cada vez que hagas esto:
Código
  1. 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
  1. glBindBuffer(GL_ARRAY_BUFFER, VBOs[0]);
  2. glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_DYNAMIC_DRAW);
  3. 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
  1. glBindVertexArray(VAOs[0]);
  2. glBindBuffer(GL_ARRAY_BUFFER, VBOs[0]);
  3. glBindVertexArray(VAOs[1]);
  4. glBindBuffer(GL_ARRAY_BUFFER, VBOs[1]);
  5. glBindVertexArray(VAOs[2]);
  6. glBindBuffer(GL_ARRAY_BUFFER, VBOs[2]);
  7.  
  8. glBindVertexArray(VAOs[0]);
  9. GLint n;
  10. glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &n);
  11. std::cout << "VBO ACTUAL: " << n << std::endl;//Imprime VBOs[2] pero deberia imprimir VBOs[0]


Título: Re: VAOs en OpenGL
Publicado por: ivancea96 en 29 Enero 2017, 00:32 am
No has puesto glVertexAttribPointer tras cada glBindBuffer. glBindBuffer no modifica el VAO.


Título: Re: VAOs en OpenGL
Publicado por: 4dr14n31t0r en 30 Enero 2017, 22:01 pm
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?


Título: Re: VAOs en OpenGL
Publicado por: ivancea96 en 31 Enero 2017, 00:12 am
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/ (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)