我得到了一个"无效的操作"尝试针对下面的片段着色器调用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;
}
答案 0 :(得分:4)
(正如评论中已经指出的):GL永远不会插入整数类型。引用GLSL spec (Version 4.5)部分4.3.4“输入变量”:
片段着色器输入,它们是有符号或无符号整数,整数向量或任何双精度 必须使用插值限定符
flat
来限定浮点类型。
这个也适用于前一阶段的相应产出。