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