GLSL中的std140注意事项

devtools/2024/9/19 11:53:19/ 标签: opengl, GLSL, c++

一、关于bool的注意事项

以下是笔者在学习OpenGL相关内容时遇到的问题

struct UniformBufferObject {alignas(16) igm::vec3 viewPos;alignas(4) bool useColor;
};

这是我在C++程序中声明的一个UBO,对应于着色器中的:

layout(std140, binding = 1) uniform UniformBufferObject {vec3 viewPos;bool useColor;
} ubo;

我在C++程序中给声明的UBO进行赋值,也就是

UniformBufferObject ubo;
ubo.viewPos = igm::vec3(1.0f);
ubo.useColor = false;

但是这段代码在实际运行中并不能得到正确的答案,原因就在于笔者对C++的alignas(4)用法不熟悉
首先先看GLSL中的std140布局规则(以下内容引用自LearnOpenGL)

类型布局规则
标量,比如int和bool每个标量的基准对齐量为N
向量2N或者4N。这意味着vec3的基准对齐量为4N
标量或向量的数组每个元素的基准对齐量与vec4的相同
矩阵储存为列向量的数组,每个向量的基准对齐量与vec4的相同
结构体等于所有元素根据规则计算后的大小,但会填充到vec4大小的倍数

std140布局规则的对齐偏移量实例

layout (std140) uniform ExampleBlock
{// 基准对齐量       // 对齐偏移量float value;     // 4               // 0 vec3 vector;     // 16              // 16  (必须是16的倍数,所以 4->16)mat4 matrix;     // 16              // 32  (列 0)// 16              // 48  (列 1)// 16              // 64  (列 2)// 16              // 80  (列 3)float values[3]; // 16              // 96  (values[0])// 16              // 112 (values[1])// 16              // 128 (values[2])bool boolean;    // 4               // 144int integer;     // 4               // 148
};

因此可以知道,我们的UBO占用16个字节,在我们C++的处理中确实可以让struct UniformBufferObject对齐到16字节,通过std::cout << sizeof(UniformBufferObject) << std::endl;得到16就是一个验证。

layout(std140, binding = 1) uniform UniformBufferObject {// 基准对齐量       // 对齐偏移量vec3 viewPos;  	// 16			   // 0bool useColor;  // 4			   // 12
} ubo;

但最重要的是struct UniformBufferObject中的alignas(4) bool useColor;,由于bool类型在C++中只占一个字节,如果我们对useColor进行赋值时只会对alignas(4)对齐到的4字节的第一个字节进行赋值,后续三个字节是由C++进行随机填充的,用以下代码就可以查看ubo中的字节码

struct UniformBufferObject {alignas(16) igm::vec3 viewPos;alignas(4) bool useColor;
};UniformBufferObject ubo;
ubo.viewPos = igm::vec3(1.0f);
ubo.useColor = false;// Convert the struct pointer to char pointer
char* bytes = reinterpret_cast<char*>(&ubo);// Print bytes in hexadecimal format
std::cout << "Byte representation of ubo:" << std::endl;
for (size_t i = 0; i < sizeof(ubo); ++i) {std::cout << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(bytes[i]) << " ";
}
std::cout << std::endl;

输出结果为:

Byte representation of ubo:
00 00 ffffff80 3f 00 00 ffffff80 3f 00 00 ffffff80 3f 00 ffffffcc ffffffcc ffffffcc

可以看到对齐到四字节的bool类型最终字节码为00 ffffffcc ffffffcc ffffffcc,也就是说,当该串字节传入GLSL时,最后四字节的表示不等于0,因此也就不为false,由于GLSL基于std140的解释会将bool类型的四个字节合到一起进行解释,因此我们需要对四个字节一起进行赋值,一个简单的办法就是alignas(4) bool useColor;更改为alignas(4) int useColor;,我们在C++中也将四个字节当作一个整体进行赋值,这样就能保证GLSL中四个字节所解释成的bool类型为正确的数值,重新运行上诉代码
输出结果为:

Byte representation of ubo:
00 00 ffffff80 3f 00 00 ffffff80 3f 00 00 ffffff80 3f 00 00 00 00

由此保证了C++中的数据与GLSL中的数据的解释一致性。


http://www.ppmy.cn/devtools/5016.html

相关文章

一文讲透彻Redis 持久化

文章目录 ⛄1.RDB持久化&#x1fa82;&#x1fa82;1.1.执行时机&#x1fa82;&#x1fa82;1.2.RDB原理&#x1fa82;&#x1fa82;1.3.小结 ⛄2.AOF持久化&#x1fa82;&#x1fa82;2.1.AOF原理&#x1fa82;&#x1fa82;2.2.AOF配置&#x1fa82;&#x1fa82;2.3.AOF文件…

[网络安全]-059-安全大模型以及训练数据集

Contents Tools IntegratedAuditReconnaissanceOffensiveDetectingPreventingSocial EngineeringReverse EngineeringInvestigationFixAssessmentCases ExperimentalAcademicB

GRAF: Generative Radiance Fields for 3D-Aware Image Synthesis

GRAF: Generative Radiance Fieldsfor 3D-Aware Image Synthesis&#xff08;基于产生辐射场的三维图像合成&#xff09; 思维导图&#xff1a;https://blog.csdn.net/weixin_53765004/article/details/137944206?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3…

【全开源】多功能完美运营版商城 虚拟商品全功能商城 全能商城小程序 智慧商城系统 全品类百货商城

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 完美运营版商城/拼团/团购/秒杀/积分/砍价/实物商品/虚拟商品等全功能商城 干干净净 没有一丝多余收据 还没过手其他站 还没乱七八走的广告和后门 后台可以自由拖曳修改前端UI页面 …

python 海龟画图tutle螺旋线

目录 初识turtle模块 基本绘图概念 示例&#xff1a;绘制一个正方形 示例&#xff1a;绘制彩色螺旋线 附录 常用命令 其它命令 在Python编程中&#xff0c;使用turtle模块进行图形绘制是一种非常有趣和富有教育意义的活动。通过控制一个小海龟&#xff08;Turtle&#x…

C++必修:从C语言到C++的过渡(上)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 贝蒂的主页&#xff1a;Betty’s blog 1. 什么是C C&#xff08;c plus plus&#xff09;是一种计算机高级程序设计语言&…

朗思-我的家园正式上线:朗思科技Agent工具软件--人人拥有“Ai-机器人”

4月16日&#xff0c;朗思科技正式发布"朗思-我的家园"。朗思科技是国内领先的Ai Agent智能自动化工具软件产品及方案的提供商&#xff0c;始终坚持自主研发&#xff0c;全面支持国产信创&#xff0c;不断加快产品创新迭代。基于技术领先性和战略前瞻性&#xff0c;其…

XiaodiSec day017 Learn Note 小迪渗透学习笔记

XiaodiSec day017 Learn Note 小迪渗透学习笔记 记录得比较凌乱&#xff0c;不尽详细 day 17 主要内容&#xff1a; php 框架 thinkPHPyiilaravel 使用 fofa 搜索 thinkphp 市面上 thinkphp5 版本较多 url 结构 域名/.php(文件名)/index(目录)/index(函数名)模块名-控…

探索设计模式的魅力:融合AI大模型与函数式编程、开启智能编程新纪元

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 ✨欢迎加入探索AI大模型与函数式编程模式融合之旅✨ 在编程世界的广阔疆域里&#xff0c;两大…

C语言基础入门案例(3)

目录 第一题&#xff1a;一维数组的最大值和最小值求解 第二题&#xff1a;求一维数组中的第二大的数 第三题&#xff1a;计算5个整数的平均值 第四题&#xff1a;查找整数在数组中的索引位置 第五题&#xff1a;统计字符串中数字字符的个数 第一题&#xff1a;一维数组的…

【Linux】详解进程通信中信号量的本质同步和互斥的概念临界资源和临界区的概念

一、同步和互斥的概念 1.1、同步 访问资源在安全的前提下&#xff0c;具有一定的顺序性&#xff0c;就叫做同步。在多道程序系统中&#xff0c;由于资源有限&#xff0c;进程或线程之间可能产生冲突。同步机制就是为了解决这些冲突&#xff0c;保证进程或线程之间能够按照既定…

JAVA 集合框架(一) Collection集合详解和常用方法

Java集合框架&#xff08;Java Collections Framework&#xff09;是一个强大的、高度灵活的数据结构库&#xff0c;它为Java应用程序提供了组织、存储和操作对象集合的标准方法。 集合类体系结构 接口类&#xff1a; Collection: 是单例集合类的顶层接口&#xff0c;包括Lis…

09-ARM开发板的HelloWorld

在ARM开发板上运行x86_64平台程序 前面在Ubuntu系统编译生成了X86_64平台的HelloWorld程序&#xff0c;通过NFS服务器&#xff0c;尝试在开发板上直接运行。 如图所示&#xff0c;程序无法正常运行&#xff0c;终端提示ARM开发板在执行x86架构&#xff08;Intel或AMD&#xff…

centos7安装openGauss数据库企业版

本文章是在CentOS7虚拟机上安装openGauss企业版数据库流程 1.下载安装包: https://opengauss.org/zh/download/ openGauss-5.0.1-CentOS-64bit-all.tar.gz 2.安装python3.6.9 见我的另一篇文章 CentOS7安装Python3-CSDN博客 3.检查工具依赖&#xff1a; 分别检查以下工具是…

部署ELFK+zookeeper+kafka架构

目录 前言 一、环境部署 二、部署ELFK 1、ELFK ElasticSearch 集群部署 1.1 配置本地hosts文件 1.2 安装 elasticsearch-rpm 包并加载系统服务 1.3 修改 elasticsearch 主配置文件 1.4 创建数据存放路径并授权 1.5 启动elasticsearch是否成功开启 1.6 查看节点信息 …

使用Python实现超参数调优

超参数调优是机器学习模型调优过程中的重要步骤&#xff0c;它可以帮助我们找到最佳的超参数组合&#xff0c;从而提高模型的性能和泛化能力。在本文中&#xff0c;我们将介绍超参数调优的基本原理和常见的调优方法&#xff0c;并使用Python来实现这些方法。 什么是超参数&…

面试题:Kafka中Controller的作用是什么?选举流程是怎样的?以及如何避免脑裂问题?

题目来源 网上冲浪&#xff1a;还不懂分布系统&#xff0c;速看深度剖析Kafka Controller选举过程 在查找关于Kafka单机分区的上限以及分区多了会有怎样的问题的时候&#xff0c;发现了这个比较有趣的问题&#xff0c;就记录了下来。 一般所有的分布式系统&#xff0c;都会涉及…

linux——Bash特性

bash是一个命令解释器&#xff0c;其支持命令行展开&#xff5b;&#xff5d;写法 alias是命令别称&#xff0c;即为命令等同于&#xff0c;使用unalias对应命令可以取消该别称 alias可以对命令进行更改

Apache Doris 2.1.2 版本正式发布!

亲爱的社区小伙伴们&#xff0c;Apache Doris 2.1.2 版本已于 2024 年 4 月 12 日正式发布。该版本提交了若干改进项以及问题修复&#xff0c;进一步提升了系统的性能及稳定性&#xff0c;欢迎大家下载体验。 官网下载页&#xff1a;https://doris.apache.org/download/ GitH…

牛客周赛 Round 40(补题)C题

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 小红拿到了一个长度为nnn的数组aaa&#xff0c;她希望你构造两个排列ppp和qqq&#xff0c;满足对于i∈[1,n],aii∈[1,n],a_ii∈[1,n],ai​为pip_ipi​或qiq_iqi​二选一。你能帮帮她…