所以我有一个带有多个选项卡的 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 draw),当我切换到 GL 选项卡时,根本没有任何渲染。同样,如果我将 QGLWidget 设为第一个选项卡,则在我初始化后几乎立即触发绘制并且一切都呈现正常。
为什么会这样?我在这里错过了什么吗?如果绘图循环/paintGL 不会立即发生,那么初始化 VAO/VBO 是否有任何原因?
我想我还应该提到我不使用着色器。这是一个遗留应用程序,所以我慢慢开始更新它。第一步是获取卡片的顶点。最初我们使用调用 glEnableClientState 而不是 VAO/VBO,但我的转换都是通过矩阵堆栈处理的,颜色是通过 glColor 指定的。