将结构与std140,CPU端对齐

时间:2013-11-13 14:54:10

标签: c++ opengl uniform

我认为这是纯C ++问题和OpenGL问题之间的一种交叉。我有一个统一的缓冲区,并在其中分配sizeof(ShaderData)字节的空间。我在着色器中使用GPU端的std140布局。

根据std140规则,我需要在我的结构中的不同位置添加填充,以确保向量之类的东西正确对齐。下面的结构是一个例子(对于我的光):

struct ShaderData {

    float Light_Intensity;  
    float _pad1[3];    // align following vec3 on 4N boundary
    Math::Vec3f Light_Position;
    float _pad2;       // align following vec4 on 4N boundary
    Math::Colour4f Light_Ambient;
    Math::Colour4f Light_Diffuse;
    Math::Colour4f Light_Specular;    
    float Light_AttenuationMin;
    float Light_AttenuationMax;

} MyShaderData;

这是人们通常在C ++中做事的方式,还是有特殊的关键字或编译指示来对齐结构CPU端的各个元素有点整洁?

1 个答案:

答案 0 :(得分:4)

不,这样你只是浪费空间。您必须根据std140规则找到优化的布局。

  • a float需要4个字节,并且它是4个字节对齐
  • a vec3需要12个字节,并且它是16个字节对齐
  • a vec4需要16个字节,并且它是16个字节对齐

这意味着您可以为结构找到更好的布局:

float Light_Intensity;          X
float _pad1[3];                  XXX
Math::Vec3f Light_Position;         XXX
float _pad2;                           X

正如你所看到的那样,你浪费了4个字节,更糟糕的是你可以做以下事情:

Math::Vec3f Light_Position      XXX
float Light_Intensity;             X

让它对齐而不需要浪费一个字节。这是有效的,因为vec3将与16个字节边界对齐,而float仍将与4个字节边界对齐。