gpt4 book ai didi

c++ - OpenGL统一标准缓冲区对齐困惑

转载 作者:行者123 更新时间:2023-11-30 03:38:47 24 4
gpt4 key购买 nike

我一直在阅读 OpenGL Superbible 第 6 版中有关 std140 Uniform block 的内容,其中第 111 页给出了以下示例:

layout(std140) uniform TransformBlock
{
//Member 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)
}

我很难理解对齐方式,即使使用该页面前面描述的规则,它仍然没有意义。具体来说让我感到困惑的是:

  1. 什么是Offset,什么是aligned offset,为什么是2个不同的offset?

  2. 为什么 rotation[0] 偏移量从 28 开始,为什么对齐偏移量是 32?

希望有人能消除我的困惑。我将不胜感激。谢谢

最佳答案

What is the Offset

如果不满足其对齐要求,变量本应具有的字节偏移量

and what is aligned offset,

它实际拥有的字节偏移量。

why 2 different offset?

因为如果变量有不同的对齐要求,那么实际的偏移量就会不同。例如,给定上面的代码,translation 由于其对齐要求而具有 16 的对齐偏移量。然而,如果 translation 是一个 float,那么它将有一个对齐的偏移量 4。如果它是一个 vec2,它将有一个对齐的偏移量8 的偏移量。

Why is the rotation[0] offset starts at 28,

因为 vec3(即 something you should never use)是 3 个 float 。

and why aligned offset is 32?

因为根据 std140 规则,任何数组 的基本对齐方式,无论其元素的类型如何,总是向上取整到 vec4 的对齐方式。又名:16 个字节。

关于c++ - OpenGL统一标准缓冲区对齐困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39303532/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com