OpenGL3.3_C++_Windows(18)

接口块:

  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,也是差不多的意思

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于协方差信息的Massive MIMO信道估计算法性能研究

1. 引言 随着移动互联网不断发展&#xff0c;人们对通信的速率和可靠性的要求越来越高[1]。目前第四代移动通信系统已经逐渐商用&#xff0c;研究人员开始着手研究下一代移动通信系统相关技术[2][3]。在下一代移动通信系统中要求下行速率达到10Gbps&#xff0c;这就要求我们使…

Debian Linux安装minikubekubectl

minikube&kubectl minkube用于在本地开发环境中快速搭建一个单节点的Kubernetes集群,还有k3s&#xff0c;k3d&#xff0c;kind都是轻量级的k8skubectl是使用K8s API 与K8s集群的控制面进行通信的命令行工具 这里使用Debian Linux演示&#xff0c;其他系统安装见官网,首先…

完美解决找不到steam_api64.dll无法执行代码问题

游戏缺失steam_api64.dll通常意味着该游戏依赖于Steam平台的一些功能或服务&#xff0c;而这个DLL文件是Steam客户端的一部分&#xff0c;用于游戏与Steam平台之间的交互。如果游戏中缺失这个文件&#xff0c;可能会出现无法启动、崩溃或其他问题。 一&#xff0c;详细了解stea…

Java内存泄漏检测和分析介绍

在Java中&#xff0c;内存泄漏检测和分析是一个重要的任务&#xff0c;可以通过以下几种方式进行&#xff1a; 1. 使用VisualVM VisualVM是一个可视化工具&#xff0c;可以监控、分析Java应用程序的内存消耗。它可以显示堆内存、垃圾收集、线程等信息&#xff0c;并且可以对内…

Linux - 利用/proc/sys/vm/drop_caches实现手工清理系统缓存

文章目录 现象buff/cache 的作用和含义分析 buff/cache 占用大量内存的原因是否需要清理缓存及其方法 命令清理缓存方法1. sync 命令2. echo 3>/proc/sys/vm/drop_caches 命令 注意事项小结 现象 使用free 命令&#xff0c;看到 buff/cache 占用很多 。 free 命令用于显示系…

用 idea 启动多个实例

在学习负载均衡的时候&#xff0c;要模拟多个实例均提供一个服务&#xff0c;我们要如何用 idea 启动多个实例呢&#xff1f; 如下图&#xff0c;我们已经启动了一个 ProductService 服务&#xff0c;现在想再启动两个相同的服务 1. 选中要启动的服务,右键选择 Copy Configura…

【机器学习】音乐大模型的深入探讨——当机器有了创意,是机遇还是灾难?

&#x1f440;国内外音乐大模型基本情况&#x1f440; ♥概述♥ ✈✈✈如FreeCompose、一术科技等&#xff0c;这些企业专注于开发人工智能驱动的语音、音效和音乐生成工具&#xff0c;致力于利用核心技术驱动文化产业升级。虽然具体公司未明确提及&#xff0c;但可以预见的是…

docker搭建mongo副本集

1、mongo集群分类 MongoDB集群有4种类型&#xff0c;分别是主从复制、副本集、分片集群和混合集群。 MongoDB的主从复制是指在一个MongoDB集群中&#xff0c;一个节点&#xff08;主节点&#xff09;将数据写入并同步到其他节点&#xff08;从节点&#xff09;。主从复制提供…

图像数字化基础

一、像素 1、获取图像指定位置的像素 import cv2 image cv2.imread("E:\\images\\2.png") px image[291,218] print("坐标(291,218)上的像素的BGR值是&#xff1a;",px) &#xff08;1&#xff09;RGB色彩空间 R通道&#xff1a;红色通道 G通道&…

Failed to establish a new connection: [WinError 10061] 由于目标计算机积极拒绝,无法连接

在进行参数化读取时发现一个问题&#xff1a; 发现问题&#xff1a; requests.exceptions.ConnectionError: HTTPConnectionPool(hostlocalhost, port8081): Max retries exceeded with url: /jwshoplogin/user/update_information.do (Caused by NewConnectionError(<url…

MFC学习--CListCtrl复选框以及选择

如何展示复选框 //LVS_EX_CHECKBOXES每一行的最前面带个复选框//LVS_EX_FULLROWSELECT整行选中//LVS_EX_GRIDLINES网格线//LVS_EX_HEADERDRAGDROP列表头可以拖动m_listctl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES | LVS_EX_GRIDLINES); 全选&#xff0c;全…

React+TS 从零开始教程(2):简中简 HelloWolrd

源码链接&#xff1a;https://pan.quark.cn/s/c6fbc31dcb02 这一节&#xff0c;我们来见识ReactTS的威力&#xff0c;开始上手开发第一个组件&#xff0c;什么组件呢&#xff1f; 当然是简中简的 HelloWolrd组件啦。 在src下创建一个components&#xff0c;然后新建Hello.tsx …

车载测试系列:CAN协议之远程帧

远程帧&#xff08;也叫遥控帧&#xff09;&#xff1a;是接收单元向发送单元请求发送具有标识符的数据所用的帧&#xff0c;由 6 个段组成&#xff0c;没有数据段。 当某个节点需要数据时&#xff0c;可以发送远程帧请求另一节点发送相应数据帧。 简单的说&#xff1a;发起方…

数据库理论大题与编译原理大题(笔记)

目录 数据库&#xff08;求最小函数依赖&#xff09; 数据库&#xff08;求属性集的闭包和候选码&#xff09; 编译原理&#xff08;NFA ——> DFA&#xff09; 编译原理&#xff08;识别文法的活前缀 DFA 和 LR(0) 分析表&#xff09; 哈哈&#xff01;这是本人作者才…

计算机组成入门知识

前言&#x1f440;~ 数据库的知识点先暂且分享到这&#xff0c;接下来开始接触计算机组成以及计算机网络相关的知识点&#xff0c;这一章先介绍一些基础的计算机组成知识 一台计算机如何组成的&#xff1f; 存储器 CPU cpu的工作流程 主频 如何衡量CPU好坏呢&#xff1f…

多路h265监控录放开发-(12)完成全部开始录制和全部停止录制代码

xviewer.h 新增 public: void StartRecord();//126 开始全部摄像头录制 void StopRecord();//126 停止全部摄像头录制 xviewer.cpp 新增 //视频录制 static vector<XCameraRecord*> records;//126void XViewer::StartRecord() //开始全部摄像头录制 126 {StopRecord…

leetcode刷题日记

题目描述 解题思路 基本思想&#xff0c;将数组复制一份&#xff0c;按照位置取余&#xff0c;确实做出来了&#xff0c;但是这样时间和空间上的资源比较多。看到切片法&#xff0c;感觉到很新&#xff0c;思路很好&#xff0c;用来记录。 代码 python class Solution:def ro…

C++设计模式——Flyweight享元模式

一&#xff0c;享元模式简介 享元模式是一种结构型设计模式&#xff0c;它将每个对象中各自保存一份数据的方式改为多个对象共享同一份数据&#xff0c;该模式可以有效减少应用程序的内存占用。 享元模式的核心思想是共享和复用&#xff0c;通过设置共享资源来避免创建过多的实…

mysql高级语句2存储过程

CREATE VIEW 视图&#xff0c;可以被当作是虚拟表或存储查询。 视图跟表格的不同是&#xff0c;表格中有实际储存数据记录&#xff0c;而视图是建立在表格之上的一个架构&#xff0c;它本身并不实际储存数据记录。 临时表在用户退出或同数据库的连接断开后就自动消失了&…

C++20中的Feature Test Mocros

C20定义了一组预处理器宏&#xff0c;用于测试各种语言和库的feature。 Feature Test Mocros(特性测试宏)是C20中引入的一种强大机制&#xff0c;用于应对兼容性问题。Feature Test Mocros作为预处理器指令(preprocessor directives)出现&#xff0c;它使你能够在编译过程中仔细…