0

我正在开发一个使用 OpenGL ES 在屏幕上绘制图形的 iPhone 应用程序。每绘制一个新帧,我都会在整个屏幕上绘制,这让我想到了我的问题。是否有必要调用 glClear 来清除每帧的颜色缓冲区,或者我可以用新数据覆盖它吗?glClear 函数目前占帧时间的 9.9%,所以如果我能摆脱它,它将提供很好的提升。

如果这是一个非常幼稚的问题,请原谅我,因为我是这个话题的菜鸟。提前致谢。

4

3 回答 3

2

从理论上讲,您可以将其排除在外。

但是如果你不清除颜色缓冲区,之前绘制的数据将保留在屏幕上。这将应用程序限制为具有非修改数据的应用程序。

于 2013-03-25T14:19:38.783 回答
1

如果您有一个不需要重新绘制的静态场景,那么您可以跳过对glClear()颜色缓冲区的调用。

来自Khronos OpenGL ES 文档

glClear将窗口的位平面区域设置为先前由glClearColor选择的值。

glClear采用单个参数指示要清除哪个缓冲区。

GL_COLOR_BUFFER_BIT表示当前启用颜色写入的缓冲区。

于 2013-03-25T14:35:20.810 回答
0

通常(在制作 3D 游戏时),您不仅要清除颜色缓冲区,还要清除深度缓冲区,并使用深度测试来确保绘制最接近相机的东西。因此,清除深度缓冲区很重要,否则只会重绘 Z 值低于前一帧的像素。绘制透明物体时,不清除颜色缓冲区也会有问题。

如果您正在制作一个 2D 应用程序并自己管理绘图顺序(首先绘制离相机最远的东西,然后绘制更接近的也就是画家算法),那么您可以省略 clear call。需要注意的一点是,使用这种算法,您还有另一个问题 -过度绘制,即绘制相同像素的次数超过了必要的次数。

于 2013-03-25T14:31:59.003 回答