我想这是纯 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 端的各个元素,这些元素更整洁?
不,这样你只是浪费空间。你必须根据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 字节边界对齐。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)