在vbo绑定到一个vao之间切换

时间:2014-11-03 12:28:09

标签: opengl vbo vao

目前在我的渲染功能中,我使用VAO(顶点阵列对象)和四个与此VAO绑定的VBO(顶点缓冲区对象)。

对于每个VBO,我绑定到vao

glGenVertexArrays (1, & vaoID [0]); // Create our Vertex Array Object
glBindVertexArray (vaoID [0]); // Bind our Vertex Array Object so we can use it

int i = 0;
for (i = 0; i <4, ++i)
{
glGenBuffers (1,vboID [i]); // Generate Vertex Buffer Object
glBindBuffer (GL_ARRAY_BUFFER, vboID [i]); // Bind Vertex Buffer Object
glBufferData (GL_ARRAY_BUFFER, 18 * sizeof (GLfloat) vertices, GL_STATIC_DRAW);

glVertexAttribPointer ((GLuint) 0, 3, GL_FLOAT, GL_FALSE, 0, 0);
  }

glEnableVertexAttribArray (0); // Disable Vertex Array Object
glBindVertexArray (0); // Disable Vertex Buffer Object

然后在我的渲染函数(伪代码)中,对于每个帧:

glBindVertexArray (vaoID [0]);

// here, I need to draw the four VBO, but only draws the first

glBindVertexArray (0);

我知道我可以将所有几何体放在一个VBO中,但是有些情况下它的大小超过5Mb,这可能导致(可能)它没有放在GPU上。

如何切换所有绑定的VBO来绘制它们?

1 个答案:

答案 0 :(得分:1)

3分:

  1. 你可以在循环外同时生成所有缓冲区:

    glGenBuffers (4,&vboID[0]); 
    
  2. 你没有初始化vbos中的数据(我可以看到)

  3. 您需要再次遍历vbos并设置glVertexAttribPointer

    glBindVertexArray (vaoID [0]);
    for(int i = 0; i < 4; i++){
        glBindBuffer (GL_ARRAY_BUFFER, vboID [i]);
        glVertexAttribPointer ((GLuint) 0, 3, GL_FLOAT, GL_FALSE, 0, 0);
        //drawArrays
    }
    glBindVertexArray (0);