为什么我的光线角度会随着相机移动而改变?
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_viewProjection
是 projection * view
矩阵
放大时它发生变化的原因是视图矩阵包含缩放。因此,表面位置计算会根据您放置 view/camera 的位置而变化。通过从计算中删除它,问题应该消失。
尝试在 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_viewProjection
是 projection * view
矩阵
放大时它发生变化的原因是视图矩阵包含缩放。因此,表面位置计算会根据您放置 view/camera 的位置而变化。通过从计算中删除它,问题应该消失。