关于c ++:透视世界空间反投影

perspective to world space inverse projection

我正在将阴影功能扩展到我已经存在的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]inverse*[xpi]inverse*[xiw]inverse,并将其与屏幕空间的x、y、z相乘。它能让我回到世界空间吗??


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

不管怎样,我会帮忙的。

最初如何获得顶点:

1
2
3
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把它拿回来?

1
2
3
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回到世界空间,因为正常只去图像空间。也没有涉及到任何观点。