graphics - 为什么在应用逆透视变换后透视分割?
问题描述
如果我们在 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); }
解决方案
如果要将齐次坐标转换为笛卡尔坐标,则必须对其进行转换以使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。但是,没有充分的理由在转换之前努力找到这个值。