7

我想这是纯 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++ 中做事的方式,还是有特殊的关键字或 pragma 用于对齐结构 CPU 端的各个元素,这些元素更整洁?

4

1 回答 1

6

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

  • afloat需要 4 个字节并且它是 4 个字节对齐的
  • avec3需要 12 个字节,它是 16 个字节对齐的
  • avec4需要 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 字节边界对齐。

于 2013-11-13T15:02:53.173 回答