Qt中OpenGL的使用

OpenGL是一个跨平台的图形编程接口(API),用于绘制从简单的2D对象到比较复杂的3D对象。OpenGL包括两个部分,OpenGL工具函数库(GLU)和OpenGL实用工具库(GLUT),Visual Studio在安装的时候就安装了GLU,所以我们只要安装GLUT就好。OpenGL的实现利用了图形加速硬件,这些实现一般由显示设备厂商提供。但真正使用时,一般采用基于 GL 的第三方库,用于在程序的运行期判断当前硬件是否支持相关的扩展,防止程序崩溃甚至造成硬件损坏。第三方库有gladglewglfwfreeglut等。

对于三维模型,常用的软件有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();

该文章会更新,欢迎大家批评指正。