Qt/OpenGL问题。除非先显示QGLWidget,否则原语不会呈现

Qt/OpenGL问题。除非先显示QGLWidget,否则原语不会呈现,qt,opengl,vbo,vao,Qt,Opengl,Vbo,Vao,因此,我有一个具有多个选项卡的Qt应用程序。在其中一个选项卡中,我有一个QGLWidget,我试图在其中使用VAO/VBOs渲染原语 我的初始化代码如下所示: glGenVertexArrays(1, &vao); glGenBuffers(2, buffer); glBindVertexArray(vao); glBindBuffer(GL_ARRAY_BUFFER, buffer[0]); glBufferData(GL_ARRAY_BUFF

因此,我有一个具有多个选项卡的Qt应用程序。在其中一个选项卡中,我有一个QGLWidget,我试图在其中使用VAO/VBOs渲染原语

我的初始化代码如下所示:

    glGenVertexArrays(1, &vao);
    glGenBuffers(2, buffer);

    glBindVertexArray(vao);
    glBindBuffer(GL_ARRAY_BUFFER, buffer[0]);
    glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(float), &vertices[0], GL_STATIC_DRAW);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(0);

    glBindBuffer(GL_ARRAY_BUFFER, buffer[1]);
    glBufferData(GL_ARRAY_BUFFER, normals.size() * sizeof(float), &normals[0], GL_STATIC_DRAW);

    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(1);

    glBindVertexArray(0);  // Unbind VAO
    glBindVertexArray(vao);
    glDrawArrays(GL_TRIANGLES, 0, vertices/3);
    glBindVertexArray(0);
我在paintGL()循环中的绘图代码如下所示:

    glGenVertexArrays(1, &vao);
    glGenBuffers(2, buffer);

    glBindVertexArray(vao);
    glBindBuffer(GL_ARRAY_BUFFER, buffer[0]);
    glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(float), &vertices[0], GL_STATIC_DRAW);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(0);

    glBindBuffer(GL_ARRAY_BUFFER, buffer[1]);
    glBufferData(GL_ARRAY_BUFFER, normals.size() * sizeof(float), &normals[0], GL_STATIC_DRAW);

    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(1);

    glBindVertexArray(0);  // Unbind VAO
    glBindVertexArray(vao);
    glDrawArrays(GL_TRIANGLES, 0, vertices/3);
    glBindVertexArray(0);
只要首先显示带有QGLWidget的我的选项卡,这就可以正常工作。但是,如果QGlWidget没有首先显示,那么这将不起作用。VAO/VBO初始化正确(我用glGetError()检查了这一点,事情看起来还不错),但是,因为在之后不会立即调用绘制/绘制循环(我必须切换到绘图GL的GL选项卡以触发绘制),所以切换到GL选项卡时根本不会渲染任何内容。同样,如果我将QGLWidget设为第一个选项卡,则在初始化之后,绘图几乎立即被触发,并且所有内容都呈现良好

为什么会这样?我是不是遗漏了什么?如果绘制循环/paintGL不会立即发生,那么初始化VAO/VBOs不起作用有什么原因吗

我想我还应该提到我没有使用着色器。这是一个遗留应用程序,所以我慢慢开始更新它。第一步是获得卡片的顶点。最初我们使用对glEnableClientState的调用,而不是VAO/VBOs,但是我的转换都是通过矩阵堆栈处理的,颜色是通过glColor指定的