程序链接错误没有日志消息在英特尔驱动程序

时间:2013-03-21 01:43:07

标签: windows visual-c++ opengl glsl

注意:我将首先专门吐出我的问题,然后我会更好地解释我的情况。

在我的窗户上,使用我的英特尔驱动程序。我可以编译这两个(分别是顶点和片段着色器),但不能链接它们:

attribute vec4 vertex;
void main(void) {
       gl_Position = vertex;
}

uniform sampler2D textures[2];
vec4 third(sampler2D texture) {
       return texture2D(texture,vec2(0.5,0.5));
}
vec4 second(float a) {
       return third(textures[0]);
}

void main(void) {
       gl_FragColor = second(0.0);
}

我在链接上收到错误(链接状态为false)但信息日志为空。

问题是这个着色器在我的Linux中使用相同的GPU工作正常,并且在我的NVIDIA中运行良好。只有在使用英特尔驱动程序的Windows中我才会遇到此问题。我的OpenGL通知以下有关驱动程序的信息:

GL_VENDOR Intel
GL_RENDERER Intel(R) HD Graphics Family
GL_VERSION 3.0.0 - Build 8.15.10.2253
GL_SHADING_LANGUAGE_VERSION 1.30  - Intel Build 8.15.10.2253

有趣的是,似乎不相关的修改使程序正确链接,到目前为止我找到了一些:

  1. 如果第二个函数没有收到任何参数,则可以正常工作。
  2. 如果main()直接调用第三个,则可以正常工作。
  3. 如果制服不是数组,则它是单个元素,它可以正常工作。
  4. 如果不是将sampler2D从第二个传递到第三个,我会传递一个第三个将用于访问纹理的索引,它可以工作。
  5. 我的问题是如何让它工作但保持相同的语义?我需要三个函数,我需要thirdmain函数不使用统一,我需要只有second函数知道制服。另外,我需要secondthird函数接收参数。在我的真实世界场景中,第二个和第三个函数用它收到的值做了很多事情。

    只是为了澄清,我正在做的事情需要这个:

    在我正在开发的框架中,使用了三种不同的片段着色器。第一个(我的参考代码中的main)是用户提供的那个,这个可以调用框架中定义的函数(我的参考代码中的second)。第三级也是用户提供的,但着色器只编译一次,不知道它将被使用多少次以及哪个值,second负责分配正确数量的缓冲区并调用{每个{1}}。

    以下是我用于测试着色器的代码:

    third

    这取决于GLEW,SDL,OpenGL和C ++ 11。

0 个答案:

没有答案