【发布时间】:2011-11-19 01:42:15
【问题描述】:
OpenGL 规范的谎言(或者这是一个错误?)...参考 std140 的布局,共享统一缓冲区,它指出:
"表 L-1 中显示的规则集被 GLSL 编译器用于 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 存在驱动程序错误。谁能解开这个谜团?
【问题讨论】: