GLSL中的std140注意事项

2024-04-21 05:20
文章标签 注意事项 glsl std140

本文主要是介绍GLSL中的std140注意事项,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、关于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中的数据的解释一致性。

这篇关于GLSL中的std140注意事项的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/922247

相关文章

bytes.split的用法和注意事项

当然,我很乐意详细介绍 bytes.Split 的用法和注意事项。这个函数是 Go 标准库中 bytes 包的一个重要组成部分,用于分割字节切片。 基本用法 bytes.Split 的函数签名如下: func Split(s, sep []byte) [][]byte s 是要分割的字节切片sep 是用作分隔符的字节切片返回值是一个二维字节切片,包含分割后的结果 基本使用示例: pa

Vue项目开发各种注意事项

1、eCharts引入方式(单页面) import * as echarts from 'echarts'Vue.prototype.$echarts = echarts 2、Sass引入 sass和node-sass 中 node-sass不要引入最新版本  引入@7.x 否则会报错 可能是语法规则改变 3、严格模式不要随意开启、将eslint文件中 extends: 中的vue去除

Exchange 服务器地址列表的配置方法与注意事项

Exchange Server 是微软推出的一款企业级邮件服务器软件,广泛应用于企业内部邮件系统的搭建与管理。配置 Exchange 服务器地址列表是其中一个关键环节。本文将详细介绍 Exchange 服务器地址列表的配置方法与注意事项,帮助系统管理员顺利完成这一任务。 内容目录 1. 引言 2. 准备工作 3. 配置地址列表 3.1 创建地址列表 3.2 使用 Exchange

API28_OKgo_get注意事项

1: implementation 'com.lzy.net:okgo:2.1.4' 2:在BaseApplication中onCreate()中初始化initOKgo() private void initOKgo() {//---------这里给出的是示例代码,告诉你可以这么传,实际使用的时候,根据需要传,不需要就不传-------------//HttpHeaders headers

【VueJS】live-server 快速搭建服务 及 注意事项

本地开发常常需要搭建临时的服务,第一时间我们会想到用 http-server。 但现在流行修改文件浏览器自动刷新,这里可以使用 live-server 很简单就能启动一个看起来很专业的本地服务。 你只需要全局安装live-server: npm install -g live-server 并在项目根目录执行这条命令: PS E:\AblazeProject\Vue> live-serv

镭射定位灯激光定位使用注意事项?

在现代工业、建筑测量、舞台设计以及科研实验等领域,镭射定位灯(常称激光定位器)因其高精度、远射程和直观性而得到广泛应用。然而,激光作为一种高强度光束,其使用若不当,不仅可能损害设备,还可能对人体健康造成危害。因此,掌握镭射定位灯激光定位的正确使用方法及注意事项至关重要。下面就跟着鑫优威一起来了解一下。   一、安全为先,做好防护   首先,操作者必须佩戴符合标准的激光防护眼镜,以防止激光直

pyinstaller打包使用注意事项

pyinstaller注意事项 为了打包python程序,将其转换为可执行程序方便调用,无论是linux还是windows环境都可以正常使用 环境推荐,python3.11 安装使用 前提条件是安装好了python3 pip install pyistaller -i https://pypi.tuna.tsinghua.edu.cn/simple/ 安装后,检查版本 pyinst

编写Javascript时的注意事项

1、预留退路 网站的访问者完全有可能使用的是不支持JavaScript的浏览器,有一些可能是浏览器不支持,或者是浏览器支持,但用户为了避免讨厌的弹出广告而仅用了。在这种情况下,就要保证,你的网站即使在所有的JavaScript都失效时,仍然能够正常访问。 使用伪协议是很不好的习惯 JavaScript 伪协议 (pseudo-protocol) "javascript:" 伪协议让我

La-Z-Boy 标签制作注意事项

在制作标签之前,供应商需要通过EDI向La-Z-Boy发送提前发货通知(ASN)。ASN中的每个明细行将会至少对应一个运输编号(shipment ID),这个信息将会被体现在运输标签上,和标签上的条形码一起,用于La-Z-Boy收货。 供应商必须确保其装箱单以及发票中的信息能够对应上该批次货物的运输标签以及相关运输编号。供应商可以在La-Z-Boy提供的标签文档中,找到La-Z-Boy EDI部

2024高教社杯全国大学生数学建模国赛论文提交流程+注意事项+重要节点

竞赛时间:2024年9月5日18时到2024年9月8日20时 每个赛区推送国奖数量不一样,总体上报名数量越多推送数量越多,但是难度越大。 需要提交参赛论文和支撑材料,参赛论文必须交,支撑材料选交 需要在9月8日20时之前提交MD5码