【问题标题】:I need explanation about std140 uniform blocks offsets我需要关于 std140 统一块偏移的解释
【发布时间】:2019-05-01 03:14:12
【问题描述】:

对不起标题,但我真的不知道如何命名我的问题。 我正在阅读一本 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 位。

Scale 是第一个分量,所以偏移量是 0,也是 4 位,所以我很清楚翻译需要在 - 我们称之为 currentPosition - currentPosition + 4。

不过,我不明白为什么翻译的偏移量的对齐方式是 16。

另外,我不清楚为什么旋转的偏移量是 28。

翻译为vec3,表示有3个floats,所以3 * 4 = 12。 我的第一个想法是我们可能想将它四舍五入为a,我不知道它是如何调用的,位值,但是28不是那种值。

与投影矩阵的偏移量相同。

谁能像我是个白痴一样向我解释一下,好吗?

【问题讨论】:

  • "我知道 vec3 = vec4 = 32 位。" 但事实并非如此。
  • @NicolBolas 现在可以了吗?
  • “偏移对齐”到底是什么意思?
  • 我不知道,书中没有解释,但我猜它是偏移量四舍五入到2的幂。然而projection_matrix有80个偏移量的对齐方式。
  • 偏移 != 对齐

标签: c++ opengl


【解决方案1】:

OpenGL 没有定义一个叫做“偏移对齐”的概念。也许你的书在谈论一些派生的数量,但由于你没有给书命名,也没有引用这个例子以外的任何内容,我不能说。

关于 std140 布局的价值量是大小(占用多少空间)、基本对齐、偏移量和数组跨度(显然只对数组有意义)。基本对齐对偏移施加了限制;偏移量必须能被基本对齐方式整除。

vec3 的大小为 12,因为它包含 3 个 4 字节值。它的基本对齐为 16,因为这就是标准所说的:

如果成员是一个三分量向量,其分量消耗 N 基本机器单元,基本对齐为4N。

一个成员的偏移量是通过计算前一个成员的偏移量,加上前一个成员的大小,然后对该值应用基本对齐方式来计算的。

因此,假设scale 的偏移量为 0,大小为 4,基本对齐方式为 4,translation 的偏移量为 16(4,四舍五入到最接近的基本对齐方式)。

rotation 的基本对齐和数组步长是 16,因为这是标准所说的:

如果成员是标量或向量数组,则基对齐和数组 stride 设置为匹配单个数组元素的基本对齐方式,根据 符合规则 (1)、(2) 和 (3),并四舍五入到 vec4 的基本对齐方式

添加了重点。

所以,translation 的偏移量是 16,它的大小是 12。把它们加在一起,你得到 28。要得到 rotation 的偏移量,你应用 rotation 的基本对齐,给你32.

另外,stop using vec3s

【讨论】:

  • 现在我完全清楚了,谢谢。本书名为 OpenGL Superbible:综合教程和参考第 7 版。我的副本被翻译成我的语言,封面不同,很难找到。
猜你喜欢
  • 2013-03-15
  • 1970-01-01
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
  • 2020-01-18
  • 1970-01-01
  • 2019-11-08
  • 2019-02-07
相关资源
最近更新 更多