Opengl 为什么图形管道需要映射到剪辑坐标和标准化设备坐标?

Opengl 为什么图形管道需要映射到剪辑坐标和标准化设备坐标?,opengl,graphics,3d,perspectivecamera,projection-matrix,Opengl,Graphics,3d,Perspectivecamera,Projection Matrix,关于透视投影,如果我使用简单的投影矩阵,如: 100 00 01 0 01 0 0 1/接近0 ,它只是投影到图像平面上。我认为,通过丢弃和规范化,可以很容易地获得视图空间坐标 如果是正交投影,它甚至不需要投影矩阵 但是,OpenGL图形管道具有上述过程,尽管透视投影会导致深度精度误差 为什么需要映射来剪裁坐标和标准化设备坐标 已添加 如果我使用上面的投影矩阵 1 0 0 0 p = ( 0 1 0 0 ) 0 0 1 0 0 0 1/n 0 v

关于透视投影,如果我使用简单的投影矩阵,如:

100 00

01 0

01 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。
在与投影矩阵相乘之前,还可以以相同的方式剪裁“远”上的值

嗯,虽然看起来很傻,但我觉得比以前容易多了

另外,我注意到深度缓冲区不能用这种方式写入。那么,它不能写在投影之前吗?

对于愚蠢的问题和胡言乱语,很抱歉…

对于正交投影,您是对的:透视除法不是必需的,但它不会引入任何错误,因为它是1的除法。(正交投影矩阵在最后一行中始终包含[0,0,0,1])

对于透视投影,这有点复杂: 让我们看一下最简单的透视投影:

      1  0  0  0
P = ( 0  1  0  0 )
      0  0  1  0
      0  0  1  0
然后一个向量
v=[x,y,z,1]
(在视图空间中)被投影到

v_p = P * v = [x, y, z, z],
这是在项目空间

现在需要透视分割以获得透视效果(离观看者更近的对象看起来更大):

我看不出如果没有观点分歧,这怎么可能实现

为什么需要映射来剪裁坐标和标准化设备坐标

程序员将顶点留给GL处理的空间是剪辑空间。这是在标准化/透视分割之前顶点存在的4D同质空间。该划分对于执行透视投影非常有用,是将顶点从剪辑空间转换为NDC(3D)所需的映射。为什么?相似的三角形

View Space                               Point
                                           *
                                         / |
                            Proj       /-  |
              Y  ^          Plane   /--    |
                 |               /--       |
                 |            *--          |y
                 |        /-- |            |
                 |     /--    |y'          |
                 | /---       |            |
           <-----+------------+------------+-------
         Z     O | 
                 |-----d------|            |
                 |------------z------------|
通过
z
进行的分割称为透视分割。这表明在透视投影中,距离越远的对象(z
z
)越大,对象越小,距离越近的对象(z
z
)越大

显然,在剪辑空间中执行的另一件事情是剪辑。在4D中,剪裁只是检查点是否位于与成本较高的分割相反的范围内


在正交投影的情况下,投影不是平截头体,而是长方体-平行光线来自无穷远而不是原点。因此,对于点
P=(x,y,z)
,z值被删除,从而给出
P'=(x,y)
。因此透视除法在这种情况下不起任何作用(除以1)。

对不起,我问错了。。。我想说的是,似乎没有必要使用这个。我认为裁剪和规范化v_ndc[x'/zy'/z,z'/z,1]比让透视矩阵来做更容易。裁剪和规范化是什么意思?你能给这个问题加个例子吗?我还是不明白。在乘以投影矩阵之前,您希望如何剪裁v_ndc?它在乘法之前不存在。你只能剪辑v_眼睛,但在眼睛空间中,视锥体不是立方体,而是一个截断的棱锥体,这使得剪辑非常困难。我猜是因为:1。它们简化并加速了填充多边形的HW插值器。2.更好地使用硬件支持的插值器变量的位深度来提高精度(更少的像素化插值)@Spektre您的解释似乎认为NDC是作为优化引入的。然而,将生活在不同4D空间中的点纳入单个3D空间(NDC空间)是一个必要的空间。这是通过透视分割完成的。@Spektre:实际上,光栅化和插值是在窗口空间中进行的,而不是在NDC中。
View Space                               Point
                                           *
                                         / |
                            Proj       /-  |
              Y  ^          Plane   /--    |
                 |               /--       |
                 |            *--          |y
                 |        /-- |            |
                 |     /--    |y'          |
                 | /---       |            |
           <-----+------------+------------+-------
         Z     O | 
                 |-----d------|            |
                 |------------z------------|
y ⁄ z = y' ⁄ z' (similar triangles)
y ⁄ z = y' ⁄ d  (z' = d by defn. of proj. plane)

y' = (d * y) ⁄ z