qt5.9QopenglWidget+glsl实现会动的三角

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QOpenGLFunctions>
#include <QOpenGLWidget>
#include <QOpenGLShader>
#include <QOpenGLShaderProgram>
#include <QOpenGLBuffer>
#include <QOpenGLVertexArrayObject>

namespace Ui {
class Widget;
}

class Widget : public QOpenGLWidget,
        protected QOpenGLFunctions
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;

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

    void timerEvent(QTimerEvent *event);

private:
    void makeObject();

    int mtID;
    QOpenGLShaderProgram *m_program;
    QOpenGLBuffer        m_vbo;
    int                  m_matrixUniform;
    QMatrix4x4           m_pMat;
};

#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QOpenGLWidget(parent),
    m_program(nullptr),
    m_vbo(QOpenGLBuffer::VertexBuffer),
    m_matrixUniform(0),
    m_pMat()
{

    this->mtID=this->startTimer(20);
}

Widget::~Widget()
{
    m_vbo.destroy();
}

void Widget::initializeGL()
{
    initializeOpenGLFunctions();
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

    m_vbo.create();

    m_program = new QOpenGLShaderProgram(this);
    if(!m_program->addShaderFromSourceFile(QOpenGLShader::Vertex,":/vs.vsh"))
        close();
    if(!m_program->addShaderFromSourceFile(QOpenGLShader::Fragment,":/fs.fsh")){
        close();
    }

    if (!m_program->link())
        close();

    m_matrixUniform = m_program->uniformLocation("matrix");

    makeObject();
}

void Widget::resizeGL(int w, int h)
{
    float aspect = float(w)/float(h?h:1);
    float fov = 45.0f, zNear = 0.1f, zFar = 100.f;
    m_pMat.setToIdentity();
    m_pMat.perspective(fov, aspect, zNear, zFar);
}

float x=0.8;
float vecx=2/2560;
void Widget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT);

    m_program->bind();

    QMatrix4x4 mvMat;
    mvMat.translate(vecx, 0.0f, -3.0f);

    m_program->setUniformValue(m_matrixUniform, m_pMat*mvMat);
    m_vbo.bind();
    glDrawArrays(GL_TRIANGLES, 0, 3);
    //m_vbo.release();

    m_program->release();

    vecx+=0.00078125;
}

void Widget::timerEvent(QTimerEvent *event){
    if(this->mtID==event->timerId()){
        this->update();
    }
}

void Widget::makeObject()
{
    float arrVertex[] = {
        //   position                 color
        0.0f, 0.707f, 0.0f,     1.0f, 0.0f, 0.0f,
        -0.5f, -0.5f, 0.0f,     0.0f, 1.0f, 0.0f,
        0.5f, -0.5f,  0.0f,     0.0f, 0.0f, 1.0f,
    };

    m_vbo.bind();
    m_vbo.allocate(arrVertex, sizeof(arrVertex));

    int attr = -1;
    attr = m_program->attributeLocation("posAttr");
    m_program->setAttributeBuffer(attr, GL_FLOAT, 0,3, sizeof(float) * 6);
    m_program->enableAttributeArray(attr);

    attr = m_program->attributeLocation("colAttr");
    m_program->setAttributeBuffer(attr, GL_FLOAT, 3 * sizeof(float),3, sizeof(float) * 6);
    m_program->enableAttributeArray(attr);

    m_vbo.release();
}




#ifdef GL_ES
// Set default precision to medium
precision mediump int;
precision mediump float;
#endif

varying vec4 col;

void main()
{
    gl_FragColor = col;
}

#ifdef GL_ES
// Set default precision to medium
precision mediump int;
precision mediump float;
#endif

attribute vec4 posAttr;
attribute vec4 colAttr;
varying vec4 col;
uniform mat4 matrix;

void main()
{
    col = colAttr;
    gl_Position = matrix * posAttr;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值