我正在尝试从我的延迟渲染器中的深度值重建 3D 世界坐标,但我有一段时间了。我在网上找到的大多数示例都假设了标准的透视变换,但我不想做出这样的假设。
在我的几何传递顶点着色器中,我使用以下方法计算 gl_Position:
gl_Position = wvpMatrix * vec4(vertexLocation, 1.0f);
在我的光照通道片段着色器中,我尝试使用以下方法获取世界坐标:
vec3 decodeLocation()
{
vec4 clipSpaceLocation;
clipSpaceLocation.xy = texcoord * 2.0f - 1.0f;
clipSpaceLocation.z = texture(depthSampler, texcoord).r;
clipSpaceLocation.w = 1.0f;
vec4 homogenousLocation = viewProjectionInverseMatrix * clipSpaceLocation;
return homogenousLocation.xyz / homogenousLocation.w;
}
我认为我做对了,事实上,相机附近的物体似乎被正确点亮。但我最近意识到,当我走得更远时,物体会被点亮,就好像它们离相机比实际距离更远一样。我玩过我的光照通道并验证了我的世界坐标是唯一被错误计算的东西。
我不禁认为我的 clipSpaceLocation.z 和 clipSpaceLocation.w 是问题的根源,但我已经尝试了所有我能想到的变体来计算它们,上面的代码得到了最正确的结果。
有什么想法或建议吗?