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

时间:2016-09-03 05:23:55

标签: c++ opengl shader

我一直在阅读关于OpenGL Superbible第6版中的std140 Uniform块,其中在第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. 为什么rotation [0]偏移量从28开始,为什么对齐偏移量为32?

  3. 希望有人能清除我的困惑。我将非常感激。 感谢

1 个答案:

答案 0 :(得分:2)

  

什么是偏移

如果不是因为对齐要求,变量将具有的字节偏移量。

  

和对齐的偏移量,

它实际上具有的字节偏移量。

  

为什么2个不同的偏移?

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

  

为什么rotation [0]偏移量从28开始,

因为vec3something you should never use)是3个浮点数。

  

为什么对齐的偏移是32?

因为在std140规则下,任何数组的基本对齐,无论其元素的类型如何,总是向上舍入到vec4的对齐。 AKA:16个字节。