初次接触QT OpenGL,过程中还是有一些坑的,记录一下。(QT5.7)
#-------------------------------------------------
#
# Project created by QtCreator 2020-01-07T11:45:47
#
#-------------------------------------------------
QT += core gui opengl
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = myGl
TEMPLATE = app
SOURCES += main.cpp\
MyGLWidget.cpp
HEADERS += \
MyGLWidget.h
FORMS += MainWindow.ui
.pro文件中主要需要添加QT += opengl这一句,需要包含opengl模块,要使用QT的OpenGL,需要继承QGLWidget类,然后实现QGLWidget提供了三个虚函数:
initializeGL():设置OpenGL渲染环境,定义显示列表等。该函数只在第一次调用resizeGL()或paintGL()前被调用一次;
resizeGL():设置OpenGL的视口、投影等。每次部件改变大小时都会调用该函数;
paintGL():渲染OpenGL场景。每当部件需要更新时都会调用该函数。
//MyGLWidget.h
#ifndef MYGLWIDGET_H
#define MYGLWIDGET_H
#include
#include
class MyGLWidget : public QGLWidget //需要继承QGLWidget类
{
Q_OBJECT
public:
explicit MyGLWidget(QWidget *parent = 0);
~MyGLWidget();
protected:
void initializeGL();
void resizeGL(int w, int h);
void paintGL();
};
#endif // MYGLWIDGET_H
//MyGLWidget.cpp
#include "MyGLWidget.h"
#include //需要添加头文件,QT版本不同,文件名可能不同
MyGLWidget::MyGLWidget(QWidget *parent) : QGLWidget(parent)
{
}
MyGLWidget::~MyGLWidget()
{
}
void MyGLWidget::initializeGL()
{
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_SMOOTH);
glClearDepth(1.0);
glEnable(GL_DEPTH_TEST);
}
void MyGLWidget::resizeGL(int w, int h)
{
glViewport(0, 0, (GLint)w, (GLint)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, (GLfloat)w/(GLfloat)h, 0.1, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void MyGLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
//绘制三角形
glTranslatef(-2.0, 0.0, -6.0);
glBegin(GL_TRIANGLES); //绘制三角形
glVertex3f(0.0, 1.0, 0.0);
glVertex3f(-1.0, -1.0, 0.0);
glVertex3f(1.0, -1.0, 0.0);
glEnd();
//绘制四边形
glTranslated(4.0, 0.0, 0.0);
glBegin(GL_QUADS); //绘制四边形
glVertex3f(-1.0, 1.0, 0.0);
glVertex3f(1.0, 1.0, 0.0);
glVertex3f(1.0, -1.0, 0.0);
glVertex3f(-1.0, -1.0, 0.0);
glEnd();
}
在开始绘制以前,先要使用glClear()清除屏幕和深度缓存。然后重置了模型视图矩阵,这样便将当前点移动到了窗口的中心,现在窗口中心即为坐标原点,X轴从左到右,Y轴从下到上,Z轴从里到外。完成这两步以后就可以进行图形的绘制了,在图形绘制开始时,一般会使用glTranslatef()来移动坐标原点,它是相对于当前点来移动的,比如这里先将坐标原点左移2.0,向里移6.0,然后绘制了三角形(TRIANGLES)。绘制从glBegin()开始,到glEnd()结束,使用glVertex3f()来设置各个顶点的坐标,顶点的绘制顺序可以是顺时针,也可以是逆时针。要注意逆时针绘制出来的是正面,而顺时针绘制出来的是反面,这一点在后面的纹理贴图部分会显示出来。当绘制完三角形以后,又将原点相对于当前点向右移动了4.0,然后绘制了一个四边形(QUADS)。
// main.cpp
#include "MyGLWidget.h"
#include
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyGLWidget w;
w.resize(400, 300);
w.show();
return a.exec();
}
然后执行qmake,应该没有问题,点击构建,应该会报链接错误,这需要引入库文件
在.pro中加入下边这两行
win32: LIBS += -lOpenGL32
win32: LIBS += -lGlU32
清理,然后重新qmake和构建,运行结果如下: