Usage of QOpenGLVertexArrayObject

Usage of QOpenGLVertexArrayObject

本文关键字:QOpenGLVertexArrayObject of Usage      更新时间:2023-10-16

我有一个关于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时,不会绘制任何对象或只绘制一个"对象"(缓冲区)。每个对象的代码完全相同,因此图形始终为

  1. 绑定VAO
  2. 将变量指定给着色器程序
  3. 绘制三角形
  4. 释放VAO

因此,问题是如何使用包括不同缓冲区的多个vao。

您错误地抽象了GLSL程序类。

程序本身不存储顶点数组指针和数组启用/禁用状态,VAO会存储。您需要将注释"关于缓冲区的有趣部分:"下的代码直接移动到initializeGL (...)中,但由于GLSL程序类当前的设置方式,您还需要重构它和VAO类。

目前,initializeGL (...)中的none命令实际上会影响VAO的状态-您正在使用其间的一些不相关的命令绑定和解除绑定VAO(我将在下面解释)。


请注意,VAO并不显式存储顶点缓冲区绑定,但数组指针是相对于调用函数时绑定的VBO。VAO执行,存储元素缓冲区绑定(对于glDrawElements (...))。当您重新使用VAO类工具时,这可能会成为重要的知识。

使用VAO时,在绘制前后也不应启用和禁用阵列,这也是创建VAO的部分原因。绘制前绑定VAO,它负责启用所需的所有阵列,并禁用不需要的阵列(应在initializeGL (...)函数中建立)。

相关文章:
  • 没有找到相关文章