Usage of QOpenGLVertexArrayObject
Usage of QOpenGLVertexArrayObject
我有一个关于QT中VAO的问题。正如这里所假设的那样,我为初始化编写了以下代码:
void GLWidget::initializeGL() {
vao.create();
vao.bind();
// setting up buffers
buffer.create();
buffer.setUsagePattern(QOpenGLBuffer::StaticDraw);
buffer.bind();
buffer.allocate(vertices.data(), 3 * vertices.size() * sizeof(float));
vao.release();
}
在绘画阶段,我简单地做了以下事情:
void GLWidget::paintGL() {
// some other code
vao.bind();
if(shader_program->isLinked()) {
shader_program->setUniformValue("mvpMatrix", p_matrix * v_matrix * m_matrix);
// the interesting part about the buffer:
shader_program->setAttributeBuffer("vertex", GL_FLOAT, 0, 3);
shader_program->enableAttributeArray("vertex");
// the drawing
glDrawArrays(GL_TRIANGLES, 0, vertices.size());
shader_program->disableAttributeArray("vertex");
}
vao.release();
}
就我只处理一个VAO而言,这是有效的。但是,当使用多个VAO时,不会绘制任何对象或只绘制一个"对象"(缓冲区)。每个对象的代码完全相同,因此图形始终为
- 绑定VAO
- 将变量指定给着色器程序
- 绘制三角形
- 释放VAO
因此,问题是如何使用包括不同缓冲区的多个vao。
您错误地抽象了GLSL程序类。
程序本身不存储顶点数组指针和数组启用/禁用状态,VAO会存储。您需要将注释"关于缓冲区的有趣部分:"下的代码直接移动到initializeGL (...)
中,但由于GLSL程序类当前的设置方式,您还需要重构它和VAO类。
目前,initializeGL (...)
中的none命令实际上会影响VAO的状态-您正在使用其间的一些不相关的命令绑定和解除绑定VAO(我将在下面解释)。
请注意,VAO并不显式存储顶点缓冲区绑定,但数组指针是相对于调用函数时绑定的VBO。VAO执行,存储元素缓冲区绑定(对于
glDrawElements (...)
)。当您重新使用VAO类工具时,这可能会成为重要的知识。
使用VAO时,在绘制前后也不应启用和禁用阵列,这也是创建VAO的部分原因。绘制前绑定VAO,它负责启用所需的所有阵列,并禁用不需要的阵列(应在initializeGL (...)
函数中建立)。
相关文章:
- 没有找到相关文章