8.1 渲染和显示
计算机将图形显示到显示设备上的过程,可以划分为两个阶段:第一阶段是渲染(render)过程,第二阶段是显示(display)过程,如图8-1所示。
图 8-1 图形渲染显示过程示意图
8.1.1 渲染
所谓渲染就是将使用数学模型描述的图形,如"DrawRectangle(x1,y1,x2,y2)",转化为像素阵列,或者叫像素数组。像素数组中的每个元素是一个颜色值或者颜色索引,对应图像的一个像素。对于X窗口系统,数组中的元素是一个颜色索引,具体的颜色根据这个索引从颜色映射(Colormap)中查询得来。
渲染通常又被分为两种:一种渲染过程是由CPU完成的,通常称为软件渲染,另外一种是由GPU完成的,通常称为硬件渲染,也就是我们常常提到的硬件加速。
谈及渲染,不得不提的另外一个关键概念就是帧缓冲(Framebuffer)。从字面意义上讲,frame表示屏幕上的某个时刻对应的一帧图像,buffer就是一段存储区了,因此,在狭义上,合起来的这个词就是指存储一帧屏幕图像像素数据的存储区。
但是从广义上,帧缓冲则是多个缓冲区的统称。比如在OpenGL中,帧缓冲包括用于输出的颜色缓冲(Color Buffer),以及辅助用来创建颜色缓冲的深度缓冲(Depth Buffer)和模板缓冲(Stencil Buffer)等。即使在2D环境中,帧缓冲这个概念也不仅指屏幕上的一帧图像,还包含用于存储命令的缓冲(Command Buffer)等。每一个应用都有自己的一套帧缓冲。
在OpenGL环境中,为了避免渲染和显示过程交叉导致冲突,从而出现如撕裂(tearing)以及闪烁(flicker)等现象,颜色缓冲又被划分为前缓冲(front buffer)和后缓冲(back buffer)。如果为了支持立体效果,则前缓冲和后缓冲又分别划分为左和右各两个缓冲区,我们不讨论这种情况。前缓冲和后缓冲中的内容都是像素阵列,每个像素或者是一个颜色值,或者是一个颜色索引。只不过前缓冲用于显示,后缓冲用于渲染。
2D可以看作3D的一个特例,因此,我们将2D程序中用于输出的缓冲区称为前缓冲。为了避免歧义,在容易引起混淆的地方我们尽量不使用这个多义的帧缓冲一词。