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

2am*_*2am 10 c++ opengl depth-buffer

我试图运行一个OpenGL代码,它没有在glClear()中清除GL_DEPTH_BUFFER_BIT,因为我无法渲染我的场景.我添加了这个位,然后渲染了场景.为什么有必要使用这个清除位?

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

Gra*_*her 19

深度缓冲区保持场景中像素的"深度".当OpenGL渲染几何体时,每个片段(像素)将与该点处的深度缓冲区值进行比较.如果该片段的az值低于缓冲区中的值,则它将成为新的最低值,从而成为要渲染的像素.如果没有,请不要渲染它 - 有更接近的东西阻挡它.这就是它的要点 - 你可以自己阅读具体细节.

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

  • 您还可以交替深度范围和每帧深度测试的方向.但事实证明,清除深度缓冲区也是现代硬件上的性能优化 - 它们通过将帧缓冲区拆分为区块来实现无损Z-Buffer(和颜色缓冲区)压缩,当清除GPU时只需要读/写几位-tile为屏幕中没有任何内容的区域获取值.因此人们过去常常使用以避免清除颜色缓冲区和深度缓冲区的旧黑客实际上会损害现代GPU的性能;) (4认同)