从着色器中获取制服时遇到问题。这一行:
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)
答案 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是有效的统一位置。