Qt中OpenGL的使用
OpenGL是一个跨平台的图形编程接口(API),用于绘制从简单的2D对象到比较复杂的3D对象。OpenGL包括两个部分,OpenGL工具函数库(GLU)和OpenGL实用工具库(GLUT),Visual Studio在安装的时候就安装了GLU,所以我们只要安装GLUT就好。OpenGL的实现利用了图形加速硬件,这些实现一般由显示设备厂商提供。但真正使用时,一般采用基于 GL 的第三方库,用于在程序的运行期判断当前硬件是否支持相关的扩展,防止程序崩溃甚至造成硬件损坏。第三方库有glad
、glew
、glfw
、freeglut
等。
对于三维模型,常用的软件有solidworks,AutoCAD等,可以采用这些软件画出后导出stl模型文件。
通过继承QOpenGLWidget和QOpenGLExtraFunctions,重载void initializeGL(),void paintGL()还有void resizeGL(int w, int h)三个函数进行绘图
创建一个QWidget
继承QOpenGLWidget和QOpenGLExtraFunctions
#include <QOpenGLWidget>
#include <QOpenGLExtraFunctions>
class OpenGLWidget : public QOpenGLWidget, public QOpenGLExtraFunctions
重载initializeGL(),paintGL()和resizeGL(int w, int h)
在initializeGL()函数中做一些基本的初始化
OpenGL本身的API只提供了“函数定义”,所以所有的实现实际上是操作系统或者其它库的工作。
初始化OpenGL函数的目的,就是加载这些OpenGL的实现。
protected:
virtual void initializeGL() override;
virtual void resizeGL(int x, int y) override;
virtual void paintGL() override;
在initializeGL()函数中做一些基本的初始化
OpenGL本身的API只提供了“函数定义”,所以所有的实现实际上是操作系统或者其它库的工作。
初始化OpenGL函数的目的,就是加载这些OpenGL的实现。
initializeOpenGLFunctions();
设置一些OpenGL的特性,例如深度测试。
深度测试是指,“近处的物体会遮挡远处的物体”这种在现实中最为基础的法则。
glEnable(GL_DEPTH_TEST);
设置一下刷新时的背景颜色,四个参数分别为R,G,B,A,的值,取值范围[0, 1]。
glClearColor(0, 0.5, 0.7, 1);
创建缓存
OpenGL的世界中,想要绘制3D图像,3个点,就可以确认一个三角形。将顶点中的x,y,z每个值,一个一个的放到缓存中。
OpenGL中存在两个概念:
VAO指的是顶点列表对象,VBO指的是顶点缓存对象。
VAO可以帮助我们在绘制多个3D物品时,将各自物品的绘制状态给隔离。即:每个物品都可以有自己的顶点缓存,shader,以及其它的各种各样的状态。VAO会帮你把这些状态保存下来,下一次执行的时候,你就不需要重复的设置这些状态了。简单来说就是:一次设置,到处使用。
#include <QOpenGLVertexArrayObject>
#include <QOpenGLBuffer>
QOpenGLVertexArrayObject m_vao;
QOpenGLBuffer m_vbo;
m_vao.create();
m_vbo.create();
该文章会更新,欢迎大家批评指正。