深度测试以及透视除法的一些相关内容

深度测试内容并不难,但是一开始对一些概念性质的东西还是有点迷迷糊糊的,这里写篇bolg帮助理解一下。对应的Learn OpenGL的章节:深度测试 以及 坐标系统


首先是透视投影(perspective)中的透视除法。相对的,也有平行投影。

现实生活(3D世界)中,我们知道有“近大远小”的概念,在图形学中为了模拟这种现象,我们画出来的各个物体或者物体的各个面,也要符合“近大远小”的现象。这个时候,透视除法就登场了。简单的说,就是将三维坐标(x, y, z)分别除以w分量,使得

\begin{pmatrix}x'
\\ y'
\\ z'

\end{pmatrix}

=

\begin{pmatrix} x / w
\\ y / w
\\ z / w

\end{pmatrix}

离观察者越远的顶点坐标,w分量越大(设置w分量是通过透视矩阵自动完成的,关于透视投影矩阵,参照这里)。通过这个操作,就实现了近大远小的现象。


但是问题又来了,为了模拟现实生活(3D世界)光是做一个透视除法够不够呢?当然不够,透视除法只是将物体以及它的各个面设置为“近大远小”,而我们现实生活中,除了近大远小,还有“遮挡”的概念,也就是不能透视看到整个物体。

在OpenGL中,这种现象我们可以通过深度测试(depth testing来实现。

什么是深度?简单理解为物体片段距离人(摄像机)的距离,也就是(片段的)Z坐标(当然,是做了透视除法之后,顶点Z坐标使得相应生成的片段改变之后的Z坐标;透视除法 -->顶点Z坐标 -->片段Z坐标)。

显而易见,对于不同片段想要渲染同一个像素点的行为,我们只要比较它们之间的深度,来决定渲染哪个点就好(这里不讲深度值,是因为深度值由深度(Z坐标)通过公式计算出来的)。

猜你喜欢

转载自www.cnblogs.com/zhlabcd/p/11742369.html
今日推荐