2017-07-10 33 views
1

试图实现WebGL的一点灯光,我发现我的照射角度的变化,当我放大为什么相机移动时我的光线角度会发生变化?

enter image description here

我的顶点着色器:

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; 
} 

这对我来说是不想要的效果。我该如何避免这种情况?我做错了什么?

+0

从我可以在你的形象,它不是角,但力度看?我注意到,上面的飞机和缩小的模型一样黑,只是面对你的飞机没有亮起来。如果角度发生了变化,立方体的其他表面会变亮/变暗,不是吗? –

+0

可能是,我真的在研究是什么原因,请耐心等待,因为我是webgl.anyway的初学者,我相信这个问题是 - 或多或少 - 出现在所有面上。 – deblocker

回答

2

你不计算a directional light。你正在计算一盏点灯。定向光根据定义没有位置,所以light[i].position对于定向光是没有意义的。

好的,所以你计算点光源。 A point light wants the surface normal dotted with the direction from the surface to the light。但这似乎并不是你计算的东西。为了将表面指向光线方向,需要将投影和矩阵从模型/世界矩阵中分离出来。看着你的shader

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矩阵

原因是因为视图矩阵包含缩放。因此,根据放置视图/相机的位置,表面位置计算会发生变化。通过从计算中消除该问题应该消失。

You might find these articles helpful

+0

伟大的格曼,你的解释像往常一样受到启发......;) – deblocker

相关问题