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)来解除此顶点数组对象的绑定。
本文来自博客园,原创作者:Clemens,转载请注明原文链接:https://www.cnblogs.com/errorman/p/17221549.html