我看到了不同的意见。 现在,我只关心颜色数据。
在Chapter 28. Graphics Pipeline Performance中,它说:
避免无关的颜色缓冲区清除。如果每个像素都保证 被应用程序覆盖在帧缓冲区中,然后避免 清除颜色,因为它花费了宝贵的带宽。
在How does glClear() improve performance?中,它引自Apple's Technical Q&A on addressing flickering (QA1650):
您必须为屏幕上的每个像素提供一种颜色。在 在绘图代码的开头,使用glClear()是个好主意 初始化颜色缓冲区。全屏清除您的每一个 颜色,深度和模板缓冲区(如果您正在使用它们)在开始时 框架也可以提高应用程序的性能。
该帖子中有一个答案:
通过发出glClear命令,您告诉硬件您要执行的操作 不需要以前的缓冲区内容,因此不需要复制 颜色/深度/从帧缓冲区到较小的磁贴内存的任何内容。
对于那个答案,我的问题是: 如果没有混合,为什么我们需要从帧缓冲区读取颜色数据。 (现在,我只关心颜色数据)
但无论如何,总的来说,我是否需要调用glClear(GL_COLOR_BUFFER_BIT)
答案 0 :(得分:8)
在第28章图形管道性能中,它说:
有许多不同类型的硬件。在打印GPU Gems#1时普遍存在的硬件上,这个建议是合理的。现在它不再是。
曾几何时,清除缓冲区实际上意味着硬件将转到每个像素并写入清除值。这个过程显然需要花费大量的GPU时间,因此高性能应用程序开发人员尽力avoid incurring the wrath of the clear operation。
如今(至少在过去的8到10年里,我的意思是几乎所有的GPU),图形芯片更清晰。他们没有做清楚,而是使用帧缓冲区的缓存来玩游戏。
执行读取/修改/写入操作时,帧缓冲区图像的值被清除。这包括混合等,但它也包括任何形式的深度或模板测试。要进行RMF操作,必须首先读取那里的值。
这就是聪明才智的来源。当你“清除”一个帧缓冲图像时,什么都不会被写入。相反,帧缓冲区图像地址空间无效。当读取操作发生在无效的地址时,它只返回清除值。这需要零带宽。实际上,它保存带宽,因为读取操作实际上不必读取内存。它只是取得了明确的价值。
根据缓存的工作方式,执行纯写操作时甚至可能更快。但这取决于不同的硬件。
对于使用基于图块的渲染的移动硬件,这更重要。在切片开始处理之前,它必须读取帧缓冲图像的当前值。如果图像被清除,则不需要读取任何内容;它只是将磁贴内存设置为清晰的颜色。
即使你没有混合到帧缓冲区,这个案例也很重要。为什么?因为GPU和API 都不知道你不会混合。它只知道您要对该图像执行一些渲染操作。因此必须假设最坏的情况并将图像读入图块。当然,除非事先清除它。
简而言之,当将这些图像用于帧缓冲区时,首先清除图像通常不慢而不是清除图像。
以上都假定您清除整个图像。如果您只清除图像的子区域,则不太可能发生此类优化。虽然它仍然可能,至少对于基于缓存行为的优化而言。