QOpenGLVertexArrayObject 类
QOpenGLVertexArrayObject 类封装了一个 OpenGL 顶点数组对象。 更多...
头文件 | #include <QOpenGLVertexArrayObject> |
CMake | find_package(Qt6 REQUIRED COMPONENTS OpenGL) target_link_libraries(mytarget PRIVATE Qt6::OpenGL) |
qmake | QT += opengl |
继承 | QObject |
- 包括继承成员在内的所有成员列表
- QOpenGLVertexArrayObject 是 3D 渲染 的一部分。
公共类型
公共函数
QOpenGLVertexArrayObject(QObject *parent = nullptr) | |
virtual | ~QOpenGLVertexArrayObject() |
void | bind() |
bool | create() |
void | destroy() |
bool | isCreated() const |
GLuint | objectId() const |
void | release() |
详细描述
顶点数组对象 (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::Binder 和 QOpenGLBuffer。
成员函数文档
[显式构造函数]
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公司的商标。所有其他商标均为各自所有者的财产。