本篇主要讲解在Qt应用程序中进行3D绘图的一些最基本应用,并不会有很深入的探讨。
一、使用OpenGL绘制图形介绍
QOpenGLWidget类是一个用来渲染OpenGL图形的部件,它提供了在Qt应用程序中显示OpenGL图形的功能。这个类需要通过继承来进行使用,方法和使用其他QWidget部件一样来使用它即可。(PS:OpenGL是一个跨平台的用来渲染3d图形的标准API,以我的理解来看就是QtWidget通过一个函数把OpenGL图形整合到Qt应用程序中。)
下面是一个例子:
#ifndef MYOPENGLWIDGET_H
#define MYOPENGLWIDGET_H
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
class QOpenGLShaderProgram;
class MyOpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions //多继承
{
Q_OBJECT
public:
explicit MyOpenGLWidget(QWidget *parent = 0);
protected:
void initializeGL();
void paintGL();
void resizeGL(int width, int height);
private:
QOpenGLShaderProgram *program;//此处声明的QOpenGLShaderProgram对象指针,作为着色器程序。
};
#endif // MYOPENGLWIDGET_H
自定义的MyOpenGLWidget类同时继承了QOpenGLWidget类和QOpenGLFunctions类,这样就可以在类中直接使用QOpenGLFunctions中的OpenGL函数,而不需要创建QOpenGLFunctions对象。
#include "myopenglwidget.h"
#include <QOpenGLShaderProgram>
MyOpenGLWidget::MyOpenGLWidget(QWidget *parent)
: QOpenGLWidget(parent)
{
}
void MyOpenGLWidget::initializeGL()
{
// 为当前环境初始化OpenGL函数
initializeOpenGLFunctions();
// 创建顶点着色器
QOpenGLShader *vshader = new QOpenGLShader(QOpenGLShader::Vertex, this);
const char *vsrc =
"void main() { \n"
" gl_Position = vec4(0.0, 0.0, 0.0, 1.0);\n"//顶点
"} \n";
vshader->compileSourceCode(vsrc);
// 创建片段着色器
QOpenGLShader *fshader = new QOpenGLShader(QOpenGLShader::Fragment, this);
const char *fsrc =
"void main() { \n"
" gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);\n"//渲染颜色
"} \n";
fshader->compileSourceCode(fsrc);
// 创建着色器程序
program = new QOpenGLShaderProgram;
program->addShader(vshader);//addShader将已经编译好的着色器添加进去
program->addShader(fshader);
program->link();//link()函数将程序中的着色器链接到一起
program->bind();//调用bind()将该着色器程序绑定到当前OpenGL环境中
}
void MyOpenGLWidget::resizeGL(int , int )
{
}
void MyOpenGLWidget::paintGL()
{
// 绘制
glDrawArrays(GL_POINTS, 0, 1);
}
二、绘制多边形
1、使用顶点数组
#include "myopenglwidget.h"
#include <QOpenGLShaderProgram>
MyOpenGLWidget::MyOpenGLWidget(QWidget *parent)
: QOpenGLWidget(parent)
{
}
void MyOpenGLWidget::initializeGL()
{
// 为当前环境初始化OpenGL函数
initializeOpenGLFunctions();
// 创建顶点着色器
QOpenGLShader *vshader = new QOpenGLShader(QOpenGLShader::Vertex, this);
const char *vsrc =
"in vec4 vPosition; \n"
"void main() { \n"
" gl_Position = vPosition; \n"
"} \n";
vshader->compileSourceCode(vsrc);
// 创建片段着色器