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

标签 opengl graphics 3d perspectivecamera projection-matrix

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

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/

相关文章:

OpenGL GL_SELECT 或手动碰撞检测?

c++ - 用 SOIL 保存位图时 BMP 损坏。截图区

c++ - 如何在 Mac OSX 上使用 distutils 编译带有 python C++ 扩展的 OpenGL?

android - 在 Android Canvas 上绘制位图的一部分

C++/OpenGL - 开始一个新项目

java - 为什么我的 JComponent Paint(Graphics g) 不工作/不被调用?

c++ - 来自片段着色器中 GL_TEXTURE_1D 的样本

html - CSS 3D 变换看起来很平坦(正交?)

javascript - 使用文件 API 将资源加载到 Three.js 中

animation - translate3d 在 chrome 中正常工作,但在其他浏览器中不正常