我有这个顶点着色器:
#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;
}
Run Code Online (Sandbox Code Playgroud)
这个片段着色器:
#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);
}
Run Code Online (Sandbox Code Playgroud)
如您所见,变量lightPosition实际上用于计算中.但是当我想通过它glGetUniformLocation得到它的位置时,我明白了-1.
我在这里查看了其他问题,就像那些:
特别是最后一个 - 但在我的情况下,lightPosition用于计算lightDirection,然后在片段着色器中使用它.所以不应该删除它.
关于这里发生了什么的任何想法?或者如何调试这个?
另外:我为制服设置了默认值.如果我删除默认值,它仍然给出-1.
我正在使用Nvidia 340.96驱动程序和GF 710M卡运行Ubuntu 15.10.我正在使用核心配置文件运行OpenGL 4.4.
...... 如您所见,变量lightPosition实际上用于计算中....
你会想,对.实际上你在顶点着色器中使用它一次来赋值vec3 L,之后实际上并没有使用它.
着色器的编译过程非常细致.您可能在顶点着色器中的计算中使用过它,但是您没有在L任何地方使用结果,并且它对片段着色器中计算的最终结果没有任何贡献,因此它被"优化掉了".
你必须要有所帮助L.
| 归档时间: |
|
| 查看次数: |
202 次 |
| 最近记录: |