【问题标题】:C++ OpenGL, why isn't the vertex array binding the vertex buffer?C++ OpenGL,为什么顶点数组不绑定顶点缓冲区?
【发布时间】:2020-07-02 11:24:08
【问题描述】:

我很确定顶点数组没有绑定顶点缓冲区,因为如果我注释掉我取消绑定顶点缓冲区的行,它工作得非常好,这表明顶点数组没有正确绑定顶点缓冲区. 这是代码(程序和窗口周围有一些抽象,但与问题无关):

GLuint va;
glGenVertexArrays(1, &va);
glBindVertexArray(va);

GLuint vb;
glGenBuffers(1, &vb);
glBindBuffer(GL_ARRAY_BUFFER, vb);

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, (2 + 3) * sizeof(float), nullptr);
glBindAttribLocation(program.id(), 0, "i_position");
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, (2 + 3) * sizeof(float), (const void*)(2 * sizeof(float)));
glBindAttribLocation(program.id(), 1, "i_color");

glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0); //< if this line is commented out it works perfectly fine

program.bind();

while(window->isOpen())
{
    glfwPollEvents();

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    glBindVertexArray(va);
    glBufferData(GL_ARRAY_BUFFER, 3 * (2 + 3) * sizeof(float), vertexes, GL_DYNAMIC_DRAW);
    glDrawArrays(GL_TRIANGLES, 0, 3);

    window->update();
}

有人知道我做错了什么吗?

【问题讨论】:

    标签: c++ opengl data-binding vertex-buffer vertex-array


    【解决方案1】:

    VAO 不存储缓冲区绑定。它只存储哪个缓冲区绑定到哪个属性。如果您需要自己绑定缓冲区(例如,对于glBufferData),您必须自己绑定缓冲区。

    另请注意,glBindAttribLocation 必须在程序对象链接之前调用。

    【讨论】:

    • 这是否意味着在顶点数组和顶点缓冲区绑定后,顶点数组可以阻止您重复顶点属性代码?
    • 是的。 VAO 存储顶点属性设置。基本上是glVertexAttribPointerglEnableVertexAttribArray(以及这些命令所需的一切)。不需要再次绑定缓冲区,只要只使用顶点属性设置即可(例如,绘制时)。但是由于您上传新数据并需要GL_ARRAY_BUFFER 绑定(它不是VAO 状态的一部分),因此您必须再次绑定缓冲区。
    猜你喜欢
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 2011-08-01
    相关资源
    最近更新 更多