逐步更新OpenGL ES的屏幕缓冲区

时间:2015-08-02 02:01:11

标签: opengl-es

当调用OpenGL应用程序的渲染功能时,我是否可以依赖于屏幕缓冲区仍包含我在上次调用我在该缓冲区上工作的渲染函数时所绘制的内容的事实?

换句话说,是否可以只对缓冲区进行增量更新,或者每次都需要重绘整个屏幕,以防万一?

我意识到使这种方法工作所需的逻辑非常复杂,因为有多个屏幕缓冲区,所以更新需要增量而不是相对于最后一次调用render函数,而是实际的最后一次调用进入这个特定的屏幕缓冲区。但是,根据屏幕更新的类型和所需的性能,这可能仍然值得研究。所以,任何答案都不能做到这一点!"不要这样做!"应该基于这个想法的实际可靠性问题,如可能的随机缓冲区损坏,而不仅仅是#34;它太难以调试" ...

2 个答案:

答案 0 :(得分:1)

取决于您在表面上设置的EGL_SWAP_BEHAVIOR

eglSwapBuffers()

  

...如果曲面的EGL_SWAP_BEHAVIOR属性的值为EGL_BUFFER_PRESERVED,则颜色缓冲区的内容保持不变,如果值为EGL_BUFFER_DESTROYED则未定义。可以使用eglSurfaceAttrib为某些曲面设置EGL_SWAP_BEHAVIOR的值。

eglSurfaceAttrib注意到:

  

实施选择EGL_SWAP_BEHAVIOR的初始值。

...所以请确保您实际设置了所需的值,而不是依赖于(不可靠)默认值。

答案 1 :(得分:1)

不,你不能依赖以前的内容。确切的行为是非常平台甚至设备依赖。或者更糟糕的是,它可能会在同一设备上发生变化,具体取决于部分无法控制的条件。

在某些平台上,有一些方法可以保留以前的缓冲区内容。例如,在Android上,正如另一个答案中已经提到的那样,表面上有一个EGL_BUFFER_PRESERVED属性。但是,并非所有设备都支持。除非您针对的是软件的特定设备,否则您必须检查该功能的可用性,如果该功能不存在,则使用不同的方法。我在这里的相关答案中更详细地解释了这一点:Fast Screen Flicker while NOT drawing on Android OpenGL。另一个限制是,即使存在该特征,它也只会保留颜色缓冲区。如果渲染依赖于还需要保留的深度或模板缓冲区,这对您没有帮助。

如果你的渲染非常昂贵,那么增量绘图是必要的,唯一可移植的解决方案是渲染到FBO,并在每次重绘时将FBO内容复制到默认的帧缓冲区。