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

时间:2015-10-12 04:22:33

标签: qt opengl vbo vao

所以我有一个带有多个标签的Qt应用程序。在其中一个标签中,我有一个QGLWidget,我试图使用VAO / VBO渲染基元。

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

    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

我在paintGL()循环中的绘图代码是这样的:

    glBindVertexArray(vao);
    glDrawArrays(GL_TRIANGLES, 0, vertices/3);
    glBindVertexArray(0);

只要首先显示带有QGLWidget的标签,这样就可以正常工作。但是,如果QGlWidget没有首先显示,这将不起作用。 VAO / VBO初始化正确发生(我已经用glGetError()检查了这一点并且事情看起来没问题),但是,因为绘制/绘制循环不会立即被调用(我必须切换到GL选项卡以使paintGL触发当我切换到GL选项卡时,没有任何渲染。同样,如果我将QGLWidget作为第一个选项卡,那么在我初始化之后几乎立即触发绘制并且一切都很好。

为什么会这样?我在这里错过了什么吗?如果绘制循环/ paintGL不会立即发生,是否有一些原因可以解释为什么初始化VAO / VBO不起作用?

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

0 个答案:

没有答案