在透视投影上,如果我使用简单的投影矩阵,如:
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。我注意到深度缓冲区不能以这种方式写入。那么,不能在投影之前写出来吗? 抱歉愚蠢的问题和胡言乱语......
答案 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)。