【发布时间】:2016-01-09 13:03:23
【问题描述】:
关于透视投影,如果我使用简单的投影矩阵,例如:
1 0 0 0
0 1 0 0
0 0 1 0
0 0 1/接近 0
,它只是投影到图像平面上。我认为可以通过丢弃和规范化轻松获取视图空间坐标。
如果在正交投影上,它甚至不需要投影矩阵。
但是,OpenGL图形管线有上述过程,虽然透视投影会导致深度精度误差。
为什么需要映射到剪辑坐标和标准化设备坐标?
已添加
如果我使用上面的投影矩阵,
1 0 0 0
p = ( 0 1 0 0 )
0 0 1 0
0 0 1/n 0
v_eye = (x y z 1)
v_clip = p * v_eye = (x y z z/n)
v_ndc = v_clip / v_clip.w = (nx/z ny/z n 1)
然后,可以通过丢弃顶部、底部、左侧、右侧的值来裁剪 v_ndc。
far 的值也可以在乘以投影矩阵之前以相同的方式进行裁剪。
嗯,虽然看起来很傻,但我认为这比以前容易了。
ps。我注意到不能以这种方式写入深度缓冲区。那么,不能在投影之前写吗?
对不起,愚蠢的问题和胡言乱语......
【问题讨论】:
-
我还是不明白。在乘以投影矩阵之前,您想如何裁剪 v_ndc?它在乘法之前不存在。您只能剪裁 v_eye,但在眼睛空间中,视锥体不是立方体,而是截断的金字塔,因此很难剪裁。
-
我的猜测是设备归一化坐标引入的原因是:1.它们简化并加速了填充多边形的硬件插值器。 2. 更好地利用硬件支持的插值器变量的位深度来提高精度(减少像素化插值)
-
@Spektre 您的解释似乎是说 NDC 是作为优化引入的。但是,将生活在不同 4D 空间中的点带入单个 3D 空间(NDC 空间)是必要的空间。这是通过透视划分来完成的。
-
@Spektre:实际上,光栅化和插值发生在 窗口空间,而不是 NDC。
标签: opengl graphics 3d perspectivecamera projection-matrix