将颜色缓冲,深度缓冲,模板缓冲结合起来,就叫做帧缓冲(存储在内存中)。
具体创建方法以及用法这里不讲,LearnOpenGL对应章节有:帧缓冲。
这里说一下容易让人误解(或者难以理解)的地方。
- 实际上我们平时做的一些操作都是在默认帧缓冲中的渲染缓冲(Renderbuffer)中进行的,这里默认的帧缓冲是在创建窗口的时候GLFW生成和配置的。
- 我们可以创建自己的帧缓冲,方便进行一些后期处理操作(不明白的话往下看)。
- 帧缓冲至少需要一个颜色附件,附件当中至少要有一个缓冲类型(颜色,深度,模板)。
- 颜色附件中的“颜色”指的是附加到帧缓冲的时候的目标类型,注意和附件本身的存储格式区分开:比方说一个纹理颜色附件,那么创建纹理的时候存储格式应该为GL_RGB(源图格式也应该设置为GL_RGB),而附加到帧缓冲上的时候用:GL_COLOR_ATTACHMENT;又比如说一个纹理深度(模板)附件,那么创建纹理的时候就应该将存储格式改为GL_DEPTH_COMPOENT(GL_STENCIL_INDEX),而附加到帧缓冲的时候用GL_DEPTH_ATTACHMENT(GL_STENCIL_ATTACHMENT)。
- 另外一种附件叫做渲染缓冲附件(同纹理附件相对应),渲染缓冲对象直接将所有的渲染数据储存到它的缓冲中,不会做任何针对纹理格式的转换,让它变为一个更快的可写储存介质。然而,渲染缓冲对象通常都是只写的,所以你不能读取它们(比如使用纹理访问)。当然你仍然还是能够使用glReadPixels来读取它,这会从当前绑定的帧缓冲,而不是附件本身,中返回特定区域的像素。
- 一般纹理附件拿来当颜色附件,渲染缓冲附件拿来当 “模板&深度(一个整体)” 附件,同样,这里的"颜色”“模板&深度”指的都是附加到帧缓冲时候的目标类型。
- 那么什么时候选择纹理附件,什么时候选择渲染缓冲附件呢?
通常的规则是,如果你不需要从一个缓冲中采样数据,那么对这个缓冲使用渲染缓冲对象会是明智的选择。如果你需要从缓冲中采样颜色或深度值等数据,那么你应该选择纹理附件。性能方面它不会产生非常大的影响的。 - 需要注意的是,这些附件只是存储最终结果的,实际渲染过程(深度测试,模板测试之类的)依旧由GLFW自己操作。
- 创建自己的帧缓冲有什么用呢?它的优势是什么呢?
拿纹理附件(目标类型是颜色缓冲)来说的话,我们可以用图像的方式访问已经渲染场景的每个像素,所以可以在fragment shader中做出一些效果,比如说反相,灰度,更进一步,可以结合核(kernel)做出更加有特点的效果:锐化,模糊等。这些操作统称为后期处理(Post-processing)
以上。