QT对OPenGL的封装

QT对OPenGL的封装

提起3D渲染大家应该都会想起OpenGL这个开源的图形学渲染库,它是目前图形学领域的工业标准之一,具有广泛的应用前景。虽然OpenGL的开发库也提供了大量的附属库包括GLUT等用于界面显示,但这些图形化界面相比与QT而言开发过程显得十分不方便,幸运的是QT目前已经提供了对于OpenGL的全方面支持,既可以直接使用OpenGL底层函数也可以运用Qt封装好的类进行实现,保证便捷性的同时不失灵活性,这对于想要开发开发出基于OpenGL界面的开发者来说是一个好消息。最近自己也有这方面的打算,刚刚接触了几天,记忆力不行了不行了,简单记录下一些基本思路,以便后续复习吧。

1:QT中支持OpenGL的类
QT进入5.0版本后,QT对OpenGL显示界面的支持结构有了较大的调整,主要整合到QT GUI中QWindow和QWidget中QOpenGLWidget两个类中。为了方便进行界面设计,一般直接继承QOpenGLWidget作为窗口部件进行布局处理。

2:OpenGL底层函数的调用
QT将OpenGL中的底层函数都封装在一个命名为QOPenGLFunctions的类中,新定义的类继承该类后即可直接对底层函数进行调用。其中可以通过QOPenGLFunctions_N_N_Cor中N的数值来制定具体的OpenGL的底层函数库版本。

3:OpenGL基本概念的迁移
在OpenGL中比较重要的几个数据存储结构包括VAO(vertex array object)、VBO(vertex buffer object)、VEO(vertex index object),他们分别对应存储数据过程中的数据结构管理、顶点数据缓存区域以及顶点数据索引。在QT中分别对用QOPenGLVertexArrayObject、QOpenGLBuffer,其中VEO也属于QOpenGLBuffer,在类的初始化构造时指定参数QOpenGLBuffer::IndexBuffer;在OpenGL中有GLShaderManager进行着色器的管理工作,在QT中也定义了QOpenGLShader和QOpenGLShaderProgram进行着色器的编码、编译和链接工作;关于OpenGL中的context的概念,当运用QOpenGLWidget时这个context是自动创建和维护的,当在其他位置需要进行OpenGL开发时需要建立QOpenGLContext类进行管理,维护一个本地OPenGL context然后使能对QSurface的渲染工作。

4:例子程序核心结构
这里QT提供了丰富的关于OPenGL的演示程序,这里着重分析下cube程序。例子中首先定义了一个渲染引擎,并在其中定义了基本的定点数据结构提,在GeometryEngine类中实现了对定点数据的定义和向GPU转移存储,这个类留下的接口函数为drawCubeGeometry(QOpenGLShaderProgram *program),通过这个接口指定渲染引擎。这里面下图函数片段实现对内存位置的对应匹配。program->attributeLacation(“ ”)实现通过名字对着色器指定变量的寻址定位,寻址完成则使能enableAttributeArray然后进行setAttributeBuffer进行内存映射,对坐标和纹理都进行类似的操作,完成后由于这里定义了indexBuf所以直接调用glDrawElemnets()实现绘图,当未定义indexBuf时一般用glDrawArrays()实现。
这里写图片描述

定义完数据类型和绘图接口后,需要进行着色器的实现,窗口事件的相应,这个过程在MainWidget类中实现。通过继承QOpenGLWidget和QOpenGLFunctions实现OpenGL窗口的绘制和OpenGL底层函数的调用。这里主要需要重定义3个虚函数:void initializeGL()、void resizeGL()以及void paintGL()。
这里写图片描述
然后在函数中实现对着色器函数的编写、编译和链接,最后将GeometryEngine作为一个私有成员进行绘图工作。
上述连个类实现了函数的基本功能,下面为了演示QOpenGL的QWidget属性,将其作为一个控件运用到窗体的布局中去:这里新定义一个主窗口类mwindow,继承子QMainWindow,然后在头文件中预定义需要用到的控件如下:
这里写图片描述
在实现过程中,将预定义的空间指针进行实例化,然后运用QT中强大的Layout进行布局:这里需要注意的是QMainWindow自带layout所以在其上直接进行layout会报错已定义,一个解决方法是新定义一个QWidget对象,并通过setCentraWidget()将其设置为中心窗体,然后将空间布局在其上。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/RaoJohn/article/details/78654417