为什么我不能将int成员添加到我的GLSL着色器输入/输出块?

时间:2015-02-14 10:56:43

标签: opengl glsl

我得到了一个"无效的操作"尝试针对下面的片段着色器调用glUseProgram时出错。仅当我尝试将int成员添加到块定义时才会出现此错误。请注意,我在顶点和片段着色器中保持块定义相同。我甚至不必访问它!仅将该字段添加到块定义的顶点和片段着色器副本会导致程序失败。

#version 450

...

in VSOutput // and of course "out" in the vertex shader
{
    vec4 color;
    vec4 normal;
    vec2 texCoord;
    //int foo; // uncommenting this line causes "invalid operation"
} vs_output;

在尝试使用相同类型的自由站立/输出变量时,我也遇到同样的问题,但在这些情况下,如果直接访问这些变量,我只会遇到问题;如果我忽略它们,我假设编译器将它们优化掉,因此不会发生错误。它几乎就像我只允许传递矢量和矩阵一样......

我在这里缺少什么?我还没有在文档中找到任何表明这应该成为问题的内容。

编辑:用float[2]填充它以强制int成员进入下一个16字节边界也不起作用。

编辑:已解决,根据以下答案。事实证明,如果我检查着色器程序的信息日志,我可以更快地解决这个问题。这是我的代码:

bool checkProgramLinkStatus(GLuint programId)
{
    auto log = logger("Shaders");

    GLint status;
    glGetProgramiv(programId, GL_LINK_STATUS, &status);
    if(status == GL_TRUE)
    {
        log << "Program link successful." << endlog;
        return true;
    }
    return false;
}

bool checkProgramInfoLog(GLuint programId)
{
    auto log = logger("Shaders");

    GLint infoLogLength;
    glGetProgramiv(programId, GL_INFO_LOG_LENGTH, &infoLogLength);
    GLchar* strInfoLog = new GLchar[infoLogLength + 1];
    glGetProgramInfoLog(programId, infoLogLength, NULL, strInfoLog);
    if(infoLogLength == 0)
    {
        log << "No error message was provided" << endlog;
    }
    else
    {
        log << "Program link error: " << std::string(strInfoLog) << endlog;
    }

    return false;
}

1 个答案:

答案 0 :(得分:4)

(正如评论中已经指出的):GL永远不会插入整数类型。引用GLSL spec (Version 4.5)部分4.3.4“输入变量”:

  

片段着色器输入,它们是有符号或无符号整数,整数向量或任何双精度   必须使用插值限定符 flat 来限定浮点类型。

这个也适用于前一阶段的相应产出。