OpenGL 学习笔记——帧缓冲与后期处理

原文对应:LearnOpenGL CN-高级OpenGL-帧缓冲。


【1】默认缓冲帧与帧缓冲:
因为计算本身是消耗时间的,所以如果不采用双缓冲,则会出现图像闪烁的现象,有了双缓冲之后,显示前缓冲区,在后缓冲区绘图。然后交替交换显示,只要有一个拷贝的过程,就可以完成绘图。
这个后缓冲区,就是OpenGL(或者DX也是一样)的默认缓冲区。诸如深度测试,模板测试,颜色混合这些,成果通过测试,保留的字段(或者颜色混合得到的结果)都是默认写到这个缓冲区里面的。所谓的通过测试的片段,说白了就是写到这个后缓冲区里,并等待交换并显示于显示设备。


我对帧缓冲的理解是:为了执行某些特殊操作,实现某些特殊效果,在片段程序和后缓冲之间,增加了一个中间层,这个层就是帧缓冲。
比如后期效果,之前没有系统学习OpenGL之前(其实看过一些书,不过比较坑,没有这系列文章写得如此开卷有益,看着看着就迷糊了,看完一遍跟没看一样)我并不了解,诸如模糊效果是怎么实现的,为什么后期处理比较费。


【2】为什么后期效果需要用到帧缓冲
即便不看帧缓冲这篇文章,单纯从已有的知识结构去思考。
如果不用帧缓冲,我们怎么获取,计算模糊效果所必须的,一个像素点周围的点?
由于GPU的计算都是并行的,所以在你计算A点的时候,你怎么保证A点周围的8个点都已经计算完了?这是不可能做到的。
如果你不用帧缓冲,直接在后缓冲区计算模糊效果,那么当你计算A-1这个点时,就会把包含A在内的八个邻接点全部污染掉。
--------------------------举个栗子-------------------------------
1 1 1 
你期望的结果是 中间的点是左右点的加和,也就是
1 2 1
好,那么是个点呢?
1111,你期望的结果是,1221
然而实际结果呢?一定不是1221
而是:
1 2 3 1


数据被污染了,算2号点的时候,用的是1,3点,而算3号点的时候,用的是2,4号点。


但是如果有帧缓冲,结果就不一样了。我们先用帧缓冲,将场景全部渲染到一张和屏幕等大小的贴图上
1111
而目标,也就是最终渲染目标是,默认的缓冲区
我们先从帧缓冲区取1,3计算2号位 得到2,写到默认缓冲区
我们先从帧缓冲区取2,43计算3号位 得到2,写到默认缓冲区
最后结果是1 2 2 1,就是我们想要的结果(假定不考虑边界值的计算)


这就是帧缓冲区的作用
这就是为什么实现后期效果,需要用到帧缓冲的原因。


【3】理解帧缓冲
帧缓冲,某些特性和ZBuffer,模板缓冲很像。
比如:操作过程都分为两个部分:创作部分,和应用部分。
像:模板缓冲
创作部分:将模型写进去,制作遮罩模板
使用部分:利用遮罩模板,屏蔽掉某些片段,制作类似于描边,透明遮罩等效果
又如:深度测试
创作部分:就是先绘制的图形,他们会将深度写入ZBuffer
使用部分:使用部分其实是和创作部分重合的,后写入的点要和ZBuffer的默认值,或者是前辈们写入的值比较,决定淘汰前辈,或者被前辈淘汰。
再看帧缓冲,也分创作部分和使用部分
创作部分:利用某些东西,比如,不包含UI在内的所有3D场景部分,写入帧缓冲——写入目标是一个Texture目标。
使用部分:利用已经写入的东西,进行后期处理,比如模糊处理。
(然后在正常的写入清晰的UI部分,这样,场景模糊,UI不模糊的需求,就完成了。)


但是帧缓冲也有特殊的地方:
我们不产生像素,深度,或者模板,我们只是像素,深度,模板缓冲的搬运工……………………………………
好吧,我很无聊。
帧缓冲本身并无意义,必须为他们绑定上述三种的一种。他就像一个容器,一个壳一样,空容器,是没卵用的。
帧缓冲搬运的东西,叫做附件。
附件有两种:
OpenGL 学习笔记——帧缓冲与后期处理_第1张图片
可以把两种附件绑定到一个帧缓冲区上面去,这有点像是创建了一个额外的渲染流程(的一部分,从片段,到写入缓冲区这一部分)。这个过程就是所谓离屏渲染(Off-screen Rendering)。
至于“每个缓冲都应该有相同的样本数”我对这句话暂时的理解是,两个附件缓冲区的长宽应该是一直的,也就是持有像素数量相等。





你可能感兴趣的:(OpenGL)