我正在开发一个使用 OpenGL ES 在屏幕上绘制图形的 iPhone 应用程序。每绘制一个新帧,我都会在整个屏幕上绘制,这让我想到了我的问题。是否有必要调用 glClear 来清除每帧的颜色缓冲区,或者我可以用新数据覆盖它吗?glClear 函数目前占帧时间的 9.9%,所以如果我能摆脱它,它将提供很好的提升。
如果这是一个非常幼稚的问题,请原谅我,因为我是这个话题的菜鸟。提前致谢。
我正在开发一个使用 OpenGL ES 在屏幕上绘制图形的 iPhone 应用程序。每绘制一个新帧,我都会在整个屏幕上绘制,这让我想到了我的问题。是否有必要调用 glClear 来清除每帧的颜色缓冲区,或者我可以用新数据覆盖它吗?glClear 函数目前占帧时间的 9.9%,所以如果我能摆脱它,它将提供很好的提升。
如果这是一个非常幼稚的问题,请原谅我,因为我是这个话题的菜鸟。提前致谢。
从理论上讲,您可以将其排除在外。
但是如果你不清除颜色缓冲区,之前绘制的数据将保留在屏幕上。这将应用程序限制为具有非修改数据的应用程序。
如果您有一个不需要重新绘制的静态场景,那么您可以跳过对glClear()
颜色缓冲区的调用。
glClear将窗口的位平面区域设置为先前由glClearColor选择的值。
glClear采用单个参数指示要清除哪个缓冲区。
GL_COLOR_BUFFER_BIT表示当前启用颜色写入的缓冲区。
通常(在制作 3D 游戏时),您不仅要清除颜色缓冲区,还要清除深度缓冲区,并使用深度测试来确保绘制最接近相机的东西。因此,清除深度缓冲区很重要,否则只会重绘 Z 值低于前一帧的像素。绘制透明物体时,不清除颜色缓冲区也会有问题。
如果您正在制作一个 2D 应用程序并自己管理绘图顺序(首先绘制离相机最远的东西,然后绘制更接近的也就是画家算法),那么您可以省略 clear call。需要注意的一点是,使用这种算法,您还有另一个问题 -过度绘制,即绘制相同像素的次数超过了必要的次数。