openGL可以渲染屏幕的framebuffer,自然可以渲染不直接显示的framebuffer,把数据存入非直接显示的framebuffer中以便后续的渲染需求,或者直接存入纹理贴图texture都是非常灵活的。
需要注意的是因为不同平台数据结构不同的关系,你需要针对不同平台,创建和设置针对的framebuffer格式。
比如如果你使用默认的framebuffer那么,他的大小就是窗口或屏幕的大小,而如果窗口移出屏幕范围,那么有可能对应的shader压根就不会运行了(由于裁剪测试clip test,顶点shader也极有可能把几何直接剔除,那么就进入不了后续的渲染管道)。所以用户需要提供自定义framebuffer,这样渲染到指定地点就是可控制的,但是最大的尺寸是被openGL所限制的。
用户提供的framebuffer被openGL作为framebuffer objects对待,顾名思义它和其他openGL中的objects一样需要被创建并初始化。
首先我们需要为framebuffer object预留一个名字
void glGenFramebuffers(GLsizei n, Gluint * ids);
并把它绑定到设备上下文上去初始化。
void glBindFramebuffer(GLenum target, GLuint framebuffer);
一般情况下 glBindFramebuffer()会把应用程序提供的framebuffer object作为当前framebuffer。其中参数framebuffer就是我们预留的名称之一(opengl都是靠GLuint来索引object的,为它的名称),target参数一般为GL_FRAMEBUFF