我的GLSL片段着色器会跳过"如果"声明。着色器本身很短。
我通过统一缓冲区对象发送一些数据,并在着色器中进一步使用它。然而,这件事会跳过附加到"的任务,如果"无论出于何种原因声明。
我使用glGetBufferSubData检查了缓冲区对象的值(使用特定的非零值进行测试)。一切都在它需要的地方。所以我真的有点迷失在这里。必须是我不知道的一些GLSL怪异。
目前
#version 420
layout(std140, binding = 2) uniform textureVarBuffer
{
vec3 colorArray; // 16 bytes
int textureEnable; // 20 bytes
int normalMapEnable; // 24 bytes
int reflectionMapEnable; // 28 bytes
};
out vec4 frag_colour;
void main() {
frag_colour = vec4(1.0, 1.0, 1.0, 0.5);
if (textureEnable == 0) {
frag_colour = vec4(colorArray, 0.5);
}
}
答案 0 :(得分:2)
您将基本对齐规则与偏移混淆。规范说明:
第一个的基本偏移量 结构的成员取自结构本身的对齐偏移。的的 所有其他结构成员的基本偏移量是通过取偏移量得到的 上一个成员的最后一个基本机器单元消耗并添加一个。每个 结构成员以其对齐的偏移量存储在存储器中。一个顶级的成员 通过将均匀块处理为缓冲存储器,将均匀块布置在缓冲存储器中 基础偏移量为零的结构。
vec3
确实需要16字节的基本对齐,但只有消耗 12字节。结果,vec3之后的下一个元素将在vec3本身的对齐偏移之后开始12个字节。由于int
的对齐规则只有4个字节,因此根本没有填充。