注意:我将首先专门吐出我的问题,然后我会更好地解释我的情况。
在我的窗户上,使用我的英特尔驱动程序。我可以编译这两个(分别是顶点和片段着色器),但不能链接它们:
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
有趣的是,似乎不相关的修改使程序正确链接,到目前为止我找到了一些:
我的问题是如何让它工作但保持相同的语义?我需要三个函数,我需要third
和main
函数不使用统一,我需要只有second
函数知道制服。另外,我需要second
和third
函数接收参数。在我的真实世界场景中,第二个和第三个函数用它收到的值做了很多事情。
只是为了澄清,我正在做的事情需要这个:
在我正在开发的框架中,使用了三种不同的片段着色器。第一个(我的参考代码中的main
)是用户提供的那个,这个可以调用框架中定义的函数(我的参考代码中的second
)。第三级也是用户提供的,但着色器只编译一次,不知道它将被使用多少次以及哪个值,second
负责分配正确数量的缓冲区并调用{每个{1}}。
以下是我用于测试着色器的代码:
third
这取决于GLEW,SDL,OpenGL和C ++ 11。