对于确实存在并使用的制服,OpenGL返回-1

时间:2016-03-21 10:31:05

标签: c++ opengl

我有这个顶点着色器:

#version 430 core

layout (location = 0) in vec3 position;
layout (location = 1) in vec2 textureCoordinate;
layout (location = 2) in vec3 normal;
layout (location = 4) in vec3 tangent;

uniform mat4 projectionMatrix;
uniform mat4 modelViewMatrix;
uniform vec3 lightPosition = vec3(0.0, 1.0, 0.0);

out vec2 texCoord;
out vec3 lightDirection;
out vec3 eyeDirection;

void main() {
    vec4 P = modelViewMatrix * vec4(position, 1.0);
    vec3 N = normalize(mat3(modelViewMatrix) * normal);
    vec3 T = normalize(mat3(modelViewMatrix) * tangent);
    vec3 B = cross(N, T);
    vec3 L = lightPosition - P.xyz;
    vec3 V = -P.xyz;

    lightDirection = normalize(vec3(dot(V, T), dot(V, B), dot(V, N)));
    eyeDirection = normalize(vec3(dot(V, T), dot(V, B), dot(V, N)));
    texCoord = textureCoordinate;

    gl_Position = projectionMatrix * P;
}

这个片段着色器:

#version 430 core

in vec2 texCoord;
in vec3 lightDirection;
in vec3 eyeDirection;

layout (binding = 0) uniform sampler2D tex;
layout (binding = 1) uniform sampler2D normalMap;

out vec4 color;

void main() {
    vec3 ambient = vec3(0.1);

    vec3 V = normalize(eyeDirection);
    vec3 L = normalize(lightDirection);
    vec3 N = normalize(texture(normalMap, texCoord)).rgb * 2.0 - vec3(1.0);
    vec3 R = reflect(-L, N);

    vec3 diffuseAlbedo = texture(tex, texCoord).rgb;
    /*vec3 diffuseAlbedo = vec3(1.0);*/
    vec3 diffuse = max(dot(N, L), 0.0) * diffuseAlbedo;

    vec3 specular = vec3(0.0);

    color = vec4(ambient + diffuse + specular, 1.0);
}

如您所见,变量lightPosition实际上用于计算中。但是当我想通过glGetUniformLocation获取它的位置时,我会得到-1

我在这里查看了其他问题,就像那些:

特别是最后一个 - 但在我的情况下,lightPosition用于计算lightDirection,然后在片段着色器中使用它。所以不应该删除它。

关于这里发生了什么的任何想法?或者如何调试这个?

另外:我为制服设置了默认值。如果我删除默认值,它仍会提供-1

我正在使用Nvidia 340.96驱动程序和GF 710M卡运行Ubuntu 15.10。我正在使用核心配置文件运行OpenGL 4.4。

1 个答案:

答案 0 :(得分:6)

  

... 如您所见,变量lightPosition实际上用于计算中。 ...

你会想,对。实际上,你在顶点着色器中使用它一次,为vec3 L分配一个值,之后实际上没有使用它。

着色器的编译过程非常细致。您可能已在顶点着色器中的计算中使用过它,但您没有在任何地方使用结果L,并且它不会对片段着色器中计算的最终结果做出任何贡献,因此它被优化了#34;

您必须使用L