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