OpenGL入门第一步:创建窗口、重写虚函数

1、创建一个QOpenGLWidget 子类

2、重写虚函数

initializeGL:设置OpenGL资源和状态。在第一次调用resizeGL()或paintGL()之前被调用一次。

resizeGL :窗口尺寸变化时调用。

paintGL: 窗口更新时调用,渲染 OpenGL 场景。

makeCurrent: 绑定当前OpenGL上下文。

doneCurrent :释放当前OpenGL上下文。

如果要重绘场景 应该调用 update 而不是 resizeGL

所有跟 OpenGL 相关的操作都应该发生在 initializeGL、resizeGL、paintGL 三个函数内 或者在 调用 makeCurrent 之后。

3、了解OpenGL绘图,重写函数

openGL绘制3d的本质其实就是画三角形,所有的面都是由三角形组成。

要绘制三角形就要了解渲染管线(如下)。

需要我们参与的是顶点着色器、几何着色器(可无)、片段着色器。 

所以在重写虚函数的时候,在initializeGL函数中写着色器。

QOpenGLFunctions* f = context()->functions();:这行代码获取了与 OpenGL 上下文相关的函数指针

 在顶点着色器中通过

layout (location = 0) in vec3 aPos;将位置变量的属性位置值设为0

着色器的另外一种写法(路径默认在bin里面)

设置顶点数据

 先记住下面3个概念。

代码中创建vbo、vao和ebo。把顶点数据放入vbo,把索引放入ebo。

通过调用 enableAttributeArray 方法并传递数组索引(在这里是 0),可以告诉图形渲染引擎要启用对应索引的属性数组。

通过调用setAttributeBuffer 方法设置着色器程序(shaderProgram)的属性缓冲区(attribute buffer)。

  • setAttributeBuffer:这是一个函数调用,用于将属性数据绑定到着色器程序的特定属性位置。

  • 0:表示要绑定的属性位置索引。在这里,索引 0 可能对应着某个特定的顶点属性,比如位置、颜色或其他属性。这个与enableAttributeArray的值对应,这两处都是因为在顶点着色器中设置了0表示位置

  • GL_FLOAT:指定了属性数据的类型。这里使用了 GL_FLOAT,表示浮点型数据。

  • 0:可能是属性数据在缓冲区中的起始偏移量。

  • 3:表示每个顶点属性的组件数量。例如,如果是位置属性,可能有 x、y、z 三个组件。

  • 3 * sizeof(float):计算了每个顶点属性的字节大小。这里假设每个浮点数(float)占用 4 个字节(sizeof(float)),所以 3 * 4 = 12 字节。

 resizeGL函数控制视口

  

 paintGL函数实时绘制

绑定着色器和vao

f->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);:调用了 glClear 函数来清除颜色缓冲区和深度缓冲区。GL_COLOR_BUFFER_BIT 表示要清除颜色数据,GL_DEPTH_BUFFER_BIT 表示要清除深度数据。通过使用位或操作符 |,将这两个标志组合在一起。

f->glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);:这行代码使用 glDrawElements 函数来绘制三角形。GL_TRIANGLES 指定了要绘制的图元类型为三角形。6 表示绘制要取顶点数(前面设置了索引3个点一组,输入的必须是3的倍数)。GL_UNSIGNED_INT 指定了索引数据的类型为无符号整数。0 有待确认

还有一种三角绘制:

f->glDrawArrays(GL_TRIANGLES, 0, 3);:GL_TRIANGLES:指定要绘制的几何图形类型为三角形。0:表示三角形的起始顶点索引。3:表示要绘制的三角形的顶点数量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/834535.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最详尽的网络安全学习路线!涵盖所有技能点,带你成为网安专家!

目录 零基础小白,到就业!入门到入土的网安学习路线! 建议的学习顺序: 一、夯实一下基础,梳理和复习 二、HTML与JAVASCRIPT(了解一下语法即可,要求不高) 三、PHP入门 四、MYSQL…

Marin说PCB之国产电源芯片方案 ---STC2620Q

随着小米加入的造车大家庭,让这个本来就卷的要死的造车大家庭更加卷了。随之带来的蝴蝶效应就是江湖上各个造成门派都开始了降本方案的浪潮啊,开始打响价格战了。各家的新能源车企也是不得不开始启动了降本方案的计划了,为了应对降价的浪潮。…

Window7镜像注入USB驱动,解决系统安装后无法识别USB

Window7镜像注入usb驱动 Window7镜像注入usb驱动方法一方法二 Window7镜像注入usb驱动 一般4代酷睿之后的主机需要安装usb驱动才能驱动usb,导致很多Windows原版镜像安装后无法识别usb键盘 方法一 1.直接采购PS2 接口键盘、PS2 接口鼠标 方法二 使用联想镜像注入…

李飞飞团队 AI4S 最新洞察:16 项创新技术汇总,覆盖生物/材料/医疗/问诊……

不久前,斯坦福大学 Human-Center Artificial Intelligence (HAI) 研究中心重磅发布了《2024年人工智能指数报告》。 作为斯坦福 HAI 的第七部力作,这份报告长达 502 页,全面追踪了 2023 年全球人工智能的发展趋势。相比往年,扩大了…

AOF持久化是怎么实现的?

AOF持久化是怎么实现的? AOF 日志三种写回策略AOF 重写机制AOF 后台重写总结参考资料 AOF 日志 试想一下,如果 Redis 每执行一条写操作命令,就把该命令以追加的方式写入到一个文件里,然后重启 Redis 的时候,先去读取这…

在k8s中部署hadoop后的使用,包括服务端及客户端(客户端的安装及与k8s服务的对接)

(作者:陈玓玏) 在https://blog.csdn.net/weixin_39750084/article/details/136744772?spm1001.2014.3001.5502和https://blog.csdn.net/weixin_39750084/article/details/136750613?spm1001.2014.3001.5502这两篇文章中,说明…

Verilog复习(一)| 模块的定义

模块(module)是Verilog的基本描述单位,用于描述某个设计的功能或结构,及其与其他模块通信(连接)的外部端口。 Verilog程序由关键词module和endmodule进行定义。 定义模块的步骤: 定义模块的端…

保研面试408复习 4——操作系统、计网

文章目录 1、操作系统一、文件系统中文件是如何组织的?二、文件的整体概述三、UNIX外存空闲空间管理 2、计算机网络一、CSMA/CD 协议(数据链路层协议)二、以太网MAC帧MTU 标记文字记忆,加粗文字注意,普通文字理解。 1、…

全平台 GUI库, 物联网,嵌入式,单片机,桌面应用都行

跨平台最小头文件GUI库 GuiLite是一个轻量级、高效的GUI库,拥有仅4千行的C代码,且零依赖,采用单一头文件库(GuiLite.h)。这个库不仅提供高效渲染,即使在单片机上也能流畅运行,展现了卓越的性能表…

【比邻智选】MR880A模组

🚀高性价比,5G/4G双模,稳定可靠 🌐功能丰富,5G特性一应俱全 🧩多封装兼容,适配性强,灵活升级智能设备

这 7 道 Redis 基础问题,很常见!!

后端项目如果用到分布式缓存的话,一般用的都是 Redis。不过,Redis 不仅仅能做缓存,还能用作分布式锁、延时队列、限流等等。 什么是 Redis? Redis[1] (REmote DIctionary Server)是一个基于 C 语言开发的…

Unity数据持久化之Json

目录 Json概述Json文件格式Json配置规则Excel转Json C#读取存储Json文件JsonUtlityJsonUtlity序列化JsonUtility反序列化 LitJsonLitJson序列化LitJson反序列化JsonUtility和LitJson对比 Json概述 Json是什么? 全称:JavaScript对象简谱(JavaScript Object Notation) Json是国…

ESP8266-01s刷入固件报SP8266 Chip efuse check error esp_check_mac_and_efuse

一、遇到的问题 使用ESP8266 固件烧录工具flash_download_tools_v3.6.8 烧录固件报错: 二、解决方法 使用espressif推出发基于python的底层烧写工具:esptool 安装方法:详见https://docs.espressif.com/projects/esptool/en/latest/esp32/ …

子查询之一(单行子查询, 多行子查询)

1. 子查询 子查询是指一个查询语句嵌套在另一个查询语句内部的查询.这个特性在MySQL4.1开始引入. SQL中子查询的使用大大增强了SELECT查询的能力.因为很多时候查询需要从结果集中获取数据,或者需要从同一个表中先计算得到一个数据结果,然后与这个数据结…

【go项目01_学习记录08】

学习记录 1 模板文件1.1 articlesStoreHandler() 使用模板文件1.2 统一模板 1 模板文件 重构 articlesCreateHandler() 和 articlesStoreHandler() 函数,将 HTML 抽离并放置于独立的模板文件中。 1.1 articlesStoreHandler() 使用模板文件 . . . func articlesSt…

最新:Lodash 严重安全漏洞背后你不得不知道的 JavaScript 知识

可能有信息敏感的同学已经了解到:Lodash 库爆出严重安全漏洞,波及 400万 项目。这个漏洞使得 lodash “连夜”发版以解决潜在问题,并强烈建议开发者升级版本。 我们在忙着“看热闹”或者“”升级版本”的同时,静下心来想&#xf…

FebHost:什么是域名DNS服务器?

域名服务器是一种将域名转换为IP地址的计算机。在域名系统(DNS)中,它起着至关重要的作用。用户只需在浏览器的地址栏输入域名,而无需手动输入网站服务器的IP地址,就可以访问网站。 每个已注册的域名都必须在其DNS记录…

震惊,现在面试都加科技与狠货了

震惊,现在面试都加科技与狠货了 生成式AI盛行的现在,程序员找工作变容易了吗我和老痒喝着大酒,吃着他的高升宴,听他说他面试的各种细节,老狗我只恨自己动作慢了一步,不然现在在那侃侃而谈的就是我了。 面试…

守护数字疆域:2024年网络安全报告深度解读

在这个数据如潮涌动的数字时代,每一比特信息都可能是攻防双方角力的战场。《Check Point 2024年网络安全报告》不但为我们揭示了过去一年网络安全世界的风云变幻,更以前瞻性的视角勾勒出未来的挑战与机遇。此刻,让我们携手深潜这份权威指南的…