在覆盖整个帧缓冲区之前,glClear(GL_COLOR_BUFFER_BIT)是首选吗?

时间:2016-05-19 22:50:47

标签: opengl

我看到了不同的意见。 现在,我只关心颜色数据。

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)

1 个答案:

答案 0 :(得分:8)

  

在第28章图形管道性能中,它说:

有许多不同类型的硬件。在打印GPU Gems#1时普遍存在的硬件上,这个建议是合理的。现在它不再是。

曾几何时,清除缓冲区实际上意味着硬件将转到每个像素并写入清除值。这个过程显然需要花费大量的GPU时间,因此高性能应用程序开发人员尽力avoid incurring the wrath of the clear operation

如今(至少在过去的8到10年里,我的意思是几乎所有的GPU),图形芯片更清晰。他们没有做清楚,而是使用帧缓冲区的缓存来玩游戏。

执行读取/修改/写入操作时,帧缓冲区图像的值被清除。这包括混合等,但它也包括任何形式的深度或模板测试。要进行RMF操作,必须首先读取那里的值。

这就是聪明才智的来源。当你“清除”一个帧缓冲图像时,什么都不会被写入。相反,帧缓冲区图像地址空间无效。当读取操作发生在无效的地址时,它只返回清除值。这需要零带宽。实际上,它保存带宽,因为读取操作实际上不必读取内存。它只是取得了明确的价值。

根据缓存的工作方式,执行纯写操作时甚至可能更快。但这取决于不同的硬件。

对于使用基于图块的渲染的移动硬件,这更重要。在切片开始处理之前,它必须读取帧缓冲图像的当前值。如果图像被清除,则不需要读取任何内容;它只是将磁贴内存设置为清晰的颜色。

即使你没有混合到帧缓冲区,这个案例也很重要。为什么?因为GPU和API 都不知道你不会混合。它只知道您要对该图像执行一些渲染操作。因此必须假设最坏的情况并将图像读入图块。当然,除非事先清除它。

简而言之,当将这些图像用于帧缓冲区时,首先清除图像通常不慢而不是清除图像。

以上都假定您清除整个图像。如果您只清除图像的子区域,则不太可能发生此类优化。虽然它仍然可能,至少对于基于缓存行为的优化而言。