【发布时间】:2014-08-31 18:05:00
【问题描述】:
我一直在尝试使用着色器为 LWJGL 游戏制作基本的静态点光源,但是当摄像机的位置被平移和旋转时,光源看起来好像在移动。这些着色器是从 OpenGL 4.3 指南稍微修改的,所以我不确定为什么它们没有按预期工作。谁能解释为什么这些着色器没有按预期工作以及我可以做些什么来让它们工作?
顶点着色器:
varying vec3 color, normal;
varying vec4 vertexPos;
void main() {
color = vec3(0.4);
normal = normalize(gl_NormalMatrix * gl_Normal);
vertexPos = gl_ModelViewMatrix * gl_Vertex;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
片段着色器:
varying vec3 color, normal;
varying vec4 vertexPos;
void main() {
vec3 lightPos = vec3(4.0);
vec3 lightColor = vec3(0.75);
vec3 lightDir = lightPos - vertexPos.xyz;
float lightDist = length(lightDir);
float attenuation = 1.0 / (3.0 + 0.007 * lightDist + 0.000008 * lightDist * lightDist);
float diffuse = max(0.0, dot(normal, lightDir));
vec3 ambient = vec3(0.4, 0.4, 0.4);
vec3 finalColor = color * (ambient + lightColor * diffuse * attenuation);
gl_FragColor = vec4(finalColor, 1.0);
}
【问题讨论】:
-
如果有人感兴趣,我最终找到了解决方案。删除对 gl_NormalMatrix 和 gl_ModelViewMatrix 的调用解决了这个问题。
-
您应该将此作为答案发布并接受。