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

标签 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)上编译时没有错误。
正确的关键词应该是'attribute'。
在只有 OpenGL 2.1 的计算机上测试时,着色器代码出现编译错误。

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

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

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

最佳答案

不同的编译器在接受什么 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行)

关于java - OpenGL GLSL 代码在不该编译的时候编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26436804/

相关文章:

java - 并发频率计数器更新java

java - 如何在Java中不使用循环将String数组转换为int数组

java - 在 OpenGL 中获取相机在 X、Y 和 Z 轴上的弧度旋转?

opengl - float 变量不以任何方式进行比较

functional-programming - 重载函数的 Hindley-Milner 类型推断

c - 设置 Netbean 的默认值

java - 应用@EnableCircuitBreaker后获取异常java.lang.ArrayStoreException : sun. Reflect.annotation.TypeNotPresentExceptionProxy

Java : Method return Issue

java - 阴影体积实现

Python:使用编译/评估时出现段错误