C++ 为什么在渲染过程中必须清除OpenGL中的深度缓冲区?

C++ 为什么在渲染过程中必须清除OpenGL中的深度缓冲区?,c++,opengl,depth-buffer,C++,Opengl,Depth Buffer,我试图运行一个OpenGL代码,它没有在glClear()中清除GL\u DEPTH\u BUFFER\u位,因此我无法渲染场景。我添加了这个片段,场景被渲染了。为什么必须使用这个透明位 我可能知道原因,清除GPU以前使用的深度缓冲区值,但我只想确认。深度缓冲区保存场景中像素的“深度”。当OpenGL渲染几何体时,会将每个片段(像素)与深度缓冲区在该点的值进行比较。如果该片段的z值低于缓冲区中的z值,则它将成为新的最低值,从而成为要渲染的像素。如果没有,不要渲染它-有更接近的东西挡住了它。这就是

我试图运行一个OpenGL代码,它没有在glClear()中清除GL\u DEPTH\u BUFFER\u位,因此我无法渲染场景。我添加了这个片段,场景被渲染了。为什么必须使用这个透明位


我可能知道原因,清除GPU以前使用的深度缓冲区值,但我只想确认。

深度缓冲区保存场景中像素的“深度”。当OpenGL渲染几何体时,会将每个片段(像素)与深度缓冲区在该点的值进行比较。如果该片段的z值低于缓冲区中的z值,则它将成为新的最低值,从而成为要渲染的像素。如果没有,不要渲染它-有更接近的东西挡住了它。这就是它的要点——你可以自己阅读细节


现在,当场景发生变化时会发生什么?您希望清除屏幕以便重新绘制所有内容,但也希望清除深度缓冲区。为什么?因为否则,所有新像素将与前一帧的深度值进行比较。这是没有道理的-他们应该与他们所在的框架中的那些进行比较!您的推理是正确的。

您还可以在每一帧中交替深度范围和深度测试方向。但事实证明,清除深度缓冲区也是现代硬件上的一项性能优化——它们通过将帧缓冲区拆分为分片来实现无损Z缓冲区(和颜色缓冲区)压缩,当清除深度缓冲区时,GPU在获取屏幕上没有分片的区域的值时,只需要每个分片读/写几位。因此,过去人们用来避免清除颜色缓冲区和深度缓冲区的老方法实际上损害了现代GPU的性能;)这正是我认为的原因:)完美的答案。