OpenGL的深度缓冲
如果我们想要在三维空间里画两个正方形:一个红色的,一个绿色的,而且从人眼的观察角度看,绿色正方形在红色正方形的后面,最后看上去应该是这样的:
要点在于,从观察者的角度看,绿色正方形在红色正方形的后面,因此绿色正方形的一部分被红色正方形遮挡。
然而,在启用深度测试前,正方形的相对位置完全取决于绘制这两个正方形的顺序。如果我们先绘制红色正方形,再绘制绿色正方形,看上去会是这样:
由于绿色正方形是最后绘制的,因此它在屏幕中遮挡了红色正方形,虽然从顶点坐标来看它应该在红色正方形的后面。而如果最后绘制的是红色正方形,看上去就是正确的效果了。
针对这个问题应该怎么办呢?我们需要你,深度缓冲!
深度缓冲的原理其实非常简单,它为窗口内的每个像素点记录一个深度信息,当有新的点绘制在窗口的某个位置时,OpenGL会比较这个点的深度与此位置之前保留的深度大小,默认情况下保留深度较小的那个像素点,也就是距离我们的视角更近的那个点。从而,如果新绘制点的深度小于之前保留的深度大小,则在窗口内绘制这个点,并更新深度信息;否则就忽略这个点。
使用深度缓冲前,需要先启用深度测试:
glEnable(GL_DEPTH_TEST);
然后在主循环的内部,每次循环时清空深度缓冲:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
现在,无论我们先绘制哪个,都能得到正确的视觉效果:
启用深度测试后,对于两正方形像素的重叠部分,由于红色正方形上的点具有更小的深度,因此只有红色部分会被保留。
有些杠精朋友可能会说:“我就是不喜欢用深度测试,我乐意每次计算哪些物体距离视线更近,越近的物体越到最后才画,你能拿我怎样?” 年轻人不要太气盛,看看下面这个:
如果没有启用深度缓冲,看上去会是这样:
先画红色,再画绿色
或者是这样:
先画绿色,再画红色
最后的视觉效果都不太对。
好了,这篇文章已经够长了,模板缓冲还是另写一篇吧。