为什么在OpenGL渲染过程中需要清除深度缓冲区?

17

我试图运行一个OpenGL代码,其中在glClear()中没有清除GL_DEPTH_BUFFER_BIT,因此我无法渲染场景。我添加了这个位,场景就被渲染了。为什么需要使用这个清除位?

我可能知道这个原因,是为了清除GPU先前使用的深度缓冲区值,但我只是想确认一下。

1个回答

29
深度缓冲区保存场景中像素的“深度”。当OpenGL渲染几何图形时,每个片段(像素)会与该点处深度缓冲区的值进行比较。如果该片段具有低于缓冲区中的z值,则它将成为新的最低值,因此是要呈现的像素。否则,不要呈现 - 有些更近的东西挡住了它。这就是其中的要点 - 你可以自己了解细节。
现在,当场景改变时会发生什么?您想要清除屏幕以便重新绘制所有内容,但您还想要清除深度缓冲区。为什么?因为否则所有新像素都将与前一帧的深度值进行比较。这没有意义 - 它们应该与它们所在的帧中的值进行比较!您的推理是正确的。

4
每帧可以交替改变深度范围和深度测试方向。但事实证明,在现代硬件上清除深度缓冲区也是一种性能优化 - 它们通过将帧缓冲区划分为瓷砖来实现无损Z缓冲区(和颜色缓冲区)压缩,当GPU清除时,只需要读/写每个瓷砖的几个位,以获取屏幕上没有内容的区域的值。因此,人们过去用来避免清除颜色缓冲区和深度缓冲区的旧技巧实际上会损害现代GPU的性能;) - Andon M. Coleman
这正是我认为的原因 :) 完美的答案。 - 2am

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接