2014-10-18 44 views
2


我知道这听起来像一个奇怪的“问题”,但坚持与我。
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版本要的#Version 110
您也可能会注意到,我用的是“在”关键字的vec4的位置。
此关键字在指定的GLSL版本中不可用,但它在我的图形卡(它也支持OpenGL 3.3)上编译时没有错误。
正确的关键字应该是'属性'。
在只有OpenGL 2.1的计算机上测试时,着色器代码会收到编译错误。

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

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

编辑:
我添加的代码要经常检查信息日志着色器编译后,它仍然使用“在”关键字时,不会报告任何东西。

回答

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)

0

它总是一个好主意,检查编译信息登录即使编译成功。它可以包含警告和其他诊断信息。在LWJGL,您可以通过调用查看信息日志ID为shaderId着色器:

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

不幸的是这是很常见的GLSL的编译器离开未报告的错误。我的猜测是,大多数测试都是在正确的着色器下进行的,错误处理的效果几乎没有得到验证,并且优先级高。另外,一旦供应商发布(意外)让某些错误通过的版本,他们可能不想在稍后添加更严格的错误检查。风险在于它会打破已经发布的软件,因为不完整的错误检查才能正常工作。