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

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

CountDownLatch、CyclicBarrier 和 Semaphore

文章目录 一、CountDownLatch1、实现原理2、使用场景3、代码 二、CyclicBarrier1、实现原理2、使用场景3、代码4、CountDownLatch与CyclicBarrier区别 三、Semaphore1、实现原理2、使用场景3、代码 四、总结 一、CountDownLatch CountDownLatch计数器 1、实现原理 主要基于计…

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 的时候,先去读取这…

微信小程序开发秘籍:掌握数据缓存与离线存储的艺术

微信小程序开发秘籍:掌握数据缓存与离线存储的艺术 基本概念数据缓存离线存储 技术要点与实战1. 使用wx.setStorageSync进行简单数据缓存2. 管理复杂数据结构——使用wx.setStorage3. 离线存储策略设计4. 安全性与性能优化 结语与探讨 在微信小程序的开发过程中&…

如何在树莓派上的ubuntu20.04.5上安装ros YDLidar SDK ydlidar driver

参考文章: 安装ros1: how to install ros1 on rasberry pi: https://varhowto.com/install-ros-noetic-ubuntu-20-04/ 安装完ros1后安装 ydlidar sdk 和 ydlidar driver: 参考这个手册: https://www.ydlidar.com/Public/upload/files/20…

在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)。这个库不仅提供高效渲染,即使在单片机上也能流畅运行,展现了卓越的性能表…

MySQL 单表访问

MySQL执行单表查询 1.访问方法: Const MySQL直接利用主键值在聚簇索引中定位对应的用户记录.并且唯一的二级索引也可以在常数时间内定位到一条记录. 这种const访问方法只能在主键列或者唯一二级索引与一个常数进行等值比较才有效. ref 普通的二级索引列与常数进行等值比较,会形…

大模型日报2024-05-05

大模型日报 2024-05-05 大模型新闻: Techs new arms race: The billion-dollar battle to build AI - 小型专业化模型可以为各种细分应用提供关键的、高效的能力,这是AI行业必须要支持的。来源:VentureBeatGenerative AI on Agenda for Next CIECA Webin…

使用llama.cpp量化部署LLM

以llama.cpp工具为例,介绍模型量化并在本地部署的详细步骤。这里使用 Meta最新开源的 Llama3-8B 模型。 1 环境 系统应有make(MacOS/Linux自带)或cmake(Windows需自行安装)编译工具Python 3.10以上编译和运行该工具 …

【比邻智选】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/ …