初次接觸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 <QWidget>
#include <QGLWidget>
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 <GL/glu.h> //需要添加頭文件,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 <QApplication>
#include <QtWidgets>
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和構建,運行結果如下: