我刚刚为 Quadro 4000 卡安装了最新的 NVidia 驱动程序。从这一刻起,我的任何着色器链接都因着色器链接错误而失败。值得注意的是,我正在使用带有单独着色器对象的 OpenGL 4.2。我的操作系统是 Windows7 64bit 。在更新之前,我有 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 核心。这可能是问题吗?
更新:
来自程序信息日志的更多信息:
错误 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: 好的,现在很清楚了 - 新驱动程序对着色器输入/输出变量更严格。使用旧驱动程序,我可以在顶点着色器中定义多个“输出”,但无需在片段着色器中定义它们的“输入”匹配.它起作用了。现在看来我被迫在vert和frag程序中声明的“ins”和“outs”之间完全匹配。奇怪的是没有抛出错误,但结果是定义的“ins”在目的地。