Qt中使用OpenGL的三种方式

1.继承QOpenGLWidget并重写基类如下函数 

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

通过使用QOpenGLContext来操作OPENGL函数 

void GLWidget1::initializeGL()
{
    //取OPENGL函数指针
    QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
    //使用OPENGL函数
    f->glClearColor(1.0f,0.0f,0.0f,1.0f);
}

void GLWidget1::resizeGL(int w, int h)
{

}

void GLWidget1::paintGL()
{
    //取OPENGL函数指针
    QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
    f->glClear(GL_COLOR_BUFFER_BIT);

}

 2. 继承QOpenGLFunctions类可直接使用OPENGL函数 

 直接使用OPENGL函数 


void GLWidget2::initializeGL()
{
    //初始化OPENGL函数
    initializeOpenGLFunctions();
    //使用OPENGL函数
    glClearColor(0.0f,1.0f,0.0f,1.0f);
}

void GLWidget2::resizeGL(int w, int h)
{

}

void GLWidget2::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}

3. 继承QOpenGLWidget 与QOpenGLExtraFunctions

 在OPENGL中使用Shader

#include "glwidget3.h"

GLWidget3::GLWidget3(QWidget *parent)
{
    setWindowTitle("OpenGL With QOpenGLWidget And QOpenGLExtraFunctions");
    resize(1024,768);
}

GLWidget3::~GLWidget3()
{

}

void GLWidget3::initializeGL()
{
    initializeOpenGLFunctions();//初始化OPENGL函数
    glEnable(GL_DEPTH_TEST);//设置深度测试标志,近处物体会遮住远处物体
    glClearColor(0.0f,0.0f,1.0f,1.0f);//清除之前的绘制颜色并设置当前颜色

    //创建顶点缓存对象
    m_Vao.create();//VAO:顶点列表对象
    m_Vbo.create();//VBO:顶点缓存对象

    //创建ShaderProgram对象
    m_Prog = new QOpenGLShaderProgram();

    //添加Shader顶点
    m_Prog->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex,u8R"(
        #version 330 core
        in vec3 vPos;
        void main()
        {
            gl_Position = vec4(vPos, 1.0);
        }
    )");
    //添加Shader着色器
    // opengl 3.3 之前使用 gl_FragColor
    // opengl 3.3  'variable' : is removed in Forward Compatible context gl_FragColor
    // 要自己定义fragColor out vec4 fragColor
    m_Prog->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment,u8R"(
        #version 330 core
        out vec4 fragColor;
        void main()
        {
            fragColor = vec4(1.0, 1.0, 0.0, 1.0);
        }
    )");

    //链接Shader
    m_Prog->link();

    //顶点着色器缓存绑定
    //准备顶点数据-三角形顶点数据
    float _vertex[] = {
        0.0,  0.5, 0.0,
        -0.5, -0.5, 0.0,
        0.5, -0.5, 0.0,
    };
    //绑定VAO,VBO
    m_Vao.bind();
    m_Vbo.bind();
    //绑定顶点数据到VBO缓存
    m_Vbo.allocate(_vertex,9*sizeof(float));

    //设置并启用在Shader中设置的OpenGL属性
    m_Prog->bind();
    m_Prog->setAttributeArray("vPos",GL_FLOAT,0,3,0);//设置属性vPos
    m_Prog->enableAttributeArray("vPos");//启用属性vPos

    //释放内存
    m_Prog->release();
    m_Vao.release();
}

void GLWidget3::resizeGL(int w, int h)
{

}

void GLWidget3::paintGL()
{
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    //绑定顶点缓存
    m_Vao.bind();
    //绑定Shader
    m_Prog->bind();
    //绘制
    glDrawArrays(GL_TRIANGLES,0,3);//绘制三角形
    //释放内存
    m_Prog->release();
    m_Vao.release();

}

最终效果 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林宏权

有你的鼓励,我会更加努力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值