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

标签 c++ opengl depth-buffer

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

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

最佳答案

深度缓冲区保存场景中像素的“深度”。当 OpenGL 渲染您的几何图形时,每个片段(像素)都会与该点的深度缓冲区值进行比较。如果该片段的 z 值低于缓冲区中的值,它将成为新的最低值,因此成为要渲染的像素。如果不是,请不要渲染它 - 有更近的东西在阻挡它。这就是它的要点 - 您可以自己阅读细节。

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

关于c++ - 为什么我们必须在渲染过程中清除 OpenGL 中的深度缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19469194/

相关文章:

c++ - SDL 和绑定(bind)缓冲区

opengl - cmake 不使用 QtOpenGL 链接 libGLU

c++ - OpenGL)阴影贴图使物体看起来偏红

opengl - 使用 FBO 渲染多个深度信息

linux - 如何在 SSH 之上使用 OpenGL?

c++ - 多采样帧渲染对象和深度缓冲区

c++ - 在没有 super 用户的情况下在 linux 中打开 RAW 套接字

c++ - 使用 Arduino IDE 编程是否适合商业产品?

c++ - 从 Visual Studio 运行应用程序会导致错误(由 CMake 生成)

c - 更好地控制 OpenGL 中的曲面 segmentation ?