1. 程式人生 > >vs2013使用QT自帶的openGL

vs2013使用QT自帶的openGL

基礎知識:

1 OpenGL

OpenGL中的gl庫是核心庫,glu是實用庫,glut是實用工具庫,gl是核心,glu是對gl的部分封裝,glut是OpenGL的跨平臺工具庫,gl中包含了最基本的3D函式,而glu似乎對gl的輔助,如果算數好,不用glu的情況下,也是可以做出同樣的效果。glut是基本的視窗介面,是獨立於gl和glu的。可以使用Qt視窗介面來代替glut的介面。

2 QGLWidget

QGLWidget中有三個虛擬函式。關於這三個虛擬函式,呼叫順序及功能如下:
1. initializeGL() ,在程式開始執行的時候最先被呼叫一次(當然建構函式是最先執行的,其次是initializeGL() )。用來完成相關的初始化工作,比如建立opengl繪圖的上下文環境。
2. resizeGL(),在initializeGL()完成之後被呼叫一次(實際為多次),以及在視窗位置以及大小改變時被呼叫。用於完成建立opengl檢視視窗等一系列工作。
3. paintGL(),繪製opengl影象。當視窗需要被重新整理時會被呼叫(即使用者使用updateGL()函式的時候,螢幕會被重繪),以及在resizeGL()完成之後,也會引起重繪。
程式開始>>建構函式>>initializeGL()>>resizeGL()>>paintGL()
若使用者呼叫updateGL()函式>>引起paintGL()函式的呼叫。
若視窗位置或者尺寸改變>>呼叫resizeGL()>>呼叫paintGL()

測試案例

1 新建QT專案

這裡寫圖片描述

2 勾選QT GUI的OpenGL

這裡寫圖片描述

3 選擇Form File 新增新類

這裡寫圖片描述

4 新增QT5Class

這裡寫圖片描述

5 命名方式如下,注意選擇下面的檔案

這裡寫圖片描述

6 標頭檔案和cpp檔案重寫如下:

#ifndef MY_QOPENGLWIDGET_H
#define MY_QOPENGLWIDGET_H


#include <QOpenGLWidget>
#include <QOpenGLFunctions>




class My_QOpenGLWidget : public QOpenGLWidget, protected
QOpenGLFunctions { Q_OBJECT public: My_QOpenGLWidget(QWidget *parent); ~My_QOpenGLWidget(); void initializeGL(); void resizeGL(int width, int height); void paintGL(); private: }; #endif // MY_QOPENGLWIDGET_H
#include "my_qopenglwidget.h"

My_QOpenGLWidget::My_QOpenGLWidget(QWidget *parent)
    : QOpenGLWidget(parent)
{
    // 設定OpenGL的版本資訊
        QSurfaceFormat format;
format.setRenderableType(QSurfaceFormat::OpenGL); format.setProfile(QSurfaceFormat::CoreProfile); format.setVersion(3, 3); setFormat(format); } My_QOpenGLWidget::~My_QOpenGLWidget() { } void My_QOpenGLWidget::initializeGL() { //初始化OpenGL函式 initializeOpenGLFunctions(); //設定全域性變數 glClearColor(0.0f, 0.0f, 0.0f, 1.0f); setGeometry(20, 50, 300, 200);//設定視窗初始位置和大小 glShadeModel(GL_FLAT);//設定陰影平滑模式 glClearColor(0.1, 1.0, 0.2, 0);//改變視窗的背景顏色,不過我這裡貌似設定後並沒有什麼效果 glClearDepth(1.0);//設定深度快取 glEnable(GL_DEPTH_TEST);//允許深度測試 glDepthFunc(GL_LEQUAL);//設定深度測試型別 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);//進行透視校正 } void My_QOpenGLWidget::paintGL() { //清理螢幕 glClear(GL_COLOR_BUFFER_BIT); } void My_QOpenGLWidget::resizeGL(int width, int height) { //未使用 Q_UNUSED(width); Q_UNUSED(height); }

7 開啟ui檔案,

這裡寫圖片描述

8 選擇Open GL Widget 放入

這裡寫圖片描述

9 提升Open GL Widget為My_QOpenGLWidget

這裡寫圖片描述

10 最終可以得到

這裡寫圖片描述