errorman

不积跬步,无以至千里

导航

QOpenGLVertexArrayObject Class

Posted on 2023-03-16 11:10  Clemens  阅读(172)  评论(0编辑  收藏  举报

Detailed Description

顶点数组对象(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驱动程序摊销顶点数据的验证检查。

注意:顶点数组对象和所有其他OpenGL容器对象一样,是特定于它们创建的上下文的,并且不能在上下文组之间共享。

另请参见QOpenGLVertexArrayObject::Binder和QOpenGLBuffer。

 

Member Function Documentation

QOpenGLVertexArrayObject::QOpenGLVertexArrayObject(QObject *parent = nullptr)

创建一个带有给定父对象parent的QOpenGLVertexArrayObject。在使用之前,必须使用有效的OpenGL上下文调用create()方法进行创建。

 

[virtual] 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的情况下操作。这意味着必须检查isCreated()的值并在没有顶点数组对象存在时以传统的方式初始化顶点数组,而不仅仅是调用bind()方法。

另见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)来解除此顶点数组对象的绑定。