Qt下使用Shader绘制三角形

本文介绍了在Qt下利用可编程管线进行OpenGL编程的方法,通过实现QGLWidget的initializeGL(), paintGL()和resizeGL()函数,展示了如何绘制并变换三角形的基本代码。" 109397988,9117202,DRANet:轻量级场景分割的双关系感知注意力网络,"['深度学习', '计算机视觉', '图像分割', '注意力模型', '神经网络']

在Qt下使用可编程管线编写OpenGL的流程是怎样的呢? 下面演示了Qt下使用可编程管线的基本代码:(绘制三个不同的三角形,并做些旋转变换)

在Qt中,我们从QGLWidget继承,来实现OpenGL的一些绘制,主要实现其中的initializeGL(), paintGL()以及resizeGL()三个方法,基本声明如下:

#ifndef MYGLWIDGET_H
#define MYGLWIDGET_H

#include <QGLWidget>
#include <QGLShaderProgram>
#include <QVector>
#include <QVector3D>
#include <QVector4D>
#include <QMatrix4x4>
#include <QTime>
#include <QTimer>

class MyGLWidget : public QGLWidget
{
    Q_OBJECT
public:
    explicit MyGLWidget(QGLWidget *parent = 0);

protected:
    void initializeGL();
    void paintGL();
    void resizeGL(int w, int h);

private:
    void drawTriangle(const QVector<QVector4D> &colors);

        QGLShaderProgram program;
        QVector<QVector3D> vertices;
        QVector<QVector4D> colors1; //三角的颜色
        QVector<QVector4D> colors2;
        QVector<QVector4D> colors3;
        int mMVPMatrixHandle; //MVP矩阵绑定到Shader中的位置
        int mPositionHandle; //Shader中的顶点位置绑定
        int mColorHandle;   //Shader中颜色uniform变量的绑定位置

        QMatrix4x4 mModelMatrix;//模型矩阵
        QMatrix4x4 mViewMatrix; //视图矩阵
        QMatrix4x4 mProjectionMatrix; //投影矩阵
        QMatrix4x4 mMVPMatrix; //MVP矩阵

        int frames; //统计帧率
        QTime time;
        QTimer *timer;
};

#endif // MYGLWIDGET_H
与固定管线
下面是一段使用Qt Shader绘制动态三角形的代码示例: ```cpp #include <QApplication> #include <QOpenGLWidget> #include <QOpenGLShaderProgram> #include <QOpenGLFunctions> #include <QTimer> class MyOpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions { public: MyOpenGLWidget(QWidget *parent = nullptr) : QOpenGLWidget(parent) { QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(update())); timer->start(16); } protected: void initializeGL() override { initializeOpenGLFunctions(); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // 创建着色器程序 m_program = new QOpenGLShaderProgram(this); m_program->addShaderFromSourceFile(QOpenGLShader::Vertex, ":/vertex.glsl"); m_program->addShaderFromSourceFile(QOpenGLShader::Fragment, ":/fragment.glsl"); m_program->link(); // 获取着色器程序中的变量位置 m_vertexAttr = m_program->attributeLocation("vertexAttr"); m_colorAttr = m_program->attributeLocation("colorAttr"); m_matrixUniform = m_program->uniformLocation("matrix"); // 初始化顶点数据和颜色数据 m_vertices[0] = QVector3D(-0.5f, -0.5f, 0.0f); m_vertices[1] = QVector3D(0.5f, -0.5f, 0.0f); m_vertices[2] = QVector3D(0.0f, 0.5f, 0.0f); m_colors[0] = QVector3D(1.0f, 0.0f, 0.0f); m_colors[1] = QVector3D(0.0f, 1.0f, 0.0f); m_colors[2] = QVector3D(0.0f, 0.0f, 1.0f); } void resizeGL(int w, int h) override { glViewport(0, 0, w, h); } void paintGL() override { glClear(GL_COLOR_BUFFER_BIT); m_program->bind(); // 更新顶点数据和颜色数据 m_vertices[0].setX(m_vertices[0].x() + qSin(m_angle)); m_vertices[1].setX(m_vertices[1].x() + qSin(m_angle)); m_vertices[2].setX(m_vertices[2].x() + qSin(m_angle)); m_colors[0].setY(m_colors[0].y() + 0.01f); m_colors[1].setY(m_colors[1].y() + 0.01f); m_colors[2].setY(m_colors[2].y() + 0.01f); // 绑定顶点数据 m_program->setAttributeArray(m_vertexAttr, m_vertices); m_program->setAttributeArray(m_colorAttr, m_colors); // 更新变换矩阵 QMatrix4x4 matrix; matrix.ortho(-1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 100.0f); m_program->setUniformValue(m_matrixUniform, matrix); // 绘制三角形 glDrawArrays(GL_TRIANGLES, 0, 3); m_program->release(); // 更新角度 m_angle += 0.01f; } private: QOpenGLShaderProgram *m_program; int m_vertexAttr; int m_colorAttr; int m_matrixUniform; QVector3D m_vertices[3]; QVector3D m_colors[3]; float m_angle = 0.0f; }; int main(int argc, char *argv[]) { QApplication a(argc, argv); MyOpenGLWidget w; w.show(); return a.exec(); } ``` 其中,vertex.glsl和fragment.glsl分别是顶点着色器和片段着色器的代码,可以根据需要自行编写。在这个例子中,我们每次绘制时更新顶点数据和颜色数据,实现了动态效果。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值