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

Posted

技术标签:

【中文标题】在绑定到一个 vao 的 vbo 之间切换【英文标题】:switch between vbo binded to one vao 【发布时间】:2014-11-03 12:28:08 【问题描述】:

目前在我的渲染函数中,我使用一个 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】:

3 分:

    您可以在循环外一次生成所有缓冲区:

    glGenBuffers (4,&vboID[0]); 
    

    你没有初始化 vbos 中的数据(我可以看到)

    您将需要再次遍历 vbo 并设置 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);
    

【讨论】:

感谢“棘轮怪胎”,现在我问,为什么要使用 VAO? ,如果我应该在每一帧的渲染函数中再次绑定每个vbo?否则,您可以给我一个示例,说明它如何将多个 vbo 链接到单个 vao?,谢谢!

以上是关于在绑定到一个 vao 的 vbo 之间切换的主要内容,如果未能解决你的问题,请参考以下文章

了解 VAO、VBO 和程序

VAO 与 VBO 和 IBO 的手动绑定

多个网格、多个 VBO、多个 VAO、OpenGL 4.1

多个缓冲器和 VAO 性能

VBO必须在VAO之后绑定

每个 VBO 都需要一个 VAO 吗?