为什么我的光线角度会随着相机移动而改变?

Why does my light angle change when the camera moves?

尝试在 WebGL 中实现点光照,我注意到放大时我的光照角度发生了变化。

我的顶点着色器:

uniform mat3 u_rotationMatrix;
uniform mat4 u_transformMatrix;
attribute vec3 a_position;
attribute vec3 a_normal;
varying vec3 v_normal;
varying vec3 v_viewCoords;
void main() {
    vec4 tcoords = u_transformMatrix * vec4(a_position, 1.0);
    v_viewCoords = tcoords.xyz;
    v_normal = u_rotationMatrix * a_normal;
    gl_Position = tcoords;
}

这对我来说是一个不必要的影响。我怎样才能避免这种情况?我做错了什么?

您没有计算 a directional light。您正在计算点光源。根据定义,定向光没有位置,因此 light[i].position 对定向光没有意义。

好的,您正在计算点光源。 A point light wants the surface normal dotted with the direction from the surface to the light。但这似乎不是你正在计算的。要使表面朝向光线方向,您需要从 model/world 矩阵中分离出投影和视图矩阵。查看您的着色器

vec4 tcoords = u_transformMatrix * vec4(a_position, 1.0);
v_viewCoords = tcoords.xyz;
v_normal = u_rotationMatrix * a_normal;
gl_Position = tcoords;

看来 u_transformMatrix 包含您的视图和投影矩阵。我希望着色器看起来更像这样

vec4 worldPosition = u_worldMatrix * vec4(a_position, 1.0);
v_viewCoords = worldPosition.xyz;
v_normal = u_rotationMatrix * a_normal;
gl_Position = u_viewProjection * worldPosition;

其中 u_worldMatrix 是除视图和投影矩阵之外的所有结果,u_viewProjectionprojection * view 矩阵

放大时它发生变化的原因是视图矩阵包含缩放。因此,表面位置计算会根据您放置 view/camera 的位置而变化。通过从计算中删除它,问题应该消失。

You might find these articles helpful