OpenGL3.3_C++_Windows(18)

news2025/1/11 22:55:36

接口块:

  1. glsl彼此传输数据,通过in / out,当更多的变量,涉及数组和结构体
  2. 接口块(Interface Block)类似struct,in / out  + 块名{……}实例名

Uniform缓冲对象:

  1. 首先理解uniform Object:
  2. 负责向glsl传入变量/ 数组 / 结构体……,类似于const,这个不能在glsl内部被修改
  3. glsl在GPU上运行,uniform在着色器程序内部是全局的const,意味着不必通过顶点着色器作为中介
  4. Uniform Buffer Object:
  5. 使用多于一个的着色器时,尽管大部分的uniform变量都是相同(projection和view)的对于每个物体几乎都是不变的(相反model是会不同的),
  6. 防止重复设置,允许我们定义一系列在多个着色器程序中相同的全局Uniform变量,只需要设置相关的uniform一次,当然我们仍需要手动设置每个着色器中不同的uniform
  7. 对比:
  8. uniform相对于着色器程序内部是全局的,而Uniform Buffer相对于多个着色器程序是全局的

使用:

  1. Uniform缓冲对象仍是一个缓冲,glGenBuffers创建Uniform缓冲对象,绑定到GL_UNIFORM_BUFFER缓冲目标,分配足够的内存,相关的uniform数据存入缓冲
  2. 在glsl中:layout (std140) + uniform +name {……};
  3. 访问方式很简单:Uniform块中的变量可以直接访问,不需要加块名作为前缀


Uniform块布局:

  1. layout (std140)意思是说,对它的内容使用一个特定的内存布局。
  2. 为什么要layout呢:
  3. Uniform块的内容储存在一个缓冲对象中<实际上只是一块预留内存,这块内存并不会保存它具体保存的是什么类型的数据,需要告诉OpenGL内存的哪一部分对应着着色器中的哪一个uniform变量
  4. 需要知道的是每个变量的大小(字节)和(从块起始位置的)偏移量,来让我们能够按顺序将它们放进缓冲中
  5. 默认布局为共享shared布局:
  6. 可以为了优化而对uniform变量的位置进行变动的(从而优化存储空间),但是因此无法知道每个uniform变量的偏移量,也就不知道如何准确地填充我们的Uniform缓冲了。
  7. std140布局规范:
  8. 声明了每个变量的偏移量都是由一系列规则所决定的,显式地声明了每个变量类型的内存布局,因此可以手动计算出每个变量的偏移量,保证了内存布局在每个声明了这个Uniform块的程序(glsl)中是一致的
  9. 基准对齐量:在Uniform块中所占据的空间
  10. 对齐偏移量:从块起始位置的字节偏移量,对齐字节偏移量必须等于基准对齐量(当前)的倍数
  11. 对齐偏移量(初始为0) =  上一次对齐偏移量 +  上一个变量的基准对齐量(满足这一次对齐偏移量的倍数)
  12. 还有一个紧凑布局packed:是不能保证这个布局在每个程序中保持不变的(即非共享),因为它允许编译器去将uniform变量从Uniform块中优化掉,

使用:

  1. 我们在c++中初始了uniform缓冲,并在需要使用的glsl中都创建了uniform块,并且进行了layout,但是,如何才能让OpenGL知道哪个Uniform缓冲对应的是哪个Uniform块呢?
  2. 绑定点:
  3. 可以将一个Uniform缓冲链接至它,一个uniform对应一个绑定点,相同的uniform对应同一个绑定点
  4. 那么如何绑定Uniform块呢:
    1. Uniform块链接到绑定点:glUniformBlockBinding(着色器id,Uniform块索引,链接到的绑定点)
    2. Uniform块索引:glGetUniformBlockIndex(着色器id,Uniform块的名称)
  5. OpenGL 4.2版本起:layout(std140, binding = 2) uniform name{ ... };这样就不用再调用glGetUniformBlockIndex和glUniformBlockBinding了
  6. 还需要绑定Uniform缓冲对象到相同的绑定点上:
    1. glBindBufferBase(目标,一个绑定点索引,Uniform缓冲对象)
    2. 或者
    3. glBindBufferRange(目标,一个绑定点索引,Uniform缓冲对象,附加的偏移量,大小参数)可以绑定Uniform缓冲的特定一部分到绑定点中
  7. 首先定义数据,开始向Uniform缓冲中添加数据:可以使用(非必须)glBufferSubData()一点点填充缓冲的特定区域,需要偏移量,和大小。指定从何处开始填充这个大小的缓冲。
  8. 用glBufferSubData有什么好处?
  9. 主要目的是优化性能和资源管理。当只需要修改缓冲区的一小部分数据时,使用glBufferSubData可以避免重新发送整个数据集,从而节省带宽和提高渲染效率。也可以方便分开传输。
  10. 任何大型的渲染程序都可能同时激活有上百个着色器程序,这是不用一个一个的传入glsl,只需要对于所有glsl共有统一,且在glsl中const的变量,传入一次就好了

理解3D贴图:

  1. 首先2D贴图如何映射到平面上:渲染每个顶点时,在顶点数据中包含texcoord,对应纹理texture的st坐标,
  2. 而对于3维的texture坐标stp,也是差不多的意思

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

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

相关文章

RTSP协议分析与安全实践

RTSP协议&#xff0c;全称实时流协议(Real Time Streaming Protocol)&#xff0c;前文已经简单介绍了RTSP相关协议&#xff1b; RTSP和RTP(RTCP) 这里再提一下RTSP和RTP/RTCP、RSVP的关系&#xff1b;如图&#xff1a; RTSP和HTTP 相似性&#xff1a;RTSP和HTTP协议都使用纯…

Android13 WMS窗口层级树

1&#xff0c;认识层级树 可以通过dumpsys activity containers 看到 WMS 层级树的结构 ACTIVITY MANAGER CONTAINERS (dumpsys activity containers) ROOT typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 Displa…

【驱动篇】龙芯LS2K0300之单总线驱动

实验过程 实验目的&#xff1a; 在龙芯开发板上面使用单总线驱动DS18B20温度传感器 ① 根据原理图连接DS18B20模块 ② 将i2c0引脚的功能复用为GPIO ③ 注册字符设备&#xff0c;按照DS18B20的读写时序编写读写驱动接口 ④ 编写测试用例解析传感器的数值 原理图 将板子上…

细粒度图像分类论文阅读笔记

细粒度图像分类论文阅读笔记 摘要Abstract1. 用于细粒度图像分类的聚合注意力模块1.1 文献摘要1.2 研究背景1.3 本文创新点1.4 计算机视觉中的注意力机制1.5 模型方法1.5.1 聚合注意力模块1.5.2 通道注意力模块通道注意力代码实现 1.5.3 空间注意力模块空间注意力代码实现 1.5.…

[MQTT]Mosquitto的權限管理_使用者/密碼(pwfile)和訪問控制清單(aclfile)

延續Mosquitto的內網連接(intranet)和使用者/密碼權限設置文章&#xff0c;經解讀mosquitto官網文檔&#xff0c;在權限管理部分&#xff0c;除了設置使用者/密碼(pwfile)之外&#xff0c;還有訪問控制清單(Access Control List, aclfile)可以設置。經過測試&#xff0c;同時設…

Python中使用PyQT5库时报错:没有Qt平台插件可以初始化

一、发现问题&#xff1a;无限易pythonGo打开执行的时候报&#xff1a;“没有Qt平台插件可以初始化&#xff0c;请重新安装应用程序。”的错误&#xff0c;点击确定后无限易崩溃闪退。 二、解决问题&#xff1a; 1、重新安装依赖&#xff0c;打开CMD输入pip list&#xff0c;查…

开发uniapp插件包aar文件,使uniapp可以调用jar包

背景 使用 uniapp 开发应用时&#xff0c;很多时候都需要调用第三方的sdk&#xff0c;一般以 jar 为主。为了应对这个问题&#xff0c;官方提供了插件方案&#xff0c;可以将第三方 jar 包进行封装为 aar 包后&#xff0c;再集成到 uniapp 中使用。 一、环境安装工具 1、jdk…

拓扑排序——C语言

拓扑排序&#xff08;Topological Sorting&#xff09;是一种用于有向无环图&#xff08;DAG&#xff09;的排序算法&#xff0c;其输出是图中所有顶点的线性排序&#xff0c;使得对于每条有向边 (u, v)&#xff0c;顶点 u 在 v 之前出现。拓扑排序确定了项目网络图中的起始事件…

嵌入式中逻辑分析仪与示波器的基本原理

大家好,今天主要给大家分享一下,嵌入式中如何使用逻辑分析仪和示波器的方法,希望对大家有所帮助。 https://dreamsourcelab.cn/ 第一:什么是逻辑分析仪 是否遇到使用示波器分析数字电路的冏境:深度不够,时间太短,无法抓到想要的波形,没有协议内容解析? 逻辑分析仪…

深度学习11-13

1.神经元的个数对结果的影响&#xff1a; &#xff08;http://cs.stanford.edu/people/karpathy/convnetjs/demo/classify2d.html&#xff09; &#xff08;1&#xff09;神经元3个的时候 &#xff08;2&#xff09;神经元是10个的时候 神经元个数越多&#xff0c;可能会产生…

注意 llamaIndex 中 Chroma 的坑!

llamaIndex 做索引是默认存在内存中&#xff0c;由于索引需要通过网络调用 API&#xff0c;而且索引是比较耗时的操作&#xff0c;为了避免每次都进行索引&#xff0c;使用向量数据库进行 Embedding 存储以提高效率。首先将 Document 解析成 Node&#xff0c;索引时调用 Embedd…

解析PDF文件中的图片为文本

解析PDF文件中的图片为文本 1 介绍 解析PDF文件中的图片&#xff0c;由两种思路&#xff0c;一种是自己读取PDF文件中的图片&#xff0c;然后用OCR解析&#xff0c;例如&#xff1a;使用PyMuPDF读取pdf文件&#xff0c;再用PaddleOCR或者Tesseract-OCR识别文字。另一种使用第…

小鹏汽车2025冲刺类L4智驾,挑战与机遇并存

随着科技的飞速发展&#xff0c;智能驾驶已成为汽车行业的前沿领域。近日&#xff0c;小鹏汽车在AI DAY上宣布国内首个量产上车的端到端大模型&#xff0c;这一创新举措无疑为智能驾驶的发展注入了新的活力。然而&#xff0c;在迈向2025年实现类L4级智能驾驶的道路上&#xff0…

DHCP原理1-单个局域网出现多个DHCP服务器会发生什么

1. 背景 DHCP全称是Dynamic Host Configuration Protocol。其协议标准是RFC1541&#xff08;已被RFC2131取代&#xff09;&#xff0c;主要实现服务器向客户端动态分配IP地址&#xff08;如IP地址、子网掩码、网关、DNS&#xff09;和配置信息。其系统架构是标准的C/S架构。RFC…

运算放大器(运放)低通滤波反相放大器电路和积分器电路

低通滤波反相放大器电路 运放积分器电路请访问下行链接 运算放大器(运放)积分器电路 设计目标 输入ViMin输入ViMax输出VoMin输出VoMaxBW&#xff1a;fp电源Vee电源Vcc–0.1V0.1V–2V2V2kHz–2.5V2.5V 设计说明 这款可调式低通反相放大器电路可将信号电平放大 26dB 或 20V/…

算是一些Transformer学习当中的重点内容

一、基础概念 Transformer是一种神经网络结构&#xff0c;由Vaswani等人在2017年的论文Attentions All YouNeed”中提出&#xff0c;用于处理机器翻译、语言建模和文本生成等自然语言处理任务。Transformer同样是encoder-decoder的结构&#xff0c;只不过这里的“encoder”和“…

OpenCV机器学习-人脸识别

一 基本概念 1 计算机视觉与机器学习的关系 计算机视觉是机器学习的一种应用&#xff0c;而且是最有价的应用。 2 人脸识别 哈尔(haar)级联方法 Harr是专门为解决人脸识别而推出的&#xff1b; 在深度学习还不流行时&#xff0c;Harr已可以商用&#xff1b; 深度学习方法&am…

thrift接口调用工具

写了一个thrift接口调用工具 导入thrift文件就可以直接调用相应接口 工具会根据thrift文件中接口的参数名&#xff0c;参数类型&#xff0c;返回值等等&#xff0c;自动生成接口参数&#xff0c;和结果json化显示。 https://github.com/HuaGouFdog/Fdog-Kit

C++初学者指南第一步---14.函数调用机制

C初学者指南第一步—14.函数调用机制 文章目录 C初学者指南第一步---14.函数调用机制1.记住&#xff1a;内存的结构2.函数调用是如何工作的3. 不要引用局部变量4. 常见编译器优化5. Inlining内联 1.记住&#xff1a;内存的结构 堆&#xff08;自由存储&#xff09; 用于动态存…

鸿蒙开发系统基础能力:【@ohos.hiAppEvent (应用打点)】

应用打点 本模块提供了应用事件打点能力&#xff0c;包括对打点数据的落盘&#xff0c;以及对打点功能的管理配置。 说明&#xff1a; 本模块首批接口从API version 7开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import hiAppEve…