OpenGL规范的谎言(或者这是一个错误?)......参考std140的布局,共享统一缓冲区,它指出:
“GLSL 编译器使用表 L-1 中显示的一组规则来布局 std140 限定的统一块中的成员。块中成员的偏移量是根据块中先前成员的大小累积的 (在相关变量之前声明的那些)和起始偏移量。第一个成员的起始偏移量始终为零。
标量变量类型(bool、int、uint、float)-基本机器类型中标量的大小"
( http://www.opengl-redbook.com/appendices/AppL.pdf )
所以,有了这些信息,我在我的着色器中设置了一个统一的块,看起来像这样:
// Spotlight.
layout (std140) uniform Spotlight
{
float Light_Intensity;
vec4 Light_Ambient;
vec3 Light_Position;
};
...只是发现它不适用于我在 CPU 端设置的后续 std140 布局。也就是说,前 4 个字节是浮点数(GLfloat 的机器标量类型的大小),接下来的 16 个字节是 vec4,接下来的 12 个字节是 vec3(考虑到规则,最后剩下 4 个字节vec3 确实是 vec4)。
当我更改 CPU 端以将浮点数指定为与 vec4 相同的大小(即 16 个字节)并在此假设下进行偏移量和缓冲区大小时,着色器按预期工作。
所以,要么规范是错误的,要么我在这种情况下误解了“标量”的含义,或者 ATI 存在驱动程序错误。谁能解开这个谜团?