opengl - 如果使用双缓冲,是否需要清除缓冲区?

标签 opengl framebuffer doublebuffered double-buffering

假设我们使用双缓冲。我们首先将帧写入后台缓冲区,然后将其交换到前台缓冲区进行显示。

这里有 2 个场景,我认为它们具有相同的结果。

  • 假设我们清除后台缓冲区,然后将新帧写入后台缓冲区。将其交换到前缓冲区中。

  • 现在假设我们没有清除后台缓冲区,后台缓冲区无论如何都会被新帧覆盖。最后两个缓冲区将被交换。

因此,假设我是对的,只要我们使用双缓冲,无论是否清除缓冲区,两者最终都会得到相同的显示,这是真的吗?

如果我们不清除缓冲区,是否会出现任何可能的渲染伪影?

最佳答案

第二种方法的关键在于这个假设:

the back buffer will be overwritten with a new frame

我假设我们正在讨论 OpenGL 帧缓冲区,其中包含颜色值、深度、模板等。它们在下一帧中将如何被覆盖?

渲染代码会进行恒定的深度比较,因此请查看需要绘制哪些对象。使用旧的帧深度数据,一切都会变得困惑。如果您渲染任何半透明项目并启用混合,也会发生同样的情况。

清除缓冲区是将所有内容重置为零(或您需要的任何其他特定值)的最快方法。

有些技术依赖于缓冲区不被清除(考虑到这被验证为平台上的昂贵操作)。例如,没有透明几何体,后面没有不透明几何体,并在 0-0.5/0.5-1.0 范围内切换深度测试较小/较大,以使其始终覆盖旧帧值。

关于opengl - 如果使用双缓冲,是否需要清除缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35917348/

相关文章:

c++ - 如何为我的 3d 曲线添加可变性 - openGL/C++ 中的球面坐标

c++ - OpenGL 帧缓冲区 - 渲染到纹理创建具有主帧缓冲区内容的纹理

c# - 派生自绘TabControl的双缓冲问题?

c++ - cv::Mat 如何从/转换为 glm::mat4

c++ - OGRE 异常(7:InternalErrorException):在 FreeImageCodec::decode 中解码图像时出错

performance - 在AMD上写入非零FBO附件时OpenGL会降低性能

winapi - 使用 Windows API 渲染时屏幕撕裂

Java SWT GC,如何强制刷新双缓冲图像?

java - awt双缓冲

opengl - 调整过剩窗口的大小