透视到世界空间逆投影

perspective to world space inverse projection

本文关键字:投影 空间 世界 透视      更新时间:2023-10-16

我正在将阴影功能扩展到我作为课堂作业创建的现有 3D 渲染器。我正在尝试实现 2 次传递 z 缓冲区算法。我已经完成了第一遍并创建了深度图。但是,问题是我在屏幕空间中栅格化了我的线条,因此我必须将坐标带回图像空间,因为深度图的z值与片段坐标的z值之间的比较是在图像空间中进行的。

我使用了一个堆栈实现,它以以下形式存储空间变换矩阵:

[Xsp] * [Xpi] * [Xiw ] * (x,y,z) 世界空间中的坐标 = 屏幕空间中的 x,y,z其中 Xsp - 透视到屏幕Xpi - 图像到透视秀 - 世界到图像

这里,堆栈的底部包含 Xsp,倒数第二包含,Xsp

乘以 Xpi,倒数第三包含 Xsp * Xpi 乘以 Xiw 的结果......

现在,我只想要图像空间中的x,y,z,也就是说(世界空间中的Xiw * x,y,z),所以在世界空间中获得x,y,z对我有用......如果我将每个矩阵的逆矩阵相乘,然后将结果与屏幕空间中的 x,y,z 相乘,是否可以实现???

我的意思是,我想做

[Xsp]逆 * [Xpi]逆 * [Xiw]反转 ,并将其乘以屏幕空间的 x,y,z它会让我回到世界空间吗?

让我猜猜。南加州大学CS580?

反正我会帮忙的。

您最初是如何获得顶点的:

Xsp * Xpi * Xiw * Xwm * v = vf //Concat * model-space vertex = raster-space vertex
vf' = (vf.x / vf.w, vf.y / vf.w, vf.z / vf.w); //Perspective

如何使用 vf' 取回它:

Xwm * vf = Xiw^-1 * Xpi^-1 * Xsp^-1 * vf' //Inverted partial concat * raster-space vertex = world-space vertex
v = (vf.x / vf.w,  vf.y / vf.w, vf.z / vf.w); //Perspective again
法线

是同样的想法,只是你只需要一个倒置的Xiw就可以回到世界空间,因为法线只去图像空间。也不涉及视角。