使用 glClear 清除帧缓冲区和简单地绘制一个矩形来清除帧缓冲区有什么区别?

What is the difference between clearing the framebuffer using glClear and simply drawing a rectangle to clear the framebuffer?

我认为如果不使用 glClear,至少有一些旧的图形驱动程序曾经崩溃,而 glClear 在很多情况下可能更快,但为什么呢? 3-d 图形驱动程序通常如何实现,以便这些用途会产生不同的结果?

为什么速度更快?因为它是一种绕过大多数其他类型绘图必须经过的计算的功能。

Alpha function, blend function, logical operation, stenciling, texture mapping, and depth-buffering are ignored by glClear

Source

为什么有些驱动程序没有它会崩溃?不好说,不过应该跟OpenGL的实现细节有关系。这些功能完成了它应该做的事情,但可能会做更多你不知道的事情。 OpenGL 可能会从此函数调用中推断出它需要执行的其他任务。

在高层次上,它可以更快,因为 OpenGL 实现提前知道整个缓冲区需要设置为相同的 color/value。您对具体需要做什么了解得越多,您就越能利用可能的加速。

假设将整个缓冲区设置为相同的值比将相同的像素设置为可变值更有效。使用 glClear(),您已经知道所有像素都将具有相同的值。如果您使用发出恒定颜色的片段着色器绘制屏幕大小的四边形,则驱动程序要么必须通过分析着色器来识别这种情况,要么系统必须比较来自着色器的值,以了解所有像素具有相同的值。

将所有内容设置为相同的值可以更有效的原因与帧缓冲区压缩和相关技术有关。 GPU 通常不会实际将每个像素写入帧缓冲区,而是使用各种压缩方案来减少帧缓冲区写入所需的内存带宽。如果你想象几乎任何一种压缩,所有具有相同值的像素都是非常有利的。

为了让您对已发布的供应商特定技术有一些想法,这里有一些来源。您可能可以通过搜索找到更多信息。