因此,在延迟渲染器的上下文中,我有一个世界位置(vec3)和场景摄像机的MVP矩阵。是否有可能从相机(世界单位)获得距离?
到目前为止,我已经尝试过这个:
vec4 projected = mvp * vec4(worldPosition);
float distanceFromCamera = projected.z / projected.w;
它似乎没有给出正确的结果。
答案 0 :(得分:2)
视图矩阵将点从世界空间转换为眼睛空间。假设一些理智的眼睛空间惯例,相机将在(0,0,0,1)
的眼睛空间(a.k.a.,眼睛空间起源)。因此,如果你想要世界太空相机的位置,你可以使用
cam_world = inverse(view) * vec4(0,0,0,1)
并用它来计算差异。请注意,您可以在CPU中执行此计算,只需将结果提供为统一。
到目前为止,我已经尝试过这个:
vec4 projected = mvp * vec4(worldPosition); float distanceFromCamera = projected.z / projected.w;
这将计算归一化设备空间中的值,双曲线失真z,缩放到[-1,1]范围。它实际上不是相机的距离,而是相机平面(与图像平面平行的平面以及相机所在的位置)的距离。
因此,在延迟渲染器的上下文中,我有一个世界位置(vec3)和场景摄像机的MVP矩阵。是否有可能从相机(世界单位)获得距离?
所以实际答案是:不,不是一般情况。如果只有复合变换projection*view*model
,则无法获得世界空间信息,此矩阵直接从对象空间到剪辑空间,完全绕过世界和视图空间。注意"场景摄像机的MVP矩阵"没有意义,因为M
根本与任何相机无关。