Qt如何創建OpenGL的渲染窗口?
類比GLFW庫,Qt提供了OpenGL的渲染窗口類QOpenGLWidget:
1、重寫initializeGL()和resizeGL()函數來設置OpenGL狀態并提供透視圖轉換。
2、重寫paintGL()來繪制3D場景,只調用OpenGL函數。
3、還可以使用QPainter將2D圖形繪制到QOpenGLWidget子類上。在paintGL()中,不是發出OpenGL命令,而是構建一個用于部件的QPainter對象(注意QPainter沒調用OpenGL渲染)。
Qt如何實現OpenGL函數綁定?
類比GLAD庫,Qt不直接調用OpenGL函數,而是通過QOpenGLFunctions這一實例來進行函數調用,這種調用方法主要有以下兩種:
1、直接從OpenGLContext::functions()中獲取
QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();f->glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
2、繼承QOpenGLFunctions
class MyGLWidget : public QOpenGLWidget, protected QOpenGLFunctions{...void initializeGL() override{initializeOpenGLFunctions();glClearColor(...);...}...};
示例代碼:
1、創建MyOpenGLWidget.h
#ifndef MYOPENGLWIDGET_H
#define MYOPENGLWIDGET_H#include <QtOpenGLWidgets/QtOpenGLWidgets>class MyOpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
public:MyOpenGLWidget();
protected:void initializeGL() override;void resizeGL(int w, int h) override;void paintGL() override;
};#endif // MYOPENGLWIDGET_H
2、創建MyOpenGLWidget.cpp
#include "myopenglwidget.h"MyOpenGLWidget::MyOpenGLWidget() {//設置上下文屬性QSurfaceFormat format;format.setDepthBufferSize(24);format.setStencilBufferSize(8);format.setVersion(3, 3); //OpenGL 版本號3.3format.setProfile(QSurfaceFormat::CoreProfile);// 核心模式this->setFormat(format);
}void MyOpenGLWidget::initializeGL(){//綁定OpenGL函數指針?類似GLAD庫的作用?initializeOpenGLFunctions();
}void MyOpenGLWidget::paintGL(){//由于繼承了QOpenGLFunctions,可以直接使用OpenGL中的函數glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);
}void MyOpenGLWidget::resizeGL(int w, int h){}
3、調用MyOpenGLWidget類
#include "mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{_myOpenGLWidget = new MyOpenGLWidget;this->setCentralWidget(_myOpenGLWidget);//設置窗口大小this->setGeometry(0,0,800,600);
}MainWindow::~MainWindow() {if(_myOpenGLWidget)delete _myOpenGLWidget;
}