glCompileShader是可选的吗?

时间:2014-06-11 19:43:16

标签: opengl shader

在调试我的系统时,我发现我使用过的所有着色器都没有编译过。所有的GLSL课程都很愉快地联系起来并且像魅力一样工作。

我在整个代码库中搜索了glCompileShader的调用,但没有找到。

我的问题是:这是我正在使用的实现的特定行为吗?链接程序时是否隐式执行着色器编译?它是可选的吗?如果是这种情况,那么除了检索错误日志之外,还有哪些明显的优势呢?

我在文档中找不到像我这样的情况,如果我错过了什么,请指点我吗?

我的供应商是NVIDIA(驱动程序337.88)

编辑:此外,我 NOT 使用glCreateShaderProgram(),但只是glCreateProgram()来创建着色器程序。

1 个答案:

答案 0 :(得分:6)

这在评论中得到了解决(感谢@Andon,@ derhass和其他人),但由于这是一个有趣的问题,让我在答案中总结一下,并添加更多数据。

不考虑预先编译的着色器,您需要在将程序与glCompileShader()链接之前调用glLinkProgram()来编译着色器。根据我收集的数据,跳过glCompileShader()调用可以正常工作:

  • Windows 8.1下的NVIDIA GeForce GT 740M。
  • Linux下的NVIDIA(来自@ derhass)。
  • Windows 8下的NVIDIA GeForce GT 620M(来自@cifz)

失败了:

  • Windows 8.1下的Intel HD 4600。
  • Mac OS 10.9.2下的Intel Iris。
  • iPad Air下的iPad Air。
  • 两种不同的Android平板电脑。

所以这种行为似乎与NVIDIA明显隔离。规范说在链接之前编译着色器是必要的。从3.3规格:

  

如果未成功编译附加到程序的一个或多个着色器对象,链接也将失败。

4.4规范不太清楚,将可能的错误条件转换为以下列开头的列表:

  

链接可能会失败......

通常可以表明行为是可选的,但我不确定这是否意图。在我看来,规格只是重新格式化,并且预期的行为没有改变。恕我直言,这是一个错误。这不是一个非常严重的问题,因为所有法律用途仍然有效,但我不认为NVIDIA正在严格遵守规范。

无论如何,在glCompileShader()之前调用glLinkProgram()是您的代码跨平台工作所必需的。