根据我的需要,我只想为每帧重绘场景的一部分仅在部分场景已更新的情况下重绘整个场景。
在OpenGL ES 2.0中是否可以做到这一点?请对此提供任何输入将非常有帮助
OpenGL并不真正支持增量渲染。每次要求重新绘制时,都需要绘制整个框架。
我能想到的最接近的是,您使用FBO(帧缓冲区对象)将静态数据渲染到屏幕外的帧缓冲区。如果您寻找诸如“ OpenGL FBO”之类的关键字,则应该能够在网上和书籍中找到大量示例。您将使用glGenFramebuffers()
,glBindFramebuffer()
,glFramebufferTexture2D()
等电话
一旦将静态内容呈现到FBO中,您可以在每次重绘开始时将其复制到默认帧缓冲区,然后在其上方呈现动态内容。如果呈现静态内容非常昂贵,则这可能是一种值得的方法。否则,从FBO复制到默认帧缓冲区的开销可能比每次简单地重新渲染静态内容都要昂贵。
如果静态内容位于背景中,而动态内容完全位于背景中,则上述操作非常容易。如果静态和动态内容重叠,则将变得更加棘手。然后,您将必须还原每次渲染静态内容所产生的深度缓冲区,然后再开始渲染动态内容。我想不出在ES 2.0中执行此操作的好方法。仅在ES 3.0及更高版本中才能相对平稳地执行此功能(深度纹理glBlitFramebuffer
)。
[我认为没有其他选项很吸引人,但是出于完整性考虑,我想提及它:EGL定义了可以设置为EGL_SWAP_BEHAVIOR
的EGL_BUFFER_PRESERVED
属性。一个重要的警告是它是可选的,并非所有设备都支持。它还仅保留颜色缓冲区,而不保留辅助缓冲区(例如深度缓冲区)。如果仍要阅读,请参阅eglSwapBuffers和eglSurfaceAttrib。