首页 > 代码库 > [工作积累] OpenGL ES3.0: glInvalidateFramebuffer
[工作积累] OpenGL ES3.0: glInvalidateFramebuffer
https://www.khronos.org/opengles/sdk/docs/man3/html/glInvalidateFramebuffer.xhtml
这个在GLES2.0上只有Extension:
https://www.khronos.org/registry/gles/extensions/EXT/EXT_discard_framebuffer.txt
原理跟D3D9 的Present参数(D3DSWAPEFFECT_DISCARD)类似:
http://msdn.microsoft.com/en-us/library/windows/desktop/bb172612(v=vs.85).aspx
理论上, 每一帧的绘制都可以基于之前帧的绘制内容叠加, 所以需要保持之前backbuffer内容的有效性, 但是实时游戏中每一帧之间一般不这么做.
如果原有的backbuffer在swap之后内容不再有效, 这样可以避免GPU直接操作的frame buffer cache(fast memory)再重新写回video memory. 而且从下一次绘制开始, GPU也不关心原有backbuffer的内容, 不用再把backbuffer的内容load到frame buffer cache中. 这也是为什么要求video memory内的backbuffer数据必须是无效的.
这样可以节省带宽, 提高效率, 同时可能节省video memory开销.
这里的video memory不一定是显卡内的物理显存. 对于现代移动设备, 大部分是GPU和CPU共享的物理内存, 类似XBOX和PS4的Unified Memory Access.
然而OpenGL/ES的架构上只能是先准备用户内存, 然后"upload"给API, 实际上是从内存到内存的copy.
需要注意的是, 当FBO为默认FBO时, 输入的参数是不一样的:
If a framebuffer object is bound, then
attachments
may containGL_COLOR_ATTACHMENTi
,GL_DEPTH_ATTACHMENT
,GL_STENCIL_ATTACHMENT
, and/orGL_DEPTH_STENCIL_ATTACHMENT
. If the framebuffer object is not complete,glInvalidateFramebuffer
may be ignored.If the default framebuffer is bound, then
attachments
may containGL_COLOR
, identifying the color buffer;GL_DEPTH
, identifying the depth buffer; and/orGL_STENCIL
, identifying the stencil buffer.
[工作积累] OpenGL ES3.0: glInvalidateFramebuffer