可以使用Qt的OpenGL库来绘制一个三角形。相比于传统的OpenGL,Qt提供了更为方便和友好的API。
首先我们需要在Qt项目中添加OpenGL的支持,这可以在.pro
文件中添加以下语句:
QT += opengl
接着,我们需要在头文件中添加以下内容:
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QOpenGLShaderProgram>
#include <QOpenGLBuffer>
然后,在类的定义中,我们需要继承QOpenGLWidget,并实现initializeGL()
、resizeGL()
和paintGL()
三个OpenGL函数。initializeGL()
函数将会在OpenGL初始化时被调用,通过该函数创建各种OpenGL对象。resizeGL()
函数用于处理OpenGL视口的变化,在类的定义中,该函数默认为空。paintGL()
函数用于绘制OpenGL场景。
接着,在类的定义中,我们需要定义以下成员变量:
QOpenGLShaderProgram* m_shaderProgram;
QOpenGLBuffer m_vbo;
其中,m_shaderProgram
是用于存储着色器程序的指针,m_vbo
是OpenGL缓冲区对象。
最后我们在成员函数中实现OpenGL绘制代码即可:
void initializeGL() {
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
m_shaderProgram = new QOpenGLShaderProgram;
m_shaderProgram->addShaderFromSourceCode(QOpenGLShader::Vertex,
"attribute vec2 a_position;\n"
"void main() {\n"
" gl_Position = vec4(a_position, 0.0, 1.0);\n"
"}"
);
m_shaderProgram->addShaderFromSourceCode(QOpenGLShader::Fragment,
"void main() {\n"
" gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);\n"
"}"
);
m_shaderProgram->link();
QVector<float> vertices {
0.0f, 0.5f,
-0.5f, -0.5f,
0.5f, -0.5f,
};
m_vbo.create();
m_vbo.bind();
m_vbo.allocate(vertices.constData(), vertices.size() * sizeof(float));
m_vbo.release();
}
void paintGL() {
glClear(GL_COLOR_BUFFER_BIT);
m_shaderProgram->bind();
m_vbo.bind();
int a_position = m_shaderProgram->attributeLocation("a_position");
m_shaderProgram->enableAttributeArray(a_position);
m_shaderProgram->setAttributeBuffer(a_position, GL_FLOAT, 0, 2);
glDrawArrays(GL_TRIANGLES, 0, 3);
m_vbo.release();
m_shaderProgram->release();
glFlush();
}
在代码中,我们使用了QOpenGLShaderProgram
类来存储和设置着色器。在initializeGL()
函数中,我们通过该类添加了一个顶点着色器和一个片段着色器。该着色器简单地将三角形的每个顶点的坐标设置到gl_Position
中,将片段颜色设置为白色。然后使用QOpenGLBuffer
类定义并初始化了缓冲区的三个点坐标。
接着,在paintGL()
函数中,我们绑定着色器和缓冲区对象,并配置着色器程序中的a_position
属性,将其设置为颜色的数组缓冲区。然后使用glDrawArrays
函数来绘制三角形。
下面是完整的示例代码:
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QOpenGLShaderProgram>
#include <QOpenGLBuffer>
class GLWidget : public QOpenGLWidget, protected QOpenGLFunctions {
public:
GLWidget(QWidget *parent) : QOpenGLWidget(parent) {}
protected:
void initializeGL() {
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
m_shaderProgram = new QOpenGLShaderProgram;
m_shaderProgram->addShaderFromSourceCode(QOpenGLShader::Vertex,
"attribute vec2 a_position;\n"
"void main() {\n"
" gl_Position = vec4(a_position, 0.0, 1.0);\n"
"}"
);
m_shaderProgram->addShaderFromSourceCode(QOpenGLShader::Fragment,
"void main() {\n"
" gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);\n"
"}"
);
m_shaderProgram->link();
QVector<float> vertices {
0.0f, 0.5f,
-0.5f, -0.5f,
0.5f, -0.5f,
};
m_vbo.create();
m_vbo.bind();
m_vbo.allocate(vertices.constData(), vertices.size() * sizeof(float));
m_vbo.release();
}
void paintGL() {
glClear(GL_COLOR_BUFFER_BIT);
m_shaderProgram->bind();
m_vbo.bind();
int a_position = m_shaderProgram->attributeLocation("a_position");
m_shaderProgram->enableAttributeArray(a_position);
m_shaderProgram->setAttributeBuffer(a_position, GL_FLOAT, 0, 2);
glDrawArrays(GL_TRIANGLES, 0, 3);
m_vbo.release();
m_shaderProgram->release();
glFlush();
}
private:
QOpenGLShaderProgram* m_shaderProgram;
QOpenGLBuffer m_vbo;
};
#include <QApplication>
#include <QWidget>
#include <QSurfaceFormat>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QSurfaceFormat format;
format.setSamples(4);
QSurfaceFormat::setDefaultFormat(format);
QWidget mainWindow;
mainWindow.resize(640, 480);
GLWidget glWidget(&mainWindow);
glWidget.setGeometry(0,0,640,480);
mainWindow.show();
return a.exec();
}
运行该程序,将会看到一个黑色背景的白色三角形。
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,C++设计模式,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓