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

时间:2014-10-18 06:06:52

标签: java opengl compilation glsl version


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

我有一块支持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版本指定为#version 110 您可能还会注意到我在vec4位置使用'in'关键字 此关键字在指定的GLSL版本中不可用,但它在我的图形卡上编译时没有错误(同样支持OpenGL 3.3)。
正确的关键字应为“属性” 在仅具有OpenGL 2.1的计算机上进行测试时,着色器代码会出现编译错误。

为什么我的编译器也没有编译错误?它不应该编译符合版本110的着色器并报告相应的错误吗?
无论如何要检查这个吗?也许这是一个警告或什么?我不知道。救命啊!

另外,我使用LWJGL在Java中编程。如果这有帮助,但我不认为这与问题有任何关系。

修改
我添加了代码以在着色器编译后始终检查信息日志,并且在使用“in”关键字时仍然没有报告任何内容。

2 个答案:

答案 0 :(得分:1)

不同的编译器对于他们将接受的GLSL有很多不同的 。即使您的着色器成功编译,也值得查看编译日志。日志可能包含警告和错误。

在LWJGL中it looks like检查日志的方法是:

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

(代码在Box.java第129行)

答案 1 :(得分:0)

即使编译成功,检查编译信息日志总是一个好主意。它可以包含警告和其他诊断信息。在LWJGL中,您可以通过调用以下内容获取标识为shaderId的着色器的信息日志:

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

不幸的是,对于GLSL编译器来说,保留未报告的错误是很常见的。我的猜测是大多数测试都是使用正确的着色器进行的,并且错误处理几乎没有得到验证,并且优先级高。

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