首页 > 解决方案 > 为什么在应用逆透视变换后透视分割?

问题描述

如果我们在 NDC 空间中有一个点,并且我们想使用逆透视投影将其转换为视图空间,为什么我们需要在最后应用透视分割?不应该是透视乘法,因为从视图应用前向透视投影到 NDC 空间有透视除法?

我在这里找到它:http ://www.cse.chalmers.se/edu/course/TDA362/tutorials/ssao.html

float fragmentDepth = texture(depthTexture, texCoord).r;

// Normalized Device Coordinates (clip space)
vec4 ndc = vec4(texCoord.x * 2.0 - 1.0, texCoord.y * 2.0 - 1.0, 
            fragmentDepth * 2.0 - 1.0, 1.0);

// Transform to view space
vec3 vs_pos = homogenize(inverseProjectionMatrix * ndc);

在哪里

vec3 homogenize(vec4 v) { return vec3((1.0 / v.w) * v); }

标签: graphicsglsltransformcoordinate-transformation

解决方案


如果要将齐次坐标转换为笛卡尔坐标,则必须对其进行转换以使w分量为 1:

(x, y, z, w) -> (x', y', z', 1)

因此,您必须将坐标的 4 个分量除以坐标的w分量:

(x, y, z, w) -> (x/w, y/w, z/w, w/w)

当您从剪辑空间转换到标准化设备空间时,这称为透视除法

请注意,当从归一化设备空间变换到视图空间时,坐标是由逆投影矩阵而不是投影矩阵变换的。您还必须在逆投影后除以w分量。 或者,您可以将归一化的设备坐标 (x', y', z', 1) 乘以选择的值,使得w分量在使用逆投影矩阵进行变换后为 1。但是,没有充分的理由在转换之前努力找到这个值。


推荐阅读