GLSL布局std140填充困境

Kai*_*aan 4 c++ opengl glsl uniform

我有以下统一缓冲区:

layout(std140) uniform Light
{
    vec4  AmbientLight;
    vec4  LightIntensity;
    vec3  LightPosition;
    float LightAttenuation;
};  
Run Code Online (Sandbox Code Playgroud)

我在缓冲数据和填充时需要添加一些问题.我已经阅读了http://ptgmedia.pearsoncmg.com/images/9780321552624/downloads/0321552628_AppL.pdf,其中说我必须在vec3的末尾添加额外的4个字节用于填充 - 所以我将上传总计13个'Light'的字节数.然而,当我这样做时,'LightAttenuation'得到我在'LightPosition'上填充的值,而不是前面的一个字节,所以当我不填充时,我在着色器中得到正确的值.为什么是这样?

Chr*_*odd 9

有关详细信息,请参阅OpenGL规范的7.6.2.2节,但基本上,std140布局表示每个变量将在前一个变量之后立即布局,并为变量类型所需的对齐添加了足够的填充. vec3vec4都需要16字节对准和分别为12首16个字节. float需要4字节对齐并具有4字节大小.因此,对于std140布局,LightPosition将获得16字节对齐,因此将始终以12 mod 16的地址结束.由于这是4字节对齐,因此之前不会插入额外的填充LightAttenuation.