我正在尝试根据延迟渲染器中的深度值重建 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是问题的根源,但我已经尝试了我能想到的所有变体来计算它们,并且上面的代码产生了最正确的结果。
有什么想法或建议吗?
我只需要做一个小小的修复。该行:
clipSpaceLocation.z = texture(depthSampler, texcoord).r;
应该读:
clipSpaceLocation.z = texture(depthSampler, texcoord).r * 2.0f - 1.0f;
按照我的理解,投影矩阵的设计是为了将近平面和远平面映射到 [-1,1],而不是像我一直假设的 [0,1]。然后 OpenGL 将它们标准化为范围 [0,1](又名“窗口空间”),因此我需要执行该标准化的逆操作。
这一切都假设 glDepthRange(0, 1),这是默认的,并且没有理由改变它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)