我使用窗口对相机变换实现了每个片段的光照和光衰减:
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));
我不知道我做错了什么。
答案 0 :(得分:1)
这里有一个问题:
ndcPos.z = (2.0 * gl_FragCoord.z - gl_DepthRange.near - gl_DepthRange.far) / (gl_DepthRange.far - gl_DepthRange.near);
除非你使用正交投影,否则gl_FragCoord.z不会将线性映射到深度范围,这是由w分区引起的。虽然可以(并且不难)对其进行反投影,但我建议您使用额外的输入/输出将视图空间眼睛位置从顶点着色器传递到片段着色器。
答案 1 :(得分:0)
照明有什么问题?移动视图时,灯光是否保持静止? (即镜面高光永远不会移动)。
你的lightPos应该是标准化的Vec3:lightPosition - (worldMatrix * vertexPosition)