在透视投影上,如果我使用简单的投影矩阵,例如:
1 0 0 0
0 1 0 0
0 0 1 0
0 0 1/接近 0
,它只是投影到图像平面上。我认为,通过丢弃和标准化,可以轻松获得 View 空间坐标。
如果是正交投影,甚至不需要投影矩阵。
但是,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。我注意到深度缓冲区不能以这种方式写入。那么,不能写在投影之前吗?
抱歉提出了愚蠢的问题和胡言乱语......
最佳答案
在正交投影的情况下,你是对的:透视除法不是必需的,但它不会引入任何错误,因为它是除以 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]
(在 View 空间中)被投影到
v_p = P * v = [x, y, z, z],
位于投影空间中。
现在需要透视划分来获得透视效果(靠近观察者的对象看起来更大):
v_ndc = v / v.w = [x'/z y'/z, z'/z, 1]
我不明白如何在没有观点分歧的情况下实现这一目标。
关于opengl - 为什么图形管道需要映射到剪辑坐标和标准化设备坐标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33074548/