透视世界空间反投影

时间:2012-04-17 14:10:21

标签: c++ matrix 3d transformation

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

我使用堆栈实现,它以下列形式存储空间转换矩阵:

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

这里,堆栈的底部包含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相乘 它会让我回到世界空间吗?

1 个答案:

答案 0 :(得分:1)

让我猜一下。 USC 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回到世界空间,因为法线只去图像空间。也没有涉及的视角。