提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
帧缓冲区:颜色缓冲区,深度缓冲区,模板缓冲区介绍
前言
关于帧缓冲区对象也是个容器的概念,真正起作用的是它的附件,附件有颜色缓冲区、深度缓冲区、模板缓冲区三种。
一、帧缓冲区(Frame buffer)
概念:
帧缓冲区也被叫做显存,它的作用是用来存储显卡芯片处理过或者即将提取的渲染数据。如同计算机的内存一样,显存是用来存储要处理的图形信息的部件。他是由像素组成的二维数组,每一个存储单元对应屏幕上的一个像素,整个帧缓冲对应一帧图像即当前屏幕画面。帧缓冲通常包括:颜色缓冲,深度缓冲,模板缓冲和累积缓冲。这些缓冲区可能是在一块内存区域,也可能单独分开,看硬件。而像素数据在进入帧缓冲之前(称为片段)必须通过一系列测试才能写入帧缓冲,如果片段在其中某个测试没有通过,后面的测试或操作都将不再进行。这些测试或操作流程是:开始(片段)-裁剪测试-alpha测试-模板测试-深度测试-混合-抖动-逻辑操作-结束(写入帧缓冲).
优点:
创建帧缓冲区对象:前面章节讲过OpenGL一般的缓冲区对象,主要是优化性能。而帧缓冲区对象除了优化性能还增加了一些功能,类似GDI中的辅助DC,和系统的帧缓冲区一样也是保存当前屏幕图像,只是它是后台保存看不见。具体它可以关联纹理对象(即颜色缓冲区)和渲染缓冲对象(Renderbuffer有深度缓冲和模板缓冲)来组成自己后台的帧缓冲区。例如,渲染动态纹理,多屏实现等。
注释:
帧缓冲可能是GPU专属内存,也可能是GPU和CPU共享内存,看硬件。手机一般是共享内存,PC独立显卡一般是专属内存,集成显卡是共享内存。
二、颜色缓冲区(Color buffer)
用于绘图的缓冲区,它包含了颜色索引或者RGBA颜色数据。OpenGL在绘制图元时,先是在一个缓冲区中完成渲染,然后再把渲染结果交换到屏幕上。我们把这两个缓冲区称为前颜色缓冲区(屏幕)和后颜色缓冲区。在默认情况下,OpenGL命令是在后颜色缓冲区进行渲染的。当然,也可以直接在前颜色缓冲区中进行渲染。
三、深度缓冲区(Depth buffer)
与帧缓冲区对应,存储每个像素的深度值,通过深度缓冲区,我们可以进行深度测试。当启动深度测试时,片段像素深度值和深度缓冲区深度值进行比较,从而确定像素的遮挡关系,保证渲染正确,决定片段哪些像素点数据可以替换到颜色缓冲区中。
四、模板缓冲区(Stencil buffer)
与颜色缓冲区和深度缓冲区类似,模板缓冲区可以为屏幕上的每个像素点保存一个无符号整数值。这个值的具体意义视程序的具体应用而定。在渲染的过程中,可以用这个值与一个预先设定的参考值相比较,根据比较的结果来决定是否更新相应的像素点的颜色值。这个比较的过程被称为模板测试。模板测试发生在透明度测试(alpha test)之后,深度测试(depth test)之前。如果模板测试通过,则相应的像素点更新,否则不更新。
就像使用纸板和喷漆一样精确的绘图一样,当启动模板测试时,通过模板测试的片段像素点会被替换到颜色缓冲区中,从而显示出来,未通过的则不会保存到颜色缓冲区中,从而达到了过滤的功能。这里有点难理解,可以参考链接:https://blog.csdn.net/csxiaoshui/article/details/23457273
五、累积缓冲区(只做了解即可)
累积缓冲区允许你把渲染到颜色缓冲区的值,拷贝到累积缓冲区。在多次拷贝操作到累积缓冲区时,可以用不同方式的把颜色缓冲区内容和当前累积缓冲区的内容进行重复混合,可以用来进行模糊处理和抗锯齿。
参考的博客
https://blog.csdn.net/u010223072/article/details/45307561
https://baike.baidu.com/item/%E6%98%BE%E5%8D%A1%E5%86%85%E5%AD%98/4387024
https://blog.csdn.net/csxiaoshui/article/details/23457273
https://www.zhihu.com/question/287978479