c++ - 我需要关于 std140 统一块偏移的解释
问题描述
对不起标题,但我真的不知道如何命名我的问题。我正在阅读一本 opengl 书中的统一块,我对那里显示的默认 std140 偏移量有点困惑。
layout(std140) uniform TransformBlock
{
//component base alignment | offset | aligned offset
float scale; // 4 | 0 | 0
vec3 translation; // 16 | 4 | 16
float rotation[3]; // 16 | 28 | 32 (rotation[0])
// 48 (rotation[1])
// 64 (rotation[2])
mat4 projection_matrix; // 16 | 80 | 80 (column 0)
// 96 (column 1)
// 112 (column 2)
// 128 (column 3)
} transform;
我知道vec3
' 对齐 = vec4
' 对齐 = 32 位。
比例是第一个分量,所以偏移量是 0,也是 4 位,所以我很清楚翻译需要在 - 我们称之为 currentPosition - currentPosition + 4。
不过,我不明白为什么翻译的偏移量对齐是 16。
另外,我不清楚为什么旋转的偏移量是 28。
翻译过来就是vec3
,意思是有3个float
s,所以3 * 4 = 12。我的第一个想法是我们可能想把它四舍五入为a,我不知道它怎么叫,位值,但是28不是一个值那种。
与 projection_matrix 的偏移量相同。
谁能像我是个白痴一样向我解释一下,好吗?
解决方案
OpenGL 没有定义一个叫做“偏移对齐”的概念。也许你的书在谈论一些派生的数量,但由于你没有给书命名,也没有引用这个例子以外的任何东西,我不能说。
std140 布局的价值量是大小(占用多少空间)、基本对齐方式、偏移量和数组跨度(显然只对数组有意义)。基本对齐对偏移施加了限制;偏移量必须能被基本对齐方式整除。
vec3
大小为 12,因为它包含 3 个 4 字节值。它的基本对齐为 16,因为这就是标准所说的:
如果成员是一个三分量向量,其分量消耗 N 个基本机器单元,则基本对齐为 4N。
成员的偏移量是通过计算前一个成员的偏移量,加上前一个成员的大小,然后将基本对齐应用于该值来计算的。
因此,假设scale
偏移量为 0,大小为 4,基本对齐方式为 4,则偏移量translation
为 16(4,四舍五入到最接近的基本对齐方式)。
的基本对齐和数组步幅rotation
是 16,因为这就是标准所说的:
如果成员是标量或向量数组,则根据规则 (1)、(2) 和 (3) 设置基本对齐方式和数组跨度以匹配单个数组元素的基本对齐方式,并向上取整为a 的基本对齐方式
vec4
。
重点补充。
因此, 的偏移量translation
为 16,其大小为 12。将它们加在一起,得到 28。要获得 的偏移量rotation
,应用rotation
的基本对齐方式,得到 32。
另外,停止使用vec3
s。
推荐阅读
- javascript - 侧边栏没有在 vue.js #app 元素内折叠(sb-admin-2)
- javascript - 成功发布请求后的 http-proxy-middleware econnreset 错误
- python - not able to find tfjs-node bindings
- html - 执行包含在变量中的 HTML 代码
- android - Android-无法将 SVG 添加到导航抽屉图标
- laravel - 为什么缺少 [Route: pesquisaavan] 所需的参数
- java - 以文件名末尾的增量保存图像文件
- javascript - 使用 javascript 将 url.action 添加到锚标记不起作用
- python - 在密集地形精灵表中自动检测单个精灵边界
- c++ - 为什么作用域解析运算符 (::) 不允许使用虚函数机制?否则可能导致无限递归