首先,建议阅读和Qt OpenGL相关的类。本人对其中的一些类,做了一些翻译,例如:QOpenGLWidget。
环境:Ubuntu16.04, Qt 5.14.2
首先,新建立一个工程qtopengltest,使用ui designer,拖动一个widget到界面上,命名为glwidget。
根据文档,我们要建立一个继承自QOpenGLWidget和QOpenGLFunctions的子类GLWidget,并重新实现paintGL(), resizeGL(), initializeGL()这三个虚函数。
目前的代码如下:
// main.cpp
#include "mainwindow.h"
#include <QSurfaceFormat>
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QSurfaceFormat format;
format.setDepthBufferSize(24);
format.setStencilBufferSize(8);
format.setVersion(3, 2);
format.setProfile(QSurfaceFormat::CoreProfile);
QSurfaceFormat::setDefaultFormat(format);
MainWindow w;
w.show();
return a.exec();
}
//glwidget.h
#ifndef GLWIDGET_H
#define GLWIDGET_H
#include <QOpenGLWidget>
#include <QOpenGLExtraFunctions>
class GLWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
public:
explicit GLWidget(QWidget *parent = nullptr);
~GLWidget();
protected:
void resizeGL(int w, int h) override;
void initializeGL() override;
void paintGL() override;
};
#endif // GLWIDGET_H
//glwidget.cpp
#include "glwidget.h"
GLWidget::GLWidget(QWidget *parent) : QOpenGLWidget(parent)
{
}
GLWidget::~GLWidget()
{
}
void GLWidget::resizeGL(int w, int h)
{
}
void GLWidget::initializeGL()
{
}
void GLWidget::paintGL()
{
}
我们将界面上的glwidget控件提升为GLWidget.
此时我们运行程序,便会得到一个黑色背景的QOpenglWidget.
在initializeGL()
中首先需要调用initializeOpenGLFunctions();
来为当前上下文初始化OpenGL函数,即将opengl函数的上下文对象设置为当前上下文。然后将清屏颜色设置为我们想要的颜色,启用深度测试和颜色缓冲区。
在paintGL()
函数中,我们通过glClear
函数清空颜色缓冲区和深度缓冲区,然后再进行图形的绘制。
此时,代码如下:
void GLWidget::initializeGL()
{
initializeOpenGLFunctions();
// 设置清屏颜色为黑色
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
// 启用深度测试
glEnable(GL_DEPTH_TEST);
// 启用颜色缓冲区
glEnable(GL_COLOR_BUFFER_BIT);
}
void GLWidget::paintGL()
{
// 清空颜色缓冲区和深度缓冲区
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 绘制图形
// ...
//交换front和back缓冲区
auto *context = QOpenGLContext::currentContext();
context->swapBuffers(context->surface());
context->makeCurrent(context->surface());
}
接下来,绘制一个2D三角形。
本文来自博客园,原创作者:Clemens,转载请注明原文链接:https://www.cnblogs.com/errorman/p/17222596.html