1.帧缓存包括颜色、scissor、alpha、stencil、depth这些缓存,所以帧缓存不是一片缓存,而是所有这些缓存的组合,帧缓存它对应了屏幕上的每一个pixel(不是真正的pixel,而是一个fragment所对应的位置)的各种这些信息(颜色、ZBUFFER、等等),几何体的fragment时没有帧缓存的,帧缓存时屏幕上的,一个缓存的一位就对应一个位片面。

Colorbuffer是最终表现在屏幕上的,但是其他缓存决定了最后这些color是否和怎样绘制在屏幕上.,其中除了colorbuffer的那些帧缓存也称作辅助缓存.

在光栅化得到fragment后,就要按照以下的顺序进行各种测试,那些通过测试了的像素才有资格最后放到屏幕上,在通过所有测试后,这些fragment将可能被写入原有的帧缓存(但是在最后混合出来的颜色值可能与屏幕原有的帧缓存中 的颜色缓存做各种运算,所以颜色缓存有时可能不会被简单覆盖,但其他缓存会。

2.颜色缓存的读写:glDrawBuffer和glReadBuffer(),然后调用GlwritePixel、glreadpixel等

3缓存掩码(MASK):

可以设置每种帧缓存的掩码,再写入相应缓存时就会被掩码作用,具体表现为

GlIndexmask(Glint  mask):如果在索引模式下,当mask的第i位为0时,则第i个索引的颜色不会被写入到颜色缓存中,你会看到原本为那个颜色的区域变成空空的了,为1正常绘制,可以利用他进行层动画。

Glcolormask(GLboolean red,GLboolean green,GLboolean blue,GLboolean alpha):它可以控制颜色值中的那个通道绘制那个不被绘制(1为绘制),这个可以让你查看各种颜色的渲染,如图是只显示红色的情形:

GlDepthMask(GLboolean flag):当flag为真时写入深度缓存,否则就不写入。默认是写入的,那如果为否不写入你将看到什么效果呢?这样每一帧后绘制的那个物体它不写帧缓存,也就是它的帧缓存默认为最小的0,所以此时你永远看到后绘制的在前面(这跟正常情况下不带开深度测试看到的场景是一样的)。

深度缓存的掩码有很多的应用,例如你可以随时置它与FALSE控制以后的物体为后绘制的现实在最上层

4fragment的测试

注意这里要进行的所有测试都是在fragmen级别上的,这部分也是本章的核心内容。测试的意义是;当一个被计算出来的fragment要最终成为屏幕的一个pixel时要按照下面顺序通过测试,如果在哪个阶段不被通过,就会不绘制,如果最后都通过了,确定要在屏幕的颜色缓存上绘制这一点时,还要将这点屏幕缓存该点原先颜色进行某种混合。

Scissor Test:这里通过glScissor()定义一个矩形区域(Scissor box),如果片段在这和矩形内,则通过,不在则不通过(不显示),这个相当于StencilTest的矩形版。效果如下:就像从一小窗口观看的感觉

Alpha test:它的基本功能时利用alpha(RGBA的A) 缓存来判定是否绘制一个像素,虽然它的值经常被用来进行混合效果。用glAlphaFunc()来定义参考值和通过测试的条件。测试的过程是,用fragment的alpha值遇一个定义的参考值做比较,比较的方式由glAlphaFunc指定,通过这个比较来判断是否通过测试。

Alpha test可以制作镂空效果或是billboard,制作billboard的过程是:制作一个贴有rgba四通道的贴图,其中透明部分的alpha为0,反之为1,在场景中为一个细分的多边形贴上这个贴图作为纹理,其中顶点的ALPHA值就为其贴图的点的ALPHA值,最后使用alpha测试,并将比较函数设置为GL_GRETER,参考值为0.5,这样0的那部分就会不通过,变成完全透明的了。

Stencil test:它时一个模板测试,形象的比喻就是在stencil test处理中,会依据stencil buffer这个记忆体中所存放的资料,来决定是否要舍弃像素。它的测试过程是这样的,在所有像素的stencil buffer里面存储了一些值,然后定义了一个比较方法和一个参考值,如果参考值与该点的stencilbuffer里面的值在这种比较方式下通过,那么这点通过测试,被绘制。你不能直接写入stencilbuffer,但是可以通过glStencilOp()来间接写入,这个函数设定当一个fragment通过或者不通过Stencil缓存时Stencil缓存起什么变化。

Stencil test最常用的用途就是在屏幕上定义一块不规则的区域,然后限制在这个区域内显示。它的实现方法是这样的:

首先要清空当前的Stencil缓存为0:glClearStencil(0);glClear(GL_STENCIL_BUFFER_BIT)

然后设定glStencilFunc()为GLALWAYS,1,就是都通过该测试,并且设定GLSENCILOP(GL_REPLACE,GL_REPLACE,GL_REPLACE)接着绘制你希望的不规则区域的形状。这段代码的意思就是让你绘制的那个形状都通过Stencil测试,而且通过后都用1来取代那点的Stencil缓存。这样就把Stencil缓存变成了那块形状的区域为1,定制了一个这种形状的模板,注意每次RESIZE的时候stencil会自动清空掉

最后要清空屏幕的颜色和深度缓存,然后设定glStencilFunc为GL_EQUAL,1,GLSENCILOP为GL_KEEP(不变Stencil缓存了,最后后绘制你要绘制的场景,这样那些等于1的stencil位置被绘制上了,不等于的就不绘制了,这是这种算法的效果:里面在一个人形的区域内绘制,这对一些游戏的GUI来说很有帮助

Depth test:通常进行深度测试的过程是这样的,在每一帧开始用一个很大的值来清空深度缓存,然后在绘制时,会自动产生当前的深度,默认采用的比较函数是较小的深度通过测试进行绘制,这样就剔除了背景。当然也可以用glDepthFunc来设置比较函数

当进行过上述测试后,所有即将认为要被写到同一屏幕位置的片段将混合他们的颜色值,作为最后的颜色在最后一步写在屏幕上,在这里可以设置这个混合方式

Dithering:这一歩时用在索引模式,因为在索引模式下如果混合后的颜色不再索引中,他将找一种所颜色拼凑的方式来替代,打开GL_DITHER的开关即可。

最后一步逻辑操作:最后一步时逻辑操作,我们在前面生成了将写在屏幕上的颜色,而此时COLORBUFFER有刚才的颜色值,这是可以选择对这两个值进行操作,默认是GL_COPY,也就是单纯拷贝新值到屏幕上,但是事实上还有很多可选的逻辑操作,当然要打开GL_COLOR_LOGIC_OP/INDEX开关。其实这个操作时非常有用的,它可以直接控制最后在屏幕上的显示状况,它只是改变最后屏幕上的像素,所以可以很轻松的实现肯多小TRIK,如颜色反置,切换场景与清空等等。

关于Accumulation Buffer,这个framebuffer和测试无关,它用来累计颜色缓存上的值,也就是说他可以将每帧的颜色缓存的值类加到她这里,然后她还可以把他累加的内容重新写入颜色缓存,我们看上去就像一幅几张图像叠加的照片。我们可以控制这些过程。glAccum()控制对这个缓存的操作,通常有开始累加,清空重新累加、写到屏幕颜色缓存、数值运算等操作。可以利用buffer进行反走样和模糊处理。使用前要在最前面打开GLUT_ACCUM模式,这个缓存有很多用处:如反走样、模拟运动模糊、模拟多重曝光(即产生HDR图)、产生软影(soft shadow)等等。

转载于:https://www.cnblogs.com/weizhixiao/archive/2009/05/12/5697386.html

Opengl编程学习笔记(五)——从FRAGMENT到PIXEL(framebuffer 帧缓存)相关推荐

  1. python网络编程需要学什么,python网络编程学习笔记(五):socket的一些补充 Python 网络编程需要学习哪些网络相关的知识...

    python的socket编程问题hdr = recvall(s, 5) if hdr is None: print 'Unexpected EOF receivingstruct在unpack的时候 ...

  2. 【Linux_Shell 脚本编程学习笔记五、Oracle JDK1.8 安装shell 脚本】

    脚本使用说明: 首先在脚本的同级目录下有个 jdk的安装包 脚本和安装包必须在同级目录下才能够安装(脚本没有优化,还可以使用  wget  从网上下载指定版本的  jdk 安装包) #!/bin/sh ...

  3. 网络通信编程学习笔记(六):socket编程实战

    目录 一.wireshark抓包分析TCP协议 1.1.TCP协议的连接与断开简介 1.2.用wireshark抓取使用TCP协议传输的握手包 二.用Teardrop代码编写一个假包,并抓取 2.1. ...

  4. 多线程编程学习笔记——async和await(三)

    接上文 多线程编程学习笔记--async和await(一) 接上文 多线程编程学习笔记--async和await(二) 五.   处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多 ...

  5. python函数是一段具有特定功能的语句组_Python学习笔记(五)函数和代码复用

    本文将为您描述Python学习笔记(五)函数和代码复用,具体完成步骤: 函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Pyth ...

  6. 多线程编程学习笔记——任务并行库(二)

    接上文 多线程编程学习笔记--任务并行库(一) 三.   组合任务 本示例是学习如何设置相互依赖的任务.我们学习如何创建一个任务的子任务,这个子任务必须在父任务执行结束之后,再执行. 1,示例代码如下 ...

  7. 多线程编程学习笔记——使用并发集合(三)

    接上文 多线程编程学习笔记--使用并发集合(一) 接上文 多线程编程学习笔记--使用并发集合(二) 四.   使用ConcurrentBag创建一个可扩展的爬虫 本示例在多个独立的即可生产任务又可消费 ...

  8. [Linux网络编程学习笔记]索引

    一.Linux基本知识 [学习笔记]Linux平台的文件I/O操作 [学习笔记]Linux平台的文件,目录及操作 [Linux学习笔记]标准输入输出 [Linux学习笔记]进程概念及控制 [Linux ...

  9. Lua 编程学习笔记

    文章目录 Lua 编程学习笔记 一.环境安装 二.Lua 基本语法 1. 注释 2. 标识符 3. 变量 4. 数据类型 5. Lua 运算符 三.循环与流程控制 1. 循环 2. 流程控制 四.函数 ...

最新文章

  1. 两个git库之间迁移_Python 3 迁移怨声载道
  2. Spring AOP与IOC
  3. python自定义线程
  4. mysql实现gb18030转utf8_将编码是GB18030的小文件转为UTF8
  5. µC/OS-II和µC/OS-III比较
  6. 蓝桥杯题_ALGO11_瓷砖铺放
  7. pythonflat怎么设置_python – numpy 2d和1d add flat
  8. c++实现单例类(懒汉与饿汉)
  9. import() 动态加载component组件失败
  10. 批量下载baidu音乐主页的歌曲
  11. Scrapy安装报错
  12. 华为谷歌互利合作曝光:或将推Nexus手表
  13. 英特尔AMD竞相为笔记本处理器添加图形功能
  14. GoLang的逃逸分析
  15. java web 中 读取windows图标并显示
  16. 安装插件报错:error: Microsoft Visual C++ 14.0 is required...
  17. 黑苹果OC引导配置制作小工具:一键制作黑苹果OpenCore EFI文件
  18. 【STM32+cubemx】0013 HAL库开发:SPI总线访问气压计BMP280/BME280
  19. 知识点小记——广播地址与有限广播地址
  20. 解决打开xml文件没有代码

热门文章

  1. Linux内存管理 (26)内存相关工具
  2. 英语发音规则---N字母
  3. Oracle 查询结果去重保留一项
  4. 【Codevs1346】HelloWorld编译器
  5. 如何提高网站的访问速度
  6. 2017年4月25日(日志库glog)
  7. C/C++-标准输入/输出重定向为文件输入/输出
  8. 老李推荐:第3章3节《MonkeyRunner源码剖析》脚本编写示例: MonkeyImage API使用示例 1...
  9. SAP ECC 6.0 ,R3 windows server 2003 安装分享 自学教程
  10. ***JAVA多线程和并发基础面试问答