OpenGL 2D应用如何正确清除后缓冲区以解决旧画面残留问题
问题核心原因
你犯了OpenGL开发中非常常见的错误:glClearColor 只是设置清屏操作要用的颜色值,不会实际执行清屏操作。
隔帧残留旧画面的原因
现在主流显卡驱动的双缓冲交换逻辑大多是「交换前后缓冲区指针」而非拷贝内容:当你调用交换缓冲区函数后,原来的前缓冲(正在显示的画面)会变成新的后缓冲,原来的后缓冲(你刚画完的画面)变成新的前缓冲输出到屏幕。
你没有清屏就直接在新的后缓冲上绘制局部内容,周围未绘制的区域自然就保留了上上帧的旧画面,刚好对应你观测到的「每第二次交换缓冲区就出现旧内容」的规律。
解决方案
- 每帧渲染开始时,在设置完
glClearColor后,必须加一行实际执行清屏的代码:
glClear(GL_COLOR_BUFFER_BIT);
哪怕你这帧只需要绘制局部区域,也要先清空整个颜色缓冲,不要依赖双缓冲交换后后缓冲区的遗留内容——这部分内容在OpenGL规范里是未定义的,不同设备、不同驱动的表现完全不一样,没有通用性。
2. 你当前加的glFinish、glFlush和这个问题完全无关,可直接删除,不需要额外调用。
3. 如果你确实需要保留上一帧的绘制内容做累积效果,要么关闭双缓冲,要么确认目标平台支持GL_EXT_swap_buffers_preserved扩展,不过该扩展兼容性极差,非必要不推荐使用,优先选择每帧清屏后重绘所有需要显示的内容。
内容的提问来源于stack exchange,提问作者Jakub Mitura
相关产品推荐
相关产品推荐

