gpt4 book ai didi

opengl - 从深度缓冲区和任意 View 投影矩阵重建世界坐标

转载 作者:行者123 更新时间:2023-12-04 07:22:50 25 4
gpt4 key购买 nike

我正在尝试从延迟渲染器中的深度值重建 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) 是默认值,并且几乎没有理由更改它。

关于opengl - 从深度缓冲区和任意 View 投影矩阵重建世界坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22360810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com