0

我刚刚为 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”在目的地。

4

0 回答 0