Qt编程环境下学习《OpenGL编程指南(原书第九版)》(一)

【QT】——OpenGL学习(一) OpenGL简介 OpenGL(英语:Open Graphics Library,译名:开放图形库或者“开放式图形库”)是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。 这个接口由近350个不同的函数调用组成,用来绘制从简单的图形比特到复杂的三维景象。而另一种程序接口系统是仅用于Microsoft Windows上的Direct3D。OpenGL常用于CAD、虚拟现实、科学可视化程序和电子游戏开发。 OpenGL的高效实现(利用了图形加速硬件)存在于Windows,部分UNIX平台 阅读详情

背景

    因项目的需要,本人开始学习OpenGL的编程知识,所以以《OpenGL编程指南(原书第九版)》作为学习样板。因之前一直用Qt进行项目的开发,深感Qt编程框架对于项目开发的强大和易用。而书上的样本例程采用的GLFW框架,安装和调试仍然需要花费一定的时间进行学习和熟悉,一旦出现问题后,因GLFW框架的资料过少,一旦出现问题后,势必给学习者带来负担。因此,我尝试用Qt来学习书中的例子程序,并做相应的修改。(文中的每一个程序,都经过了作者的实际编译和运行)。

运行环境如下:

Win10家庭中文版(64位)

显卡GeForce MX250

16G RAM

Qt版本号 5.12.3(Visual Studio 2017 编译器)

第一章

书中的内容我就不赘述了,本文主要着重说明Qt下程序的修改重点,文尾将附上完整的程序。

我们利用Qt建立一个桌面Application框架,新建一个QOpenGLWidget的类来进行OpenGL的操作。MainWindow类创建初始化代码中,加入相应的界面创建代码:

    OpenGLWidget* openGLWidget = new OpenGLWidget(this);

    QVBoxLayout* centralLayout = new QVBoxLayout();

    centralLayout->addWidget(openGLWidget);

this->ui->centralWidget->setLayout(centralLayout);

以上代码非常简单,主要修改的代码位于OpenGLWidget类,首先看下头文件:

/*

        Created By APYang 2019/11/5

*/

#include <QWidget>

#include <QOpenGLWidget>

#include <QOpenGLFunctions>

#include <QOpenGLExtraFunctions>

#include <QOpenGLShaderProgram>

#include <QOpenGLFunctions_4_5_Core>

#define BUFFER_OFFSET(offset) ((void *)(offset)

 

const GLuint NumVertices = 6;

 

class OpenGLWidget : public QOpenGLWidget,protected QOpenGLFunctions

{

 

    QOpenGLShaderProgram *program;

    GLuint programId;

 

    enum VAO_IDs{Triangles, NumVAOs};

    enum Buffer_IDs{ArrayBuffer, NumBuffers};

    enum Attrib_IDs{vPosition = 0};

 

    GLuint VAOs[NumVAOs];

    GLuint Buffers[NumBuffers];

 

public:

    explicit OpenGLWidget(QWidget *parent = 0);

 

protected:

    void initializeGL();

    void paintGL();

    void resizeGL(int w, int h);

    void initVbo();

};

 

说明:

  1. 在include 区域,我们引入了QOpenGLFunctions_4_5_Core,因为不引入这个头,书上的函数就没法使用,默认是OpenGL1.1的API。
  2. OpenGLWidget类的四个方法,其中initializeGL()放初始化代码、paintGL()完成绘制功能、resizeGL()用于窗口大小变化后的重绘、initVbo()用于初始化顶点。

 

接下来是OpenGLWidget类实现:

 

OpenGLWidget::OpenGLWidget(QWidget *parent)

{

 

}

 

 

 

void OpenGLWidget::initializeGL()

{

 

 

    initializeOpenGLFunctions();

 

 

    program = new QOpenGLShaderProgram(this);

 

    if(!program->addShaderFromSourceCode(QOpenGLShader::Vertex, "#version 450 core\n"

                                         "layout (location =0) in vec4 vPosition;\n"

                                         "void main(void)\n"

                                         "{gl_Position =  vPosition;}")){

        return;

    }

    if(!program->addShaderFromSourceCode(QOpenGLShader::Fragment,"#version 450 core\n"

                                         "layout (location = 0) out vec4 fColor;\n"

                                         "void main(void)\n"

                                         "{fColor = vec4(0.5,0.4,0.8,1.0);}")){

        return;

    }

    if(!program->link()){

        return;

    }

    if(!program->bind()){

        return;

    }

 

    programId = program->programId();

    initVbo();

}

void OpenGLWidget::resizeGL(int w, int h)

{

    glViewport(0, 0, w, h);

}

 

void OpenGLWidget::paintGL()

{

    QOpenGLFunctions_4_5_Core *f = QOpenGLContext::currentContext()->versionFunctions<QOpenGLFunctions_4_5_Core>();

    if (!f){

        qWarning()<<"Could not obtain required OpenGL context version";

        exit(1);

    }

    float black[] = {0.0f,0.0f,0.0f,0.0f};

    f->glClearBufferfv(GL_COLOR,0,black);

    f->glBindVertexArray(VAOs[Triangles]);

    f->glDrawArrays(GL_TRIANGLES, 0, NumVertices);

}

void OpenGLWidget::initVbo(){

    QOpenGLFunctions_4_5_Core *f = QOpenGLContext::currentContext()->versionFunctions<QOpenGLFunctions_4_5_Core>();

    if (!f){

        qWarning()<<"Could not obtain required OpenGL context version";

        exit(1);

    }

 

    GLfloat vertex[NumVertices][2] = {

        {-0.9f,-0.9f},

        {0.85f, -0.9f},

        {-0.9f, 0.85f},

        {0.9f,-0.85f},

        {0.9f, 0.9f},

        {-0.85f, 0.9f},

    };

 

    f->glCreateVertexArrays(NumVAOs,VAOs);

 

    f->glCreateBuffers(NumBuffers,Buffers);

    f->glNamedBufferStorage(Buffers[ArrayBuffer], sizeof(vertex), vertex,0);

 

    f->glBindVertexArray(VAOs[Triangles]);

    f->glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]);

 

    f->glVertexAttribPointer(vPosition, 2, GL_FLOAT,GL_FALSE,0, BUFFER_OFFSET(0));

    f->glEnableVertexAttribArray(vPosition);

 

}

其中需要说明的要点:

  1. API的获取需要使用QOpenGLFunctions_4_5_Core *f = QOpenGLContext::currentContext()->versionFunctions<QOpenGLFunctions_4_5_Core>()来进行,当然你也可以用其他不同的版块接口。
  2. 着色器代码的加载和编译,我们直接用Qt的相关类进行了处理,很是方便。(下一章,我们将直接用原生API进行加载、链接和编译)。

运行结果如下:

QT中OpenGL开发起步 OpenGL中环境搭建 近期由于需要做一个GUI展示的OpenGL程序,因此想到用QT来做界面,需要在QT中写OpenGL,配完环境后,在这里总计一下。 QT基础 总体看来,QT的版本较为混乱,有时候傻傻弄不清楚,QT dialog/widget/mainwindow。又需要有界面,又要有pro文件,一圈下来,加上网上教程版本混乱,已经凌乱了。后来在同学帮助下,看了一些博客教程,综合... 阅读详情

相关推荐

Qt环境下利用OpenGL显示三维模型

最近在做一个利用Qt开发的小程序,其中一项功能

Damoninhit的专栏 1万+

OpenGL(QT平台)学习与实战(一)

参考资料: LearnOpenGL CN 《现代OpenGL:1入门篇,2021 Qt实现版》 OpenGL 我们先了解一下OpenGL到底是什么。一般它被认为是一个API(Application Programming Interface, 应用程序编程接口),包含了一系列可以操作图形、图像的函数。然而,OpenGL本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范(Specification)。 OpenGL规范严格规定了每个函数该如何执行,以及它们的输出值。至于内部具体每个函数是

m0_38144614的博客 1436

基于Qt的OpenGL编程(3.x以上GLSL可编程管线版)---(一)简介

笔者写的这个教程集,是一项带引号的“翻译”类教程。 Joey De Vries  的现代OpenGL教程是我看过最好的图形学教程,没有之一。 (这是教程地址https://learnopengl-cn.github.io/01%20Getting%20started/01%20OpenGL/ ,点击打开链接,每篇教程都附有成品源代码,不过需要连接VPN) 教程极好,却有一问题,作者是基于vi...

博客 6289

QT绘图高级编程图形学篇

自定义绘图与动画自定义绘图与动画在QT中,自定义绘图与动画是图形学篇中非常重要的一个环节。通过自定义绘图与动画,我们可以实现更加丰富、动态的图形界面。本章将介绍如何在QT中实现自定义绘图与动画。自定义绘图自定义绘图是指在QT中通过继承现有的绘图类或者使用绘图设备来实现自己的绘图逻辑。在QT中,绘图设备包括QPainter和QPaintDevice。其中,QPainter是一个绘图工具,它可以绘制各种图形、文本、图像等;

QT性能优化QT原理源码QT界面美化 2331

Qt Opengl学习绝好资料

详细讲解了qt环境下,opengl开发的方法 面向入门级的设计师,最快的速度精通opengl绘制各类图形

QML书籍+OpenGL教程

QML书籍中文版,Qt+OpenGL教程中文版,好好学习,天天向上

【QT教程】QT6 OpenGL编程 QT OpenGL编程

OpenGL简介OpenGL简介OpenGL(Open Graphics Library)是一个跨语言、跨平台的应用程序编程接口(API),用于渲染2D、3D向量图形。它被广泛用于计算机图形和游戏开发中。OpenGL是一个独立于硬件的API,这意味着它提供了一套与具体硬件无关的绘制命令,使得开发者编写的程序可以在支持OpenGL的不同平台上运行。OpenGL的历史OpenGL最早是由SGI(Silicon Graphics Inc.)公司在1992年开发的。

QT性能优化QT原理源码QT界面美化 4063

一些学习OpenGL的书籍

NULL 博文链接:https://jacky-zhang.iteye.com/blog/1163297

在Qt中使用OpenGL

在Qt5.4之前,OpenGL在Qt中的实现主要是继承QGLWidget,在5.4版本之后,则改为QOpenGLWidget和QOpenGLFunctions(QOpenGLExtraFunctions),这是qt官方的推荐写法,可以在qt自带的examples中搜索opengl找到。 除了这种写法,直接使用指定OpenGL版本的包装器也是可以的,在头文件中包含QOpenGLFunctio...

TiredWind的博客 3万+

OpenGL编程指南(第九版)

Title: OpenGL Programming Guide, 9th Edition Author: Dave Shreiner, Graham Sellers, John Kessenich Length: 976 pages Edition: 9 Language: English Publisher: Addison-Wesley Professional Publication Date: 2016-07-18 ISBN-10: 0134495497 ISBN-13: 9780134495491

OpenGL编程指南(第9版)英文版PDF下载

OpenGL® Programming Guide, Ninth Edition, presents definitive, comprehensive information on OpenGL 4.5, 4.4, SPIR-V, OpenGL extensions, and the OpenGL Shading Language. It will serve you for as long as you write or maintain OpenGL code.

QT绘图高级编程 openGL篇

OpenGL简介OpenGL简介OpenGL(Open Graphics Library)是一个跨语言、跨平台的应用程序编程接口(API),主要用于开发2D及3D图形应用程序。它被广泛应用于计算机游戏、科学可视化、虚拟现实等领域。OpenGL是一个开放标准,由Khronos Group负责维护。OpenGL的历史OpenGL的历史可以追溯到1992年,当时是由SGI(Silicon Graphics Inc.)公司开发的。

QT性能优化QT原理源码QT界面美化 4499

opengl编程指南第9版、超级宝典第7版、计算机图形原则和实践第3版以及opengl领悟(OpenGL insights)

opengl编程指南第9版、超级宝典第7版、计算机图形原则和实践第3版以及opengl领悟(OpenGL insights)

Learn OpenGL In Qt之系列简介

本博客系列将带领读者逐步学习如何在Qt环境下使用OpenGL进行图形编程。我们将从基础知识开始,介绍OpenGL的基本概念、渲染流程和常用功能。然后,我们将探讨如何在Qt中集成OpenGL,并展示如何创建简单的OpenGL图形应用程序。在后续的文章中,我们还将深入探讨OpenGL的高级功能,例如着色器编程、纹理映射、光照效果等。通过本博客系列的学习,读者将能够掌握在Qt环境下使用OpenGL进行图形编程的基本技能,为开发更复杂的图形应用程序打下坚实的基础。

记录点滴,终成江河! 3507

Ubuntu 22.04远程桌面终极指南:从零配置RDP到解决黑屏问题

本文提供了一份Ubuntu 22.04远程桌面配置的终极指南,详细讲解了如何从零开始安装和配置RDP服务,并重点解决了连接后常见的黑屏问题。通过分析会话冲突、修复启动脚本及配置权限策略,帮助用户实现稳定、高效的远程桌面连接,优化分辨率、禁用锁屏,打造无缝的远程工作体验。

sony5的博客 1382

Ships Dataset:解锁海洋探索的数字宝库

在海上交通管理中,通过对船舶的持续跟踪,可以及时发现船舶的异常行为,如偏离航线、超速等,保障海上航行的安全。例如,通过分析船舶的航行数据和位置信息,合理安排船舶的停靠时间和装卸货物顺序,避免港口拥堵,提高船舶的周转率。同时,还精确标注了船舶在图像中的位置坐标,通过这些坐标,我们可以准确地定位船舶在图像中的具体位置,为后续的分析和处理提供了精确的依据。从繁忙运输货物的货船,到承载着能源使命的油轮,再到穿梭于海洋寻找鱼群的渔船 ,每一种船舶都有着独特的外形和功能,在数据集中留下了它们的身影。

qq_38220914的博客 1267

Qt下的OpenGL 编程(1)Qt下的OpenGL编程必须步骤

一.前言          暑假在家里花了些时间了研究了Ogre,基本是每天一篇wiki教程。最后做完了初级教程后觉得自己进行不下去了,因为里面还有挺多东西都每有理解,所以想来接触一下更“低端”一些的东西。         要开源,当然是OpenGl了,跨平台的话,就用Qt咯,其实大三那会有花时间去研究过,但当时要应付可爱的专业课,自己的水平也很一般,研究到了纹理贴图就止步了。

爱冒险的技术宅 2万+

SAP生产订单(创建-下达-发料-报工-入库)全流程及反向流程

SAP创建下达报工入库发料以及取消发料取消入库,批量下达删除关闭,生产订单出入库查询和状态更改查询记录

weixin_38974136的博客 2万+

QT之openGL使用(一)

OpenGL(Open Graphics Library)是一种跨语言、跨平台的图形编程接口,主要用于渲染二维和三维矢量图形。它由一个庞大的函数库组成(只有头文件声明,由各家厂家自己实现内容),允许开发者通过编程方式与图形硬件进行交互,从而实现高效、复杂的图形渲染。以下是OpenGL的一些关键特点和用途:1.OpenGL可以在多种操作系统上运行,如Windows、macOS、Linux、Android和iOS等。它支持多种编程语言,包括C、C++、Python、Java等。2.

m0_58233509的博客 2465

手把手带你搞懂电压跌落测试DIP

砖一用4分钟时间手把手带你搞懂电压跌落测试DIP,希望对你有用~

qq_45508321的博客 7919

AI辅助Android开发:从传统到智能化的技术演进

AI辅助开发的核心在于利用算法模型自动化或优化传统任务。在Android开发中,AI可应用于需求分析、设计、编码、测试和维护各阶段。需求分析:AI工具如基于NLP的模型(例如GPT系列)可解析用户需求文档,自动生成用户故事和原型设计。假设产品需求为“开发一个航班查询应用”,AI能提取关键词,输出UML图或伪代码。代码生成:使用AI代码助手(如GitHub Copilot),工程师输入自然语言描述,AI生成Java/Kotlin代码片段。

郑伟强dev的专栏 137

QT OpenGL高级编程

OpenGL简介OpenGL简介OpenGL(Open Graphics Library)是一个跨语言、跨平台的应用程序编程接口(API),用于渲染2D、3D向量图形。它被广泛用于计算机图形和游戏开发中。OpenGL是一个规范,由一个技术委员会管理,这个委员会包括硬件制造商、软件供应商和开发人员。OpenGL的历史OpenGL的历史可以追溯到1980年代,当时SGI(Silicon Graphics Inc.)开发了一个名为GL的API,用于他们的高端图形工作站。

QT性能优化QT原理源码QT界面美化 1358

一个超酷的开源uHand2.0机械手掌项目

uHand2.0是深圳乐幻索尔公司开源的一款机械手掌,它长下面这个样子:1、uHand2.0外观图之前在公众号就分享过视频:学习嵌入式可以带娃,不信你们看2、uHand2.0硬件原理图看...

Bruce.yang的嵌入式之旅 4460

Qt编程环境下学习《OpenGL编程指南(原书第九版)》(二)

第二章 就像第一章所说,我们这次尝试使用原生的API来加载、编译和链接着色器代码。 首先还是看OpenGLWidget类定义: class OpenGLWidget : public QOpenGLWidget,protected QOpenGLFunctions { const char* vShader ={ "#version 330 core\n" ...

平安羊的专栏 647

【漏洞复现】用友NC-Cloud-反序列化-ResourceManagerServlet

NC Cloud是用友公司推出的大型企业数字化平台。支持公有云、混合云、专属云的灵活部署模式。NC Cloud完全基于云原生架构,技术先进、性能稳定、自主安全可控,支撑大中型以及超大型集团企业N层多site混合云部署方案,支持整个系统高可用、弹性扩展、双/多活,以及快速灾备恢复能力等。用友-NC-Cloud ResourceManagerServlet 接口存在反序列化漏洞,使得攻击者可以通过构造特定的请求远程执行恶意代码。此漏洞可能导致攻击者获取系统权限、执行任意命令,严重威胁系统的机密性和完整性。

漏洞复现 1366

LeRobot 入门教程(二)强化学习训练及 SmolVLA 模型微调

本文介绍了LeRobot框架中基于人类在环的样本高效强化学习(HIL-SERL)工作流,包含真实机器人训练和模拟环境训练两大模块。在真实机器人部分,详细说明了从配置设置、工作空间边界确定、演示数据收集、奖励分类器训练到演员-学习者架构部署的全流程,并强调了人类干预的关键作用。同时介绍了适用于模拟训练的gym_hil环境及其配置使用方法。最后,文章提供了微调SmolVLA基础模型的指南,包括数据集收集、微调步骤和模型评估方法。该工作流实现了人机协作的高效强化学习,适用于各类机器人操作任务。

2506_90492529的博客 3897
下一篇: Qt编程环境下学习《OpenGL编程指南(原书第九版)》(二)
yangap
博客等级 码龄25年 7粉丝 2原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值