前言:
OpenGl 是一個跨平臺的用來渲染3D圖形的標註API,Qt 對OpenGL提供了強大的支持。Qt4時代的Qt OpenGl 模塊在Qt5中已經不再建議使用,OpenGL相關的類被移到了Qt GUI模塊。Qt Widgets 模塊中的QOpenGLWidget類提供了一個可以渲染OpenGL圖形的部件,通過該部件可以輕鬆將OpenGL圖形整合到Qt應用程序中。本入門系列,僅涉及在Qt 應用程序中進行3D繪圖的一些最基本應用。
教程一搭建基本的qt opengl 框架,並繪製一個點
//myopenglwidget.h
#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;
};
#endif // MYOPENGLWIDGET_H
//myopenglwidget.cpp
#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);
program->addShader(fshader);
program->link();
program->bind();
}
void MyOpenGLWidget::resizeGL(int , int )
{
}
void MyOpenGLWidget::paintGL()
{
// 繪製
glDrawArrays(GL_POINTS, 0, 1);
}
//main.cpp
#include <QApplication>
#include "myopenglwidget.h"
int main(int argc, char *argv[])
{
QApplication app(argc,argv);
MyOpenGLWidget w;
w.resize(400, 300);
w.show();
return app.exec();
}
結果: