在 opengl 3.1 中使用具有前向兼容性标志集的 VAO essential

Is using a VAO essential in opengl 3.1 with forward compatibility flag set

我正在创建一个程序,我正在使用 VBO 绑定顶点数据。我没有使用 VAO。当我绑定缓冲区并在绘制函数中执行 glVertexAttribPointer 时,我得到 opengl 错误 1282。我用谷歌搜索了一下,我想我需要从 opengl 3.0 开始使用 VAO。我想知道是否真的有必要在 opengl 3.0 之后使用 VAO。我不能只创建 vbo 并绑定并直接在我的绘图函数中使用它而不是使用 vbo

PS。我正在创建一个 WGL_CONTEXT_FLAGS_ARB 位设置为 WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 的 3.1 opengl 上下文。如果我不这样做,它会创建向后兼容的上下文并且工作正常。但我需要一个向前兼容的上下文。我正在创建具有以下属性的上下文

    int attribs[] =
    {
        WGL_CONTEXT_MAJOR_VERSION_ARB, 3,
        WGL_CONTEXT_MINOR_VERSION_ARB, 1,
        WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,
       0
    };

以下是我的绘制函数。我在粗体行出现错误

void DrawFunc(MtColor& color, float* matrix, GLuint bufferIndex, int numVertices, GLenum mode)
{
    GLuint e = glGetError();
    glUseProgram(m_Program);
    e = glGetError();
    glBindBuffer(GL_ARRAY_BUFFER, bufferIndex);
    e = glGetError();

    // Now set uniforms.
    glUniform4fv(m_uniforms[COLOR_HANDLE], 1, color.AsFloat());
    glUniformMatrix4fv(m_uniforms[MVP_HANDLE], 1, false, matrix);
    e = glGetError();
    glEnableVertexAttribArray(m_attributes[POSITION_HANDLE]);
    e = glGetError();
    glVertexAttribPointer(m_attributes[POSITION_HANDLE], 3, GL_FLOAT, false, 3 * sizeof(GLfloat), 0);
    **e = glGetError();**
    glDrawArrays(mode, 0, numVertices);

    glDisableVertexAttribArray(m_attributes[POSITION_HANDLE]);

}

如果您创建一个向前兼容的上下文,那么您需要一个 VAO。

但是您可以创建并绑定一个,然后将其忘掉。不建议这样做,但可以。

//before uploading your model
int vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

然而,如果使用得当,绘制函数可以减少为:

void DrawFunc(MtColor& color, float* matrix, GLuint vao, int numVertices, GLenum mode)
{
    GLuint e = glGetError();
    glUseProgram(m_Program);
    e = glGetError();

    // Now set uniforms.
    glUniform4fv(m_uniforms[COLOR_HANDLE], 1, color.AsFloat());
    glUniformMatrix4fv(m_uniforms[MVP_HANDLE], 1, false, matrix);

    glBindVertexArray(vao);
    glDrawArrays(mode, 0, numVertices);
    glBindVertexArray(0);

}