main.cpp
#include <QGuiApplication>
#include "simpleglwindow.h"
int main(int argc, char **argv)
{
QGuiApplication app(argc, argv);
SimpleGLWindow window;
window.resize(600, 400);
window.show();
return app.exec();
}
SimpleGLWindow.h
#ifndef SIMPLEGLWINDOW_H
#define SIMPLEGLWINDOW_H
#include <QOpenGLWindow>
#include <QOpenGLFunctions_1_1>
//定义一个 SimpleGLWindow 类作为 QOpenGLWindow 和 QOpenGLFunctions_1_1 的子类
//由于我们不想允许外部访问 OpenGL 函数,因此我们对第二个基数使用受保护的继承
class SimpleGLWindow : public QOpenGLWindow, protected QOpenGLFunctions_1_1
{
public:
SimpleGLWindow(QWindow *parent = 0);
protected:
//我们重写QOpenGLWindow 的虚拟 initializeGL() 方法
void initializeGL();
void paintGL();
};
#endif // SIMPLEGLWINDOW_H
simpleglwindow.cpp
#include "simpleglwindow.h"
SimpleGLWindow::SimpleGLWindow(QWindow *parent) :
QOpenGLWindow(NoPartialUpdate, parent)
{
QSurfaceFormat fmt = format();
fmt.setSamples(16);
setFormat(fmt);
}
void SimpleGLWindow::initializeGL()
{
//该方法负责根据当前 OpenGL 上下文的参数设置所有函数(因此,首先使上下文成为当前上下文很重要,幸运的是,这在调用 initializeGL() 之前在幕后为我们完成了)
if (!initializeOpenGLFunctions()) {
qFatal("initializeOpenGLFunctions failed");
}
//在这个方法中,我们初始化我们的 QOpenGLFunctions_1_1 基类并使用它提供的 glClearColor() 函数
glClearColor(1, 1, 1, 0);
}
void SimpleGLWindow::paintGL()
{
//该函数首先清除颜色缓冲区,并将上下文的 OpenGL 视口设置为窗口的大小
glClear(GL_COLOR_BUFFER_BIT);
glViewport(0, 0, width(), height());
//告诉 OpenGL 使用 glBegin() 调用开始使用三角形绘制,并传递 GL_TRIANGLES 作为绘制模式
glBegin(GL_TRIANGLES);
{
//然后,我们传递三个顶点及其颜色以形成一个三角形
glColor3f(1, 0, 0);
glVertex3f( 0.0f, 1.0f, 0.0f);
glColor3f(0, 1, 0);
glVertex3f( 1.0f,-1.0f, 0.0f);
glColor3f(0, 0, 1);
glVertex3f(-1.0f,-1.0f, 0.0f);
}
//最后,我们通过调用 glEnd() 通知管道我们已使用当前模式完成绘制
glEnd();
}