OpenGL GLSL 代码在不应该编译的时候编译




我知道这听起来像是一个奇怪的"问题",但请坚持。

我有一个支持OpenGL 3.3的显卡。
但是,我正在编写针对OpenGL 2.0以及GLSL 1.1版本的代码。
我有以下GLSL代码:

#version 110
in vec4 position; // x,y,z,w (ignores w)
uniform mat4 mvpMatrix;
void main() {
    gl_Position = mvpMatrix * position;
}

如您所见,我已将GLSL版本指定为#版本110。
您可能还注意到,我在vec4位置使用了关键字"in"
此关键字在指定的GLSL版本中不可用,但它在我的图形卡(再次支持OpenGL 3.3)上编译时没有出错。
正确的关键字应为"attribute"
在只有OpenGL 2.1的计算机上测试时,着色器代码会出现编译错误

为什么我的编译器不同时编译时出现错误?难道它不应该编译符合版本110的着色器并报告适当的错误吗
有什么可以检查的吗?也许是警告什么的?我不知道。救命

此外,我正在使用LWJGL用Java进行编程。如果这有帮助的话,但我认为这与问题无关。

编辑:
我添加了代码,以便在着色器编译后始终检查信息日志,但在使用"in"关键字时,它仍然不会报告任何内容。

不同的编译器在接受什么GLSL方面有很大的不同。即使着色器编译成功,也值得查看编译日志。日志可以包含警告和错误。

在LWJGL中,检查日志的方式似乎是:

private static String getLogInfo(int obj) {
  return ARBShaderObjects.glGetInfoLogARB(obj,
      ARBShaderObjects.glGetObjectParameteriARB(obj, 
      ARBShaderObjects.GL_OBJECT_INFO_LOG_LENGTH_ARB));
}

(代码在Box.java的第129行)

即使编译成功,也最好检查编译信息日志。它可以包含警告和其他诊断信息。在LWJGL中,您可以通过调用:来获取id为shaderId的着色器的信息日志

int logLen = GL20.glGetShaderi(shaderId, GL20.GL_INFO_LOG_LENGTH);
GL20.glGetShaderInfoLog(shaderId, logLen);

不幸的是,GLSL编译器经常不报告错误。我的猜测是,大多数测试都是使用正确的着色器进行的,错误处理并没有得到同样好的验证,也没有得到同样高的优先级。

此外,一旦供应商发布的版本(意外)允许某些错误通过,他们可能不想在以后添加更严格的错误检查。风险在于,它会破坏已经发布的软件,而这些软件只有在错误检查不完整的情况下才能运行。

最新更新