GLSL跳过"如果"声明

时间:2016-05-01 15:29:19

标签: opengl glsl opengl-4

我的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);    
    }
}

1 个答案:

答案 0 :(得分:2)

您将基本对齐规则与偏移混淆。规范说明:

  

第一个的基本偏移量   结构的成员取自结构本身的对齐偏移。的的   所有其他结构成员的基本偏移量是通过取偏移量得到的   上一个成员的最后一个基本机器单元消耗并添加一个。每个   结构成员以其对齐的偏移量存储在存储器中。一个顶级的成员   通过将均匀块处理为缓冲存储器,将均匀块布置在缓冲存储器中   基础偏移量为零的结构。

vec3确实需要16字节的基本对齐,但只有消耗 12字节。结果,vec3之后的下一个元素将在vec3本身的对齐偏移之后开始12个字节。由于int的对齐规则只有4个字节,因此根本没有填充。