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

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

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

相关文章

程序人生:关于RHCE红帽认证这件事

花了两个月备考红帽&#xff0c;最终终于双满分通过。 关于考试 RHCE红帽认证总共需要考两门&#xff1a;RHCSA、RHCE。 RHCSA主要是考察基本的Linux操作&#xff1a;用户、权限、空间扩容、yum、容器等内容。 RHCE主要是考察ansible playbook 代码的开发。 通过考试没有别…

【内存管理】页面分配机制

前言 Linux内核中是如何分配出页面的&#xff0c;如果我们站在CPU的角度去看这个问题&#xff0c;CPU能分配出来的页面是以物理页面为单位的。也就是我们计算机中常讲的分页机制。本文就看下Linux内核是如何管理&#xff0c;释放和分配这些物理页面的。 伙伴算法 伙伴系统的…

设计模式4-模版方法

设计模式 重构获得模式重构的关键技法1. 静态转动态2. 早绑定转晚绑定3. 继承转组合4. 编译时依赖转运行时依赖5. 紧耦合转松耦合 组件协助动机模式定义结构 要点总结。 例子示例解释&#xff1a; 重构获得模式 设计模式的目的是应对变化&#xff0c;提高复用 设计模式的要点…

[SAP ABAP] 排序内表数据

语法格式 整表排序 SORT <itab> [ASCENDING|DESCENDING]. 按指定字段排序 SORT <itab> BY f1 [ASCENDING|DESCENDING] f2 [ASCENDING|DESCENDING] ... fn [ASCENDING|DESCENDING].<itab>&#xff1a;代表内表 不指定排序方式则默认升序排序 示例1 结果显…

.hmallox勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

导言&#xff1a; 在当今数字化时代&#xff0c;勒索病毒已经成为网络安全的一大威胁&#xff0c;其中包括了最近出现的.hmallox勒索病毒。这类恶意软件不仅能够对计算机系统进行加密&#xff0c;还会要求用户支付赎金以换取解密密钥&#xff0c;给个人用户和企业带来了严重的…

C++的特殊类设计 饥饿汉模式

目录 特殊类设计 设计一个不能被拷贝的类 设计一个只能在堆上创建对象的类 设计一个只能在栈上创建对象的类 设计一个不能继承的类 设计模式 单例模式 饿汉模式 饥汉模式 特殊类设计 设计一个不能被拷贝的类 C98的设计方式&#xff1a;将该类的拷贝构造和赋值运算符…

一小时搞定Git(含盖IDEA使用)

文章目录 1. git基本概念1.1版本控制1.1.1 版本控制软件 2. 命令的使用2.1 Linux命令2.2 git基础指令2.2.1 设置用户2.2.2 初始化本地仓库2.2.3 查看本地仓库状态2.2.4 添加暂存区域2.2.5 提交本地库2.2.6 切换版本 2.3 分支操作2.3.1 分支基本操作2.3.2 合并操作2.3.4 分支开发…

基于STM32的智能家居安防系统

目录 引言环境准备智能家居安防系统基础代码实现&#xff1a;实现智能家居安防系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景&#xff1a;智能家居安防管理与优化问题解决方案与优化收尾与总结 1. 引言 智能家居安防系统通过使…

195.回溯算法:分割回文串(力扣)

代码解决 class Solution { public:vector<string> res; // 当前路径&#xff0c;用于存储一个可能的回文分割结果vector<vector<string>> result; // 存储所有可能的回文分割结果// 判断子串 s[left:right] 是否是回文bool isPalindrome(const string& …

Linux应用系统快速部署:docker快速部署linux应用程序

目录 一、背景 &#xff08;一&#xff09;引入docker的起因 &#xff08;二&#xff09;docker介绍 &#xff08;三&#xff09;Docker部署的优势 1、轻量级和可移植性 2、快速部署和扩展 3、一致性 4、版本控制 5、安全性 6、资源隔离 7、简化团队协作 8、多容器…

VMware虚拟机三种网络模式设置 - Bridged(桥接模式)

一、前言 由于linux目前很热门&#xff0c;越来越多的人在学习linux&#xff0c;但是买一台服务放家里来学习&#xff0c;实在是很浪费。那么如何解决这个问题&#xff1f;虚拟机软件是很好的选择&#xff0c;常用的虚拟机软件有vmware workstations和virtual box等。 在使用虚…

基于imx6ull开发板 移植opencv4.7.0

一、概述 本章节是针对opencv-4.7.0移植到Linux系统&#xff0c;运行在正点原子-I.MX6U ALPHA开发板 上&#xff0c;详细的移植流程如下。 二、环境要求 2.1 硬件环境 正点原子-I.MX6U ALPHA开发板虚拟机&#xff1a;VMware 2.2 软件环境 Ubuntu系统要求&#xff1a;20.0…

DIVE INTO DEEP LEARNING 50-55

文章目录 50. semantic segmentation50.1 Basic concepts50.2 Major application 51. Transposed convolution51.1 Basic concepts51.2 Major role51.3 Implementation steps and application areas51.4 Transposed convolution51.5 Transposed convolution is a type of convo…

谁说串口通信波特率越高越好?

在电子世界里&#xff0c;串口通信就像是电子设备之间的“悄悄话”&#xff0c;它们通过串行数据传输来交换信息。但你知道吗&#xff1f;串口通信的波特率并不是越高越好&#xff0c;这事儿得好好聊聊。 1.什么是串口通信&#xff1f; 串口通信&#xff0c;就像它的名字一样&a…

深度学习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;可能会产生…

计算机组成原理 —— 存储系统(DRAM和SRAM,ROM)

计算机组成原理 —— 存储系统&#xff08;DRAM和SRAM&#xff09; DRAM和SRAMDRAM的刷新DRAM地址复用ROM&#xff08;Read-Only Memory&#xff08;只读存储器&#xff09;&#xff09; 我们今天来看DRAM和SRAM&#xff1a; DRAM和SRAM DRAM&#xff08;动态随机存取存储器&…

展示3D模型的网站哪个好?

如果仅仅是模型展示&#xff0c;目前国内外值得推荐的无非就是那么几个&#xff0c;它们各自有不同的特点和优势&#xff1a; 1、Sketchfab&#xff1a;Sketchfab是一个知名的3D模型展示平台&#xff0c;提供了海量的模型资源和出色的3D展示效果。用户无需安装任何插件即可在线…

Spring Cloud - nacos +ubuntu环境搭建

1、安装ubuntu虚拟环境 VMware虚拟机安装Ubuntu与配置Ubuntu&#xff08;超详细教程&#xff09; 2、docker环境安装 1、apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common 2、curl -fsSL https://mirrors.ustc.edu.cn/docke…

Maven的依赖传递、依赖管理、依赖作用域

在Maven项目中通常会引入大量依赖&#xff0c;但依赖管理不当&#xff0c;会造成版本混乱冲突或者目标包臃肿。因此&#xff0c;我们以SpringBoot为例&#xff0c;从三方面探索依赖的使用规则。 1、 依赖传递 依赖是会传递的&#xff0c;依赖的依赖也会连带引入。例如在项目中…

自动驾驶仿真测试用例表格示例 ACC ELK FCW

自动驾驶仿真测试用例表格示例 测试用例概览 本测试用例表格涵盖了自动驾驶系统中多个关键功能和场景的测试&#xff0c;旨在确保系统在不同条件下的表现和稳定性。 用例编号测试项目测试描述预期结果实际结果通过/失败TC-001ACC功能测试在高速公路上启用ACC&#xff0c;测试车…