介绍---Frame Buffer

实际上,OGL的输出并不一定直接修改on screen buffer。有三种可能情况:

1. 下图中的bufer就是on screen buffer,或者是on screen buffer的一部分,此时,OGL的输出直接修改on screen buffer的内容。

【扩展】当应用程序以front buffer作为draw buffer,或者选择single buffer时,是这样的情况,但是屏幕很有可能会出现闪烁现象。

2. buffer是独立于on screen buffer的存在,OGL首先输出到buffer中,然后再在适当的时候,将buffer中的数据拷贝到on screen buffer中。buffer的大小可以和on screen buffer相同,也可以小于on screen buffer。

【扩展】这种方法被称为blit

3. buffer是独立于on screen buffer的存在,而且两者的大小是相同的,也就是说,这是一个全屏的程序,OGL首先输出到buffer中,然后再在适当的时候,将这块buffer当做on screen buffer交给Display Controller输出到显示设备中。

介绍---Frame Buffer_第1张图片

 实际上,OGL的输出除了影响on screen buffer外,还有一些其他输出。在此之前,我们先来了解Fragment的概念。

我们知道,显示器是由像素pixel组成的,每个像素都有其颜色color信息;OGL的输出由fragment组成,其和pixel在位置上是一一对应的。每个fragment不仅有color信息,也有诸如depth、stencil等信息,这些信息被输出到不同的buffer中。上图描述的是fragment的color信息,其中的buffer即color buffer。

【说明】depth、stencil的意义将在以后解释。

接收color信息的buffer被称为color buffer,接收depth信息的buffer被称为为depth buffer,接收stencil信息的buffer被称为stencil buffer。根据配置不同,可能不存在depth buffer和stencil buffer,如果存在的话,则只有一份。而color buffer则有多份,比如front color buffer、back color buffer等,OGL可以将结果输出到合适的color buffer中,再在合适的时机反映到on screen buffer进行显示。所有的这些buffer组合,被称为frame buffer。

介绍---Frame Buffer_第2张图片

Frame Buffer是和窗口绑在一起的,也就是说,只有在用Win32 API(Win系统)或者X函数(Linux/X系统)创建一个窗口后,然后才因而衍生出Frame Buffer;而用OGL在窗口绘制的本质,就是将OGL的结果输出到窗口相关的Frame Buffer中后显示。

【扩展】在2008年提出的frame buffer object技术取消了frame buffer必须依赖窗口的限制,也就是说,OpenGL Spec扩展了对Frame Buffer的支持,不需要基于窗口即可创建出frame buffer,但是,这个frame buffer是off screen的,是无法被显示出来的,所以,一般可以作为中间计算结果。如果要想最终的显示,必须先创建一个窗口,然后改变该窗口所衍生的frame buffer中的数据。

你可能感兴趣的:(object,api,buffer,扩展)