OpenGl GLSL统一集返回错误

时间:2014-10-01 18:29:47

标签: java opengl glsl lwjgl

从着色器中获取制服时遇到问题。这一行:

int u = GL20.glGetUniformLocation(program, uniform);

用于检查字符串uniform定义的均匀是否在着色器中。

以下是检查代码示例:

System.out.println(GL20.glGetUniformLocation(1, "transformationMatrix")==0);
System.out.println(GL20.glGetUniformLocation(1, "projectionMatrix")==0);

结果:

false
true

这就是奇怪的事情:顶点着色器代码如下:

#version 330

layout (location = 0) in vec3 pos;
layout (location = 1) in vec3 tex;
layout (location = 2) in vec3 nor;
layout (location = 3) in vec3 col;

uniform mat4 projectionMatrix;
uniform mat4 transformationMatrix;

out vec3 normal;

void main(){

    normal = nor;
    gl_Position = projectionMatrix * vec4(pos, 1);
} 

我已经测试了重命名统一,删除了另一个,但是唯一一个统一的OpenGL似乎认识到的是" projectionMatrix"之一。

环境: Java与lwjgl 使用mesa 10.4.0的linux中的OpenGl(也不适用于Windows)

2 个答案:

答案 0 :(得分:4)

允许GLSL编译器从发出的可执行着色器中去除未使用的变量,作为优化(使用较少的寄存器等)。 如果transformationMatrix制服用于计算着色器的返回值,则它将保留在着色器中,并且错误将消失。

这不是一个很难的"错误,随意忽略它。您可能会遇到它,特别是当您更改GLSL代码以进行调试时。

答案 1 :(得分:3)

如果找不到制服,

glGetUniformLocation()会返回-1。来自man page

  

如果name与程序中的活动统一变量不对应,或者名称以保留前缀“gl _”开头,则此函数返回-1。

因此错误测试需要:

System.out.println(GL20.glGetUniformLocation(1, "transformationMatrix") == -1);
System.out.println(GL20.glGetUniformLocation(1, "projectionMatrix") == -1);

正如另一个答案中所建议的那样,在编辑/链接着色器时,可以消除未使用的制服。但这不是你在这种情况下所观察到的。 0是有效的统一位置。