今天正式进入Qt5.12 OpenGL 3.x以上可编程管线的代码部分。
程序主要是参考learnopengl,更多关于OpenGL的说明也可参考他们的文章。
https://learnopengl-cn.github.io/01 Getting started/03 Hello Window/
由于顶点着色器与片段着色器程序需要我们自己去实现,反而创建窗体的程序就比较少了。
.h部分:
代码语言:javascript复制#include <QOpenGLWidget>
#include <QOpenGLExtraFunctions>
class MyGLWidget : public QOpenGLWidget, protected QOpenGLExtraFunctions
{
Q_OBJECT
public:
MyGLWidget(QWidget *parent = nullptr);
~MyGLWidget();
protected:
virtual void initializeGL();
virtual void resizeGL(int w, int h);
virtual void paintGL();
void keyPressEvent( QKeyEvent *e );
};
.cpp部分:
代码语言:javascript复制#include <QKeyEvent>
MyGLWidget::MyGLWidget(QWidget *parent)
: QOpenGLWidget(parent)
{
// setGeometry( 0, 0, 800, 600 );
resize(800, 600);
setWindowTitle( "A goose's OpenGL Framework" );
}
MyGLWidget::~MyGLWidget()
{
}
void MyGLWidget::initializeGL()
{
//要在调用任何gl函数前调用该函数!!
this->initializeOpenGLFunctions();
}
//改变窗口大小时调用
void MyGLWidget::resizeGL(int w, int h)
{
//开始渲染前,必须告诉OpenGL渲染窗口的尺寸大小,即视口(Viewport),
//这样OpenGL才只能知道怎样根据窗口大小显示数据和坐标
glViewport(0, 0, w, h);
qDebug() << "w h" << w << h;
}
//每一帧绘制的函数
void MyGLWidget::paintGL()
{
glClearColor(0.2f, 0.3f, 0.3f, 1.0f); //清空屏幕所用的颜色,参数分别为红、绿、蓝以及透明度
//使用三种颜色的分量可配置出超过1600万种不同的颜色
glClear(GL_COLOR_BUFFER_BIT); //清空屏幕的颜色缓冲
}
void MyGLWidget::keyPressEvent(QKeyEvent *e)
{
//ESC 按下后,关闭窗体
switch ( e->key() )
{
case Qt::Key_Escape:
close();
break;
}
}
程序效果:
小结:涉及到图形学编程,尤其是之前从未接触过的,入门还是有一定难度。我也是从0开始学习的,大家可以一起交流!
对于程序中 文字解释的排版欢迎大家多提出宝贵的意见,感谢!