在调试我的系统时,我发现我使用的所有着色器都没有编译过.所有的GLSL课程都很愉快地联系起来并且像魅力一样工作.
我在整个代码库中搜索了调用glCompileShader,但没有找到.
我的问题是:这是我正在使用的实现的特定行为吗?链接程序时是否隐式执行着色器编译?它是可选的吗?如果是这种情况,那么除了检索错误日志之外,还有哪些明显的优势呢?
我在文档中找不到像我这样的任何案例,如果我错过了什么,请指点我吗?
我的供应商是NVIDIA(驱动程序337.88)
编辑:此外,我不是在使用glCreateShaderProgram(),而只是glCreateProgram()为了创建着色器程序.
这主要是在评论中解决的(感谢@Andon,@ derhass和其他人),但由于这是一个有趣的问题,让我在答案中总结一下,并添加更多数据.
不考虑预编译的着色器,您需要glCompileShader()在链接程序之前通过调用编译着色器glLinkProgram().根据我收集的数据,跳过glCompileShader()调用可以正常工作:
它失败了:
所以这种行为似乎与NVIDIA明显隔离.规范说在链接之前编译着色器是必要的.从3.3规格:
如果连接到程序的一个或多个着色器对象未成功编译,则链接也将失败.
4.4规范稍微不那么明确,将可能的错误条件转换为以下列开头的列表:
链接可能会失败......
通常可以暗示行为是可选的,但我不确定这是否是这里的意图.在我看来,规格只是重新格式化,并且预期的行为没有改变.恕我直言,这是一个错误.不是非常严重的,因为所有合法使用仍然有效,但我不认为NVIDIA正在严格遵循规范.
在任何情况下,调用glCompileShader()之前glLinkProgram()的代码都需要跨平台工作.