我使用窗口到相机转换实现了每个片段的照明和光衰减:
vec4 ndcPos;
ndcPos.xy = ((gl_FragCoord.xy / windowSize.xy) * 2.0) - 1.0;
ndcPos.z = (2.0 * gl_FragCoord.z - gl_DepthRange.near - gl_DepthRange.far) / (gl_DepthRange.far - gl_DepthRange.near);
ndcPos.w = 1.0;
vec4 clipPos = ndcPos / gl_FragCoord.w;
vec3 cameraPos = vec3(clipToCameraMatrix * clipPos);
然后我使用 lightPos 和 cameraPos 来计算光照。lightPos 在世界空间中有一个固定的位置。我有 ViewMatrix 来处理 fps 风格的相机和 ModelMatrix。早些时候我使用顶点位置而不是窗口到相机的变换,一切都很好。现在,当我使用相机在物体周围移动时,我得到了不正确的照明。在上传到片段着色器之前,lightPos 乘以 ViewMatrix。
glUniform3fv(dirToLightUniformLocation, 1, glm::value_ptr(ViewMatrix * lightPos));
我不知道我做错了什么。