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

时间:2015-10-12 06:30:19

标签: opengl graphics 3d perspectivecamera projection-matrix

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

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 在乘以投影矩阵之前,也可以以相同的方式剪切远处的值。

嗯,看起来很傻,我觉得它比以前容易。

PS。我注意到深度缓冲区不能以这种方式写入。那么,不能在投影之前写出来吗? 抱歉愚蠢的问题和胡言乱语......

2 个答案:

答案 0 :(得分:1)

在正交投影的情况下,你是对的:透视除法不是必需的,但它不会引入任何错误,因为它是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],

这是在有条不紊的空间。

现在需要持续的分歧才能获得持续的效果(靠近观众的物体看起来更大):

v_ndc = v / v.w = [x'/z y'/z, z'/z, 1]

我没有看到如果没有透视鸿沟就能实现这一目标。

答案 1 :(得分:0)

  

为什么需要映射到剪辑坐标和规范化设备坐标?

程序员将顶点留给要处理的GL的空间是剪辑空间。它是4D齐次空间,顶点存在于标准化/透视划分之前。这种用于执行透视投影的划分是将顶点从剪辑空间转换为NDC(3D)所需的映射。为什么?类似的三角形。

View Space                               Point
                                           *
                                         / |
                            Proj       /-  |
              Y  ^          Plane   /--    |
                 |               /--       |
                 |            *--          |y
                 |        /-- |            |
                 |     /--    |y'          |
                 | /---       |            |
           <-----+------------+------------+-------
         Z     O | 
                 |-----d------|            |
                 |------------z------------|

透视投影是指来自眼睛/原点的光线穿过投射平面撞击空间中存在的点的位置。光线与平面相交的点是点击的投影。假设我们想要将点P投影到投影平面上,其中所有点都有z = d。需要找到P的预计位置,即P'。我们知道z'将是d(因为投影平面就在那里)。要查找y',我们知道

y ⁄ z = y' ⁄ z' (similar triangles)
y ⁄ z = y' ⁄ d  (z' = d by defn. of proj. plane)

y' = (d * y) ⁄ z

z的划分称为透视划分。这表明在透视投影中,对象越远,z越大,对象越近,对象越近,z越小,看起来越大。

另一个方便在剪辑空间中执行的事情显然是剪辑。在4D中,裁剪只是检查点是否在一个范围内而不是昂贵的分割。

在正投影的情况下,投影不是平截头体而是长方体 - 平行光线来自无限远而不是原点。因此,对于点P = (x, y, z),仅删除Z值,得到P' = (x, y)。因此,在这种情况下,视角除法不做任何事情(除以1)。