为什么我的制服不能在openGL中初始化?

8yparm6h  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(119)

为什么我的uniform vector和float没有被初始化?我的着色器代码编译正确,我的着色器编译正确,但是当我试图获得我的vec 4 lightDirection,float specularFactordiffuseFactor的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
quhf5bfb

quhf5bfb1#

glsl编译器和链接器优化代码。不必要的代码将被删除,不必要的uniform和属性将不会成为活动的程序资源。如果uniform变量没有被使用或只在代码的一部分中使用,而代码本身被优化掉,它们不会成为活动的程序资源。lightDirectionspecularFactordiffuseFactor是未使用的变量,因此不是活动资源,因此没有活动资源,因此您无法获得这些变量的统一位置。

相关问题