OpenGL统一标准缓冲区对齐混淆

OpenGL Uniform Standard Buffer Alignment confusion

本文关键字:对齐 缓冲区 统一标准 OpenGL      更新时间:2023-10-16

我一直在阅读关于OpenGL Superbible第6版中的std140统一块,其中在第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. 什么是偏移量,什么是对齐偏移量,为什么2个不同的偏移量?

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

希望有人能澄清我的困惑。我将非常感激。由于

什么是偏移

变量的字节偏移量,如果不符合其对齐要求,将具有。

和什么是对齐偏移,

实际的字节偏移量。

为什么2个不同的偏移?

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

为什么旋转[0]的偏移量从28开始,

因为vec3(这是你应该永远不要使用的东西)是3个浮点数。

为什么对齐偏移量是32?

因为在std140规则下,任何数组的基本对齐方式,无论其元素的类型如何,总是四舍五入到vec4的对齐方式。又名:16字节