glCompileShader是可选的吗?

cif*_*ifz 7 opengl shader

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

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

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

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

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

编辑:此外,我不是在使用glCreateShaderProgram(),而只是glCreateProgram()为了创建着色器程序.

Ret*_*adi 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()的代码都需要跨平台工作.

  • 关于wishy-washy语言的主题,*"附加到`program`的一个或多个着色器对象未成功编译"*为实现在链接时编译而没有实际违反任何内容留出空间.也许这就是NV采取的立场?它实际上并没有说*"附加到`program`的一个或多个着色器对象没有预先编译"*.这将与NV的[先前记录的声明](http://developer.download.nvidia.com/opengl/glsl/glsl_release_notes.pdf)一致,即`glCompileShader(...)`仅在其实现中解析和验证语法. (2认同)