0

我正在将阴影功能扩展到我作为课堂作业创建的现有 3d 渲染器。我正在尝试实现 2 pass 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 相乘,它会让我回到世界空间吗?

4

1 回答 1

1

让我猜猜。南加州大学 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 就可以回到世界空间,因为法线只进入图像空间。也没有涉及到观点。

于 2012-04-22T19:46:58.213 回答