为什么我的uniform vector和float没有被初始化?我的着色器代码编译正确,我的着色器编译正确,但是当我试图获得我的vec 4 lightDirection
,float specularFactor
和diffuseFactor
的uniform位置时,它给了我一个错误。注意我还没有实际使用这些uniform,但是,这应该不重要。
下面是我的顶点着色器,它可以正确地获取所有统一的位置:
#version 330
layout (location = 0) in vec3 position;
layout (location = 1) in vec2 texture_coord;
layout (location = 2) in vec3 normal;
layout (location = 3) in vec3 fNormal;
uniform mat4 worldMat;
uniform mat4 projection;
uniform mat4 transform;
out vec2 tex;
out vec3 n;
out vec3 fn;
void main() {
fn=fNormal;
n=normal;
tex = texture_coord;
gl_Position = projection * worldMat * transform * vec4(position, 1);
}
下面是我的片段着色器,它只获取纹理采样的统一位置:
#version 330
uniform sampler2D sampleTexture;
uniform vec4 lightDirection;
uniform float specularFactor;
uniform float diffuseFactor;
in vec2 tex;
in vec3 n;
in vec3 fn;
out vec4 fragColor;
void main() {
fragColor=texture(sampleTexture, tex);
}
下面是我用来获取统一位置的方法(我使用的是Java):
public int loadUniform(String uniformName)throws Exception{
int iD= glGetUniformLocation(program,uniformName);
System.out.println("PROGRAM: "+program+" UNIFORM: "+uniformName+" "+iD);
if(iD==-1) {
throw new Exception("uniform:"+uniformName+" not initialized");
}
return iD;
}
现在,这里是控制台中打印语句/异常的打印结果。我很困惑。数字看起来肯定是错的,但不管怎样。我不明白。
java.lang.Exception: uniform:lightDirection not initialized
at shader_src.Shader.loadUniform(Shader.java:273)
at shader_src.StaticShader.initValues(StaticShader.java:51)
at application.Main.main(Main.java:94)
PROGRAM: 4 UNIFORM: worldMat 9
PROGRAM: 4 UNIFORM: projection 5
PROGRAM: 4 UNIFORM: transform 0
PROGRAM: 4 UNIFORM: sampleTexture 4
PROGRAM: 4 UNIFORM: lightDirection -1
1条答案
按热度按时间quhf5bfb1#
glsl编译器和链接器优化代码。不必要的代码将被删除,不必要的uniform和属性将不会成为活动的程序资源。如果uniform变量没有被使用或只在代码的一部分中使用,而代码本身被优化掉,它们不会成为活动的程序资源。
lightDirection
,specularFactor
和diffuseFactor
是未使用的变量,因此不是活动资源,因此没有活动资源,因此您无法获得这些变量的统一位置。