我的GLSL片段着色器跳过"if"语句。着色器本身非常短。
我通过统一缓冲区对象发送一些数据,并在着色器中进一步使用它。然而,无论出于何种原因,该操作都会跳过附加在"if"语句后面的赋值。
我使用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);
}
}
您混淆了基本对齐规则和偏移量。规范规定:
第一个的基准偏移结构的构件取自结构本身的对齐偏移通过取最后一个基本机器单位被前一个成员消耗并添加一个每个结构构件在其对齐偏移处存储在存储器中。上层的成员通过将均匀块处理为基偏移为零的结构。
的确,vec3
需要16个字节的基本对齐,但它仅消耗12个字节。因此,vec3之后的下一个元素将在vec3自身的对齐偏移之后12字节开始。由于int
的对齐规则只有4个字节,因此根本没有填充。