OpenGL的深度缓冲

发布时间 2023-12-13 12:30:46作者: overxus

  如果我们想要在三维空间里画两个正方形:一个红色的,一个绿色的,而且从人眼的观察角度看,绿色正方形在红色正方形的后面。最后看上去应该是这样的:

要点在于,从观察者的角度看,绿色正方形在红色正方形的后面,因此绿色正方形的一部分被红色正方形遮挡。

  然而,在启用深度测试前,正方形的相对位置完全取决于绘制这两个正方形的顺序。如果我们先绘制红色正方形,再绘制绿色正方形,看上去会是这样:

由于绿色正方形是最后绘制的,因此它在屏幕中遮挡了红色正方形,虽然从顶点坐标来看它应该在红色正方形的后面。而如果最后绘制的是红色正方形,看上去就是正确的效果了。

 

  针对这个问题应该怎么办呢?我们需要你,深度缓冲!

  深度缓冲的原理其实非常简单,它为窗口内的每个像素点保留一个8位的深度信息,当有新的点绘制在窗口的某个位置时,OpenGL会比较这个点的深度与此位置之前保留的深度大小,默认情况下保留深度较小的那个像素点,也就是距离我们的视角更近的那个点。从而,如果新绘制点的深度小于之前保留的深度大小,则在窗口内绘制这个点,并更新深度信息;否则就忽略这个点。

  使用深度缓冲前,需要先启用深度测试:

glEnable(GL_DEPTH_TEST);

  然后在主循环的内部,每次循环时清空深度缓冲:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  现在,无论我们先绘制哪个,都能得到正确的视觉效果:

  启用深度测试后,对于两正方形像素的重叠部分,由于红色正方形上的点具有更小的深度,因此只有红色部分会被保留。

  有些杠精朋友可能会说:“我就是不喜欢用深度测试,我乐意每次计算哪些物体距离视线更近,越近的物体越到最后才画,你能拿我怎样?”年轻人不要太气盛,看看下面这个:

  如果没有启用深度缓冲,看上去会是这样:

    

先画红色,再画绿色

或者是这样:

先画绿色,再画红色

最后的视觉效果都不太对。

  好了,这篇文章已经够长了,模板缓冲还是另写一篇吧。