《OpenGL宝典》--统一变量

news2024/9/28 15:29:13

统一变量

[layout (location = 0)] uniform float f = 1.0f;

若设置layout,则不需要使用glGetUniformLocation来获取统一变量的位置

使用glUniform*传递值,glUniformMatrix*()设置矩阵统一变量。

glUseProgram(myShader);
glUniform1f(0,45.2f);//0为location = 0的数据位置
glUniform4fv(iColorLocation , 1, vColor);
glUniformMatrixfv(proj_location, 1, GL_FALSE, proj_matrix);

一致区块

为了降低glUniform*的调用成本,更容易在不同应用程序之间共享一系列统一变量。
这种功能称为统一变量缓冲对象。

uniform Block{
	...data
}block1;

数据布局

标准布局std140

标准布局的布局方式与c、c++的结构体的布局方式相同。在传递数据时,使用相同结构的结构体整体传递即可。

align限定符可用于整个区块以强制所有成员对齐到指定边界。如下,bar的偏移量为8,符合vec2的偏移规则,但align设置为16,则bar强制对齐边界为16的倍数,故,offset = 8会被

layout(std140, align = 16) uniform Block
{
	layout (offset = 32) vec4    foo;
	layout (offset = 8)  vec2    bar;
	layout (offset = 48) vec3    baz;
}

报错:offset只能递增,不能随机设置
在这里插入图片描述
修改如下

layout(std140,align = 16) uniform manuallyLaidOutBlock
{
    layout (offset = 8)  vec2    bar;
    layout (offset = 32)  vec4    foo;
	layout (offset = 48)  vec3    baz;
}myBlock;

获取一致区块的信息

const GLchar* unifromName = "manuallyLaidOutBlock.bar";
GLuint uniformindex = -1;
glGetUniformIndices(nanosuitShader.ID, 1, &unifromName, &uniformindex);//获取bar的索引
GLint uniformOffset = -1;
glGetActiveUniformsiv(nanosuitShader.ID,1,&uniformindex,GL_UNIFORM_OFFSET,&uniformOffset);//siv---系统信息显示
cout << uniformOffset << " " << endl;

uniformOffset保存了manuallyLaidOutBlock.bar的偏移量,输入如下:
在这里插入图片描述
进一步说明了align = 16的作用。

共享布局shared

利用shared布局,可以使缓存中的数据根据OpenGL确定的最佳运行性能和最佳着色器访问进行布局。但必须获取区块信息。
通过glGetActiveUniformsiv()查询的统一变量参数类型,可查看书P84页。

之后便可在内存构建一致区块,然后使用glBufferSubData()将其加载到缓存或glMapBufferRange()获取内存指针,并直接将数据组装到该内存。

统一变量绑定

方法一

程序中每一个一致区块都有一个分配了编译程序的索引。
获取程序中一致区块的索引,可以调用:

GLuint glGetUniformBlockIndex(GLuint program, const GLchar * uniformBlockName);

为一致区块赋予绑定点,调用:

void glUniformBlockBinding(	GLuint program,
							GLuint uniformBlockIndex,//要赋予绑定点的一致区块索引
							GLuint uniformBlockBinding);//一致区块绑定点的索引			

可使用glGetintegerv()获取绑定点数量上限,glGetintegerv()其他功能见P86页。
OpenGL保证一致区块至少为64K,至少可以在一个程序中引用14个区块。

方法二

直接在着色器中设置binding

layout(std140, align = 16, binding = 2) uniform manuallyLaidOutBlock
{
    layout (offset = 8)  vec2    bar;
    layout (offset = 32)  vec4    foo;
	layout (offset = 48)  vec3    baz;
}myBlock;

将缓存绑定到绑定点

glBindBufferBase(GL_UNIFORM_BUFFER,index,buffer);

GL_UNIFORM_BUFFER指定绑定点为统一变量。
index绑定点的索引
buffer想要绑定的缓存对象的名称

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

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

相关文章

思迅软锁安装配置说明

思迅软锁安装配置说明 一、软锁安装、申请及配置流程 1.软件安装环境要求 2.软件安装配置流程 步骤1: 在平台下载软锁程序并安装。在安装了总部数据库的服务器上&#xff0c;运行“思迅软锁服务.exe”程序&#xff0c;按照指引进行安装&#xff0c;安装完成后将在电脑的桌面上…

微服务之Gateway服务网关

&#x1f3e0;个人主页&#xff1a;阿杰的博客 &#x1f4aa;个人简介&#xff1a;大家好&#xff0c;我是阿杰&#xff0c;一个正在努力让自己变得更好的男人&#x1f468; 目前状况&#x1f389;&#xff1a;24届毕业生&#xff0c;奋斗在找实习的路上&#x1f31f; &#x1…

「亲测」0成本考证填报个税纳税额减免3600

「亲测」0成本考证填报个税纳税额减免3600 今天开始2022综合所得的年度汇算就开始办理了&#xff0c;刚刚步入工作的同学&#xff0c;对个税的填报有些苦恼&#xff0c;好像除了房租就没有能减税的政策了。 别急别急&#xff0c;其实个⼈所得税⾥⾯包含⼀个叫“专项附加扣除”的…

C++ 认识和了解C++

1.在使用C语言写代码的时候开头要用到的是&#xff1a; #include<iostream> using namespace std;不可以写成这样&#xff1a; #include iostream.h&#xff08;1&#xff09;iostream是输入输出流类&#xff0c; istream输入流类 cin >> ostream输出流类 cout &…

40系笔记本(可不联网激活)深度学习生产力(环境配置和简单训练测试)

40系笔记本深度学习、转码生产力&#xff08;环境配置和简单训练测试&#xff09;这里写自定义目录标题深度学习环境准备CUDA、CUDNN版本问题torch版本问题其他软件版本的安装命令训练测试代码地址关于Linux还是Windows的问题结果博主首发购买了枪神7超竞4080的版本&#xff0c…

git开发流程

分支介绍 dev&#xff1a;开发环境&#xff0c;从feature去mr test: 测试环境&#xff0c;从feature去mr pre&#xff1a; 预生产环境&#xff0c;从master去mr&#xff0c;为了验证master代码 master: 生产环境&#xff0c;从feature去mr feature&#xff1a; 开发分支----小…

4种方法教你如何隐藏电脑磁盘分区?

磁盘分区是电脑的重要组成部分&#xff0c;我们能够在电脑中保存众多数据&#xff0c;就离不开它。那么你知道该如何隐藏磁盘分区吗&#xff1f;下面小编就教你4个方法隐藏电脑磁盘分区。方法一&#xff1a;使用磁盘管理隐藏硬盘分区1、按下“WinR”键&#xff0c;输入“diskmg…

Python3-元组

Python3 元组 Python 的元组与列表类似&#xff0c;不同之处在于元组的元素不能修改。 元组使用小括号 ( )&#xff0c;列表使用方括号 [ ]。 元组创建很简单&#xff0c;只需要在括号中添加元素&#xff0c;并使用逗号隔开即可。 >>> tup1 (Google, Runoob, 19…

4-1 SpringCloud快速开发入门:RestTemplate类详细解读

RestTemplate类详细解读 RestTemplate 的 GET 请求 Get 请求可以有两种方式&#xff1a; 第一种&#xff1a;getForEntity 该方法返回一个 ResponseEntity对象&#xff0c;ResponseEntity是 Spring 对 HTTP 请求响应的封装&#xff0c;包括了几个重要的元素&#xff0c;比如响…

Python基础篇(十五)-- Pygame游戏编程

1 初识Pygame Pygame是一个开源的Python模块&#xff0c;专门用于多媒体应用&#xff08;如电子游戏&#xff09;的开发&#xff0c;其中包含对图像、声音、视频、事件、碰撞等的支持。Pygame建立在SDL的基础上&#xff0c;SDL是一套跨平台的多媒体开发库&#xff0c;用C语言实…

39万字完整版智能矿山项目建设整体解决方案

本资料来源网络&#xff0c;仅做知识分享&#xff0c;请勿商用。完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 1.1 总体技术要求 1.1.1 核心业务架构 智能矿山业务架构是在统一的标准与规范及安全运维保障体系下&#xff0c;按分层设计模式&#xff0c;分为设备层、…

QML鼠标事件

QML中常用的事件有&#xff1a; 鼠标事件键盘事件拖拽事件定时器MouseArea&#xff08;鼠标区域&#xff09; MouseArea是一个不可见的项目&#xff0c;同、通常用来和一个可见的项目配合使用来为其提供鼠标处理。鼠标处理的逻辑可以包含在MouseArea项目中 常用的属性&#xff…

【设计模式】原型模式与建造者模式

原型模式 原型模式是指通过原型实例指定创建对象的种类&#xff0c;然后通过拷贝的方式创建新的对象。属于创建型模式 原型模式的核心在于拷贝原型对象&#xff0c;主要用于对对象的复制。当你需要通过一大段get/set方法去构建对象的时候&#xff0c;就可以考虑使用原型模式了…

手牵手教Docker部署Springboot+vue ,全过程十分详细,轻松完成项目部署(简单,高效,通用)

手把手教Docker部署Springbootvue &#xff0c;详细全过程&#xff0c;轻松完成项目部署&#xff08;简单&#xff0c;高效&#xff09; 上线前准备 腾讯云的服务器&#xff0c;服务器安装好docker 和docker-compose 最好事先了解技术 nginxdocker-compose 整体编排 后端部…

【C++】Visual Studio C++ 配置并使用gtest(不好用你捶我)

文章目录 相信大家都能感受到Visual Studio C 编辑器链接 lib 或 dll文件是一件非常头疼的事情。配置gooleTest的过程也不例外。 市面上很多教程&#xff0c;要么就不全&#xff0c;要么就缺少一些细节&#xff0c;导致我自己再配置的过程中&#xff0c;踩了很多坑。今天就记录…

用不同的思路实现括号匹配(java)

给定一个只包括 (&#xff0c;) 的字符串&#xff0c;判断字符串是否有效。 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 以上就是题目要求 利用替换的思想 ()()()()()()()(())例如需要判断例子中的括号是否有效&#xff0c;用替换的思想具体就是 将字…

力扣sql简单篇练习(二十一)

力扣sql简单篇练习(二十一) 1 使用唯一标识符替换员工ID 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # Write your MySQL query statement below SELECT e2.unique_id,e1.name FROM Employees e1 LEFT JOIN EmployeeUNI e2 ON e1.ide2.id1.3 运行…

使用netlify实现自动化部署前端项目(无服务器版本)

介绍 本文以 github仓库进行介绍关联netlify的无服务前端自动化部署。用途&#xff1a;个人网站设计、小游戏等当然这只是让你入门~具体细节等待你自己去探索 实现 打开官方网站 如果没有注册过的账户&#xff0c;你需要使用 github 去进行登录。注册完成后会自动给你提示填…

有关Windows域信任关系的一系列知识

简单的总结了一下来自这篇文章的知识点 https://www.kroll.com/-/media/kroll/pdfs/publications/rootedcon2019-pentesting-active-directory-forests-carlos-garcia.pdf 视频录像为 https://www.youtube.com/watch?v6aV5tZlQ2EQ&t10s&themeRefresh1 森林 域是由树和…

项目管理的工作内容有哪些?

首先&#xff0c;什么是项目管理&#xff1f; 项目管理是为了交付项目成果&#xff0c;包括“规划&#xff08;尤其关注估算&#xff09;——实施——确保成功”。项目管理可以用在所有事情上&#xff0c;当然&#xff0c;这个定义听起来可能还不够清晰&#xff0c;但它的好处…