我有这个顶点着色器:
#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。
答案 0 :(得分:6)
... 如您所见,变量lightPosition实际上用于计算中。 ...
你会想,对。实际上,你在顶点着色器中使用它一次,为vec3 L
分配一个值,之后实际上没有使用它。
着色器的编译过程非常细致。您可能已在顶点着色器中的计算中使用过它,但您没有在任何地方使用结果L
,并且它不会对片段着色器中计算的最终结果做出任何贡献,因此它被优化了#34;
您必须使用L
。