我认为这是纯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端的各个元素有点整洁?
答案 0 :(得分:4)
不,这样你只是浪费空间。您必须根据std140规则找到优化的布局。
float
需要4个字节,并且它是4个字节对齐vec3
需要12个字节,并且它是16个字节对齐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个字节边界对齐。