Opengl es 为什么相机移动时我的灯光角度会改变?

Opengl es 为什么相机移动时我的灯光角度会改变?,opengl-es,webgl,fragment-shader,Opengl Es,Webgl,Fragment Shader,尝试在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_transfo

尝试在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;
}
这对我来说是一个不必要的影响。我怎样才能避免呢?我做错了什么?

你没有计算。您正在计算点光源。根据定义,平行光没有位置,因此,
light[i]。位置对于平行光来说毫无意义

好的,你在计算一个点光源。但这似乎不是你正在计算的。要获得曲面到灯光的方向,需要将投影矩阵和视图矩阵从模型/世界矩阵中分离出来。看着你的着色器

vec4 tcoords = u_transformMatrix * vec4(a_position, 1.0);
v_viewCoords = tcoords.xyz;
v_normal = u_rotationMatrix * a_normal;
gl_Position = tcoords;
它显示为
u\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
投影*视图
矩阵

放大时它发生变化的原因是视图矩阵包含缩放。因此,曲面位置计算将根据放置视图/摄影机的位置而更改。通过将其从计算中移除,问题应该消失


从你的图像中我可以看到,不是角度而是强度?我注意到上面的平面和缩小的模型一样暗,只是面向你的平面没有照亮得那么亮。如果角度改变了,立方体的其他表面会变亮/变暗,不是吗?伟大的格曼,你的答案已经过去了一年,我直到今天才完全理解它,在反复阅读之后。真的,谢谢你花时间回答我这样的问题!