Qt中使用OpenGL的三种方式

这篇具有很好参考价值的文章主要介绍了Qt中使用OpenGL的三种方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

qt opengl,QT编程,qt,开发语言,opengl

通过使用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函数 

qt opengl,QT编程,qt,开发语言,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

qt opengl,QT编程,qt,开发语言,opengl

 在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();

}

最终效果 

qt opengl,QT编程,qt,开发语言,opengl文章来源地址https://www.toymoban.com/news/detail-620777.html

到了这里,关于Qt中使用OpenGL的三种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt使用OpenGL进行多线程离屏渲染

    基于Qt Widgets的Qt程序,控件的刷新默认状况下都是在UI线程中依次进行的,换言之,各个控件的QWidget::paintEvent方法会在UI线程中串行地被调用。若是某个控件的paintEvent很是耗时(等待数据时间+CPU处理时间+GPU渲染时间),会致使刷新帧率降低,界面的响应速度变慢。 假如这个

    2024年02月02日
    浏览(43)
  • 【Qt】信号槽的三种连接方式

    实现观察者模式,可以使用函数回调,但注册回调函数有一定局限,安全性也没有保证。所以一定程度上可以说 Qt 信号槽是对回调机制进行了封装。 Qt 的信号槽能够连接(connect) 和编译通过,需要满足两个条件 信号的参数个数大于等于槽函数 信号槽的参数个数相同的部分,

    2024年02月13日
    浏览(44)
  • Qt OpenGL(四十)——Qt OpenGL 核心模式-雷达扫描效果

    提示:本系列文章的索引目录在下面文章的链接里(点击下面可以跳转查看): Qt OpenGL 核心模式版本文章目录 一、场景 上一篇文章介绍了在雷达坐标系中绘制飞行的飞机,其实雷达坐标系应该还有一个效果,就是扫描的效果,类似于下面的图(注:图片来源于百度):  二

    2024年02月13日
    浏览(36)
  • Qt OpenGL(四十二)——Qt OpenGL 核心模式-GLSL(二)

    提示:本系列文章的索引目录在下面文章的链接里(点击下面可以跳转查看): Qt OpenGL 核心模式版本文章目录 冯一川注:GLSL其实也是不断迭代的,比如像3.3版本中,基本数据类型浮点型只支持float型,而GLSL4.0版本开始就有double型数据的支持了,所以本系列GLSL部分以GLSL4.5版

    2024年02月08日
    浏览(47)
  • 基于QT使用OpenGL,加载obj模型,进行鼠标交互

    基于QT平台,使用OpenGL进行obj文件加载显示; 使用鼠标对场景进行缩放、移动、旋转交互;   OpenGL是基于C的,学习曲线比较抖,但是总的来说就是下面一幅图,   用语言简单的描述(个人理解,可能不太准确)是把 cpu里内存里的3D数据,传输到显卡的内存里,以及如何

    2024年02月04日
    浏览(51)
  • Qt系列——点击按钮关闭窗口的三种实现方式,附源码

    主要实现了点击QPushButton按钮,关闭窗口的功能。 简单设计界面如下,按钮名称如图中右侧红框中内容 源程序连接

    2024年02月11日
    浏览(53)
  • Qt OpenGL相机系统

    效果展示 一直偷懒没有学习OpenGL,乘着这段有点时间重新学习一下OpenGL,做一个简单的小工具,有助于后面理解OSG。我们都知道OpenGL中存在着下面几个坐标空间:模型空间(物体空间)、世界空间、观察空间(或者称作人眼空间)、裁剪空间以及屏幕空间。本质上他们是五个坐

    2024年02月05日
    浏览(49)
  • Qt OpenGL 3D模型

    这次教程中,我们将之前几课的基础上,教大家如何创建立体的3D模型。我们将开始生成真正的3D对象,而不是像之前那几课那样3D世界中的2D对象。我们会把之前的三角形变为立体的金字塔模型,把四边形变为立方体。 我们给三角形增加左侧面、右侧面、后侧面来生成一个金

    2024年02月11日
    浏览(49)
  • OpenGL 网格拾取坐标(Qt)

    有时候我们希望通过鼠标来拾取某个网格中的坐标,这就涉及到一个很有趣的场景:光线投射,也就是求取一条射线与网格的交点,这里如果我们采用普通遍历网格中的每个面片的方式,当网格的面片数据量很大时计算效率就很存在问题,因此这里我们使用一种更为理想的方

    2024年01月17日
    浏览(36)
  • QT+OpenGL鼠标操作和模型控制

    本篇完整工程见gitee:QtOpenGL 对应点的tag,由turbolove提供技术支持,您可以关注博主或者私信博主 需要将世界坐标转换为视口坐标 理论有点小复杂 Mouse Picking with Ray Casting - Anton’s OpenGL 4 Tutorials (antongerdelan.net) 参考这篇文章 这部分不懂的话,暂时是没关系的,可以接着往下看

    2024年02月12日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包