QOpenGLVertexArrayObject 类

QOpenGLVertexArrayObject 类封装了一个 OpenGL 顶点数组对象。 更多...

头文件 #include <QOpenGLVertexArrayObject>
CMakefind_package(Qt6 REQUIRED COMPONENTS OpenGL)
target_link_libraries(mytarget PRIVATE Qt6::OpenGL)
qmakeQT += opengl
继承 QObject

公共类型

Binder

公共函数

QOpenGLVertexArrayObject(QObject *parent = nullptr)
virtual~QOpenGLVertexArrayObject()
voidbind()
boolcreate()
voiddestroy()
boolisCreated() const
GLuintobjectId() const
voidrelease()

详细描述

顶点数组对象 (VAO) 是一个 OpenGL 容器对象,用于封装指定每顶点属性数据的 OpenGL 管道所需的状态。换句话说,VAO 记录了缓冲对象(参见 QOpenGLBuffer)及其相关状态(例如,顶点属性除数)。这允许一种非常简单高效的切换 OpenGL 缓冲状态的方法,以渲染场景中的不同“对象”。QOpenGLVertexArrayObject 类是 OpenGL VAO 的一种瘦封装。

对于桌面,VAO 在 OpenGL 3.0 或更高版本中被作为核心功能支持,并由 GL_ARB_vertex_array_object 在旧版本中支持。在 OpenGL ES 2 中,VAO 由可选的 GL_OES_vertex_array_object 扩展提供。您可以使用 QOpenGLContext::surfaceFormat() 检查 OpenGL 的版本,并使用 QOpenGLContext::hasExtension() 检查扩展的存在。

与其他 Qt OpenGL 类一样,QOpenGLVertexArrayObject 有一个 create() 函数来创建底层 OpenGL 对象。这是为了确保在那时有一个有效的当前 OpenGL 上下文。

创建 VAO 成功后,典型的使用模式是

  • 在场景初始化函数中,对于每个可视对象
    • 绑定 VAO
    • 设置此可视对象的顶点数据状态(顶点、法线、纹理坐标等)
    • 解绑(release)VAO
  • 在渲染函数中,对于每个可视对象
    • 绑定 VAO(如果需要,则绑定着色程序)
    • 调用 glDraw*() 函数
    • 解绑(release)VAO

在渲染函数中绑定 VAO 的行为会将初始化阶段设置的 所有顶点数据状态恢复。这样我们可以设置大量状态来设置 VAO,并有效地在要渲染的对象的状态集中切换。使用 VAO 也允许 OpenGL 驱动程序分摊对顶点数据的验证检查。

注意:顶点数组对象(Vertex Array Objects,简称VAO),和其他所有OpenGL容器对象一样,具有创建它们的上下文特有的属性,并且它们无法在上下文组之间共享。

参见:QOpenGLVertexArrayObject::BinderQOpenGLBuffer

成员函数文档

[显式构造函数] QOpenGLVertexArrayObject::QOpenGLVertexArrayObject(QObject *parent = nullptr)

使用指定的 parent 创建一个 QOpenGLVertexArrayObject。在使用之前,必须使用有效的 OpenGL 上下文中调用 create()。

[虚函数, noexcept] QOpenGLVertexArrayObject::~QOpenGLVertexArrayObject()

销毁 QOpenGLVertexArrayObject 和其底层的 OpenGL 资源。

void QOpenGLVertexArrayObject::bind()

将此顶点数组对象绑定到 OpenGL 绑定点。从此刻起,直到调用 release() 或者另一个顶点数组对象被绑定,对顶点数据状态所做的任何修改都会存储在这个顶点数组对象中。

如果之后绑定了另一个顶点数组对象,你可以通过再次调用此对象的 bind() 来在此对象上恢复与该对象关联的设置集合。这允许在渲染函数之间有效地更改顶点数据状态。

bool QOpenGLVertexArrayObject::create()

创建底层的 OpenGL 顶点数组对象。此函数成功执行之前,必须有支持顶点数组对象的当前 OpenGL 上下文。

如果成功创建了 OpenGL 顶点数组对象,则返回 true

当返回值是 false 时,顶点数组对象支持不可用。这不是错误:在 OpenGL 2.x 或 OpenGL ES 2.0 系统上可能不支持顶点数组对象。在这种情况下,应用程序可以自由继续执行,但必须准备以无 VAO 的方式进行操作。这意味着不是仅仅调用 bind(),而是必须检查 isCreated() 的值,在没有顶点数组对象的情况下以传统的模式初始化顶点数组。

参见:isCreated

void QOpenGLVertexArrayObject::destroy()

销毁底层的 OpenGL 顶点数组对象。此函数成功执行之前,必须有支持顶点数组对象的当前 OpenGL 上下文。

bool QOpenGLVertexArrayObject::isCreated() const

如果底层 OpenGL 顶点数组对象已创建,则返回 true。如果这个返回值是 true,并且关联的 OpenGL 上下文是当前的,那么您有权限 绑定 这个对象。

GLuint QOpenGLVertexArrayObject::objectId() const

返回底层 OpenGL 顶点数组对象的 id。

void QOpenGLVertexArrayObject::release()

解除此顶点数组对象的绑定,通过绑定默认顶点数组对象(ID = 0)。

© 2024 Qt公司。此处包含的文档贡献为各自所有者的版权。提供的文档依据自由软件基金会的GNU自由文档许可证1.3版条款授权。Qt及其相关标志为芬兰和/或其他国家的Qt公司的商标。所有其他商标均为各自所有者的财产。