如何在opengl Es 2.0中部分重绘

时间:2014-08-25 04:00:23

标签: opengl-es 3d

根据我的需要,我想重新绘制每帧的部分场景 仅在更新整个场景的某些部分时重绘整个场景。

在OpenglEs 2.0中有没有办法做到这一点? 请对此有任何意见,这将非常有用

1 个答案:

答案 0 :(得分:1)

OpenGL并不真正支持增量渲染。每次要求重绘时都需要绘制整个框架。

我能想到的最接近的是使用FBO(帧缓冲对象)将静态数据渲染到屏幕外帧缓冲区。如果你寻找像#34; OpenGL FBO"这样的关键词,你应该能够在网上和书中找到大量的例子。您将使用glGenFramebuffers()glBindFramebuffer()glFramebufferTexture2D()等电话。

将静态内容渲染到FBO后,可以在每次重绘开始时将其复制到默认的帧缓冲区,然后在其上面渲染动态内容。如果渲染静态内容非常昂贵,这可能是一种有价值的方法。否则,从FBO复制到默认帧缓冲区可能比仅每次重新渲染静态内容更昂贵。

如果静态内容在后台,并且动态内容完全位于其前面,则上述内容非常简单。如果静态和动态内容重叠,则会变得更加棘手。然后,您必须在开始呈现动态内容之前每次都恢复由于呈现静态内容而产生的深度缓冲区。我无法想到在ES 2.0中做到这一点的好方法。相对平滑地执行此功能的功能(深度纹理,glBlitFramebuffer)仅在ES 3.0及更高版本中使用。

我认为还有另外一个选项非常吸引人,但我想完整地提及它:EGL定义了EGL_SWAP_BEHAVIOR属性,可以设置为EGL_BUFFER_PRESERVED。一个重要的警告是它是可选的,并不是所有设备都支持。它也只保留颜色缓冲区,而不是像深度缓冲区那样的辅助缓冲区。如果您还想阅读,请参阅eglSwapBufferseglSurfaceAttrib