我刚刚为Quadro 4000卡安装了最新的NVidia驱动程序。从这时起,我的任何着色器链接都会失败并出现着色器链接错误。 值得注意的是我使用OpenGL 4.2和单独的着色器对象。我的操作系统是Windows7 64位。 在更新之前,我有309.x版本的驱动程序,一切正常。 现在我回滚到版本295.x并再次运行。 任何人都知道它的事情吗?它可能是一个驱动程序错误?如果是的话,可以做些什么呢?
这是一个简单的顶点着色器通过失败:
#version 420 core
layout(location = 0) in vec4 position;
layout(location = 1) in vec2 uvs;
layout(location = 2) in vec3 normal;
smooth out vec2 uvsOut;
void main()
{
uvsOut=uvs;
gl_Position = position;
}
另一个问题是,NVIdia可能会收紧着色器版本语义规则吗?我的意思是,我使用OpenGL兼容性配置文件,但在GLSL标记#version 420 core.Can它是问题吗?
更新
来自节目信息日志的更多信息:
错误C7592:ARB_separate_shader_objects要求在访问其成员之前重新声明内置块gl_PerVertex。
是的,司机作家也有拼写错误“访问”;)
现在,我实际上通过添加以下内容解决了链接错误:
out gl_PerVertex
{
vec4 gl_Position;
};
奇怪的是,之前的驱动程序没有强制重新定义gl_PerVertex块。现在,虽然这个插件解决了链接的问题,但它打开了另一个不同的制服不起作用。例如我在顶点着色器中:
out vec4 diffuseOut;
在片段着色器中:
in vec4 diffuseOut;
然后
OUTPUT = diffuseOut;/// returns black while red is expected.
更新2: 好吧,现在它变得清晰了 - 新的驱动程序对着色器输入/输出变量更严格。使用较旧的驱动程序,我可以在顶点着色器中定义几个“出口”,但是也没有在片段着色器中定义它们的“in”匹配。它工作了现在看来我被迫在vert和frag program中声明了“ins”和“outs”之间的完全匹配。转换为没有抛出错误但结果是定义的“ins”在目标中变空。