【问题标题】:Multiple Vertex Buffers OpenGL c++多个顶点缓冲区OpenGL c ++
【发布时间】:2026-01-27 06:45:02
【问题描述】:

我想绘制 2 个顶点缓冲区,但它只绘制第二个。我正在使用 OpenGL 4.6 和 COMPAT 配置文件。代码:

    float buffer[] =
    {
        0.0f,0.0f,
        1.0f,0.0f,
        1.0f,1.0f
    };
    float buffera[] =
    {
        0.0f,0.0f,
        1.0f,0.0f,
        1.0f,-1.0f
    };
    unsigned int id;
    glGenBuffers(1, &id);
    glBindBuffer(GL_ARRAY_BUFFER, id);
    glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), buffer, GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (const void*)8);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    unsigned int ida;
    glGenBuffers(1, &ida);
    glBindBuffer(GL_ARRAY_BUFFER, ida);
    glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), buffera, GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (const void*)8);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    unsigned int indices[]
    {
        0,1,2
    };

然后绘制调用:

glBindBuffer(GL_ARRAY_BUFFER, id);
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, indices);
glBindBuffer(GL_ARRAY_BUFFER, ida);
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, indices);

【问题讨论】:

    标签: c++ opengl


    【解决方案1】:

    当调用glVertexAttribPointer 时,当前绑定到目标ARRAY_BUFFER 的缓冲区与属性相关联。绑定缓冲区对象是不够的。您必须在绘制对象之前进行顶点规范:

    glBindBuffer(GL_ARRAY_BUFFER, id);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (const void*)8);
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, indices);
    
    glBindBuffer(GL_ARRAY_BUFFER, ida);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (const void*)8);
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, indices);
    

    我建议使用Vertex Array Object。 VAO用于存储顶点规范。

    unsigned int vao1;
    glGenVertexArrays(1, &vao1);
    glBindVertexArray(vao1);
    
    unsigned int id;
    glGenBuffers(1, &id);
    glBindBuffer(GL_ARRAY_BUFFER, id);
    glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), buffer, GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (const void*)8);
    
    unsigned int vao2;
    glGenVertexArrays(1, &vao2);
    glBindVertexArray(vao2);
    
    unsigned int ida;
    glGenBuffers(1, &ida);
    glBindBuffer(GL_ARRAY_BUFFER, ida);
    glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), buffera, GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (const void*)8);
    
    glBindVertexArray(vao1);
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, indices);
    glBindVertexArray(vao2);
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, indices);
    

    【讨论】:

      【解决方案2】:

      由于您没有使用 VAO,因此仅绑定缓冲区是不够的。确定绘制命令从哪个缓冲区读取的命令是glVertexAttribPointer。您必须将此命令移动到绘图命令中(并且由于它们没有做任何事情,因此将它们从初始化中删除。

      代码应该是这样的:

      初始化:

      unsigned int id;
      glGenBuffers(1, &id);
      glBindBuffer(GL_ARRAY_BUFFER, id);
      glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), buffer, GL_STATIC_DRAW);
      
      unsigned int ida;
      glGenBuffers(1, &ida);
      glBindBuffer(GL_ARRAY_BUFFER, ida);
      glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), buffera, GL_STATIC_DRAW);
      

      绘图:

      glEnableVertexAttribArray(0);
      
      glBindBuffer(GL_ARRAY_BUFFER, id);
      glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (const void*)8);
      glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, indices);
      
      glBindBuffer(GL_ARRAY_BUFFER, ida);
      glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (const void*)8);
      glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, indices);
      

      【讨论】: