计算机图形显示的基本原理

计算机很神奇, 居然可以通过无生命的屏幕与人产生"交流", 我很好奇的是, 它的原理是什么?! 看到一篇博文, 解决了我一大部分对这问题的疑问, 博文内容在最后贴出. 博文阐述的原理的大概是(以我的理解):

图形适配器(即显卡)连接在计算机主板上, 也连接着计算机屏幕;显卡里的缓存存储着屏幕每个像素如何发光的信息, 计算机的CPU可以将图像信息写入显卡的缓存, 而显卡缓存里的显示数据被不断地(以极快的频率)刷新在屏幕上,形成了我们看到的图像.

计算机图形的大致原理就是这样, 这些原理能够帮助我理顺一些疑问了, 那么, 我的另一个疑问会是"计算机是如何知道鼠标位置等类似问题并做出响应的"?

这也是当年使乔布斯感到很神奇的东西吧.

TIPS: 阅读原博文时, 并不能什么都读都抓, 只读需要的和自己的疑问点去寻思路, 要不然形成不了原理的枝干和枝叶,这也算是一点方法心得.

===原博文开始[ref]===

计算机图形显示原理 -杨磊

一、计算机图形显示基本概念

随着计算机科学技术的迅猛发展,借助于计算机的图形显示技术、图像处理技术和模式识别技术均取得了重大进展。仅在电视节目制作系统中,就有电视字幕机、三维动画工作站和非线性编辑系统等几大应用领域。而在这几大应用领域中,都离不开计算机图形显示技术。

谈到计算机图形显示技术,可分为硬件和软件两大部分,且这两大部分密切相关。就广义的图形来说,可以分为由计算机生成的字幕与图形、由扫描仪输入的图 形、由图像卡输入的活动图像及由该卡捕捉到的单帧图像(可以用某一规定的图形格式来存储)等。当这些图形图像以文件形式存储下来时,可以有静态或动态、低 分辨率或高分辨率等数十种格式。

1.图形适配器及其显示模式

从1981年问世的ibmpc机到当今的pentium系列微机,其图形显示方式都是通过图形适配器送到光栅扫描帧缓冲式显示器进行显示的,而图形适配器则是一块插在计算机主板上总线扩充槽内的插卡,它沟通了主机与显示器的联系,一般简称作显示卡。

在近20年的发展过程中,显示卡的种类与功能一直在不断地扩充。早期的单色显示卡(mda)只能显示单色图形,彩色显示卡(cga)问世后也仅仅是以 320×200的分辨率同屏显示4种颜色。标准vga彩显卡的出现使图形显示的最高分辨率达到了640×480像素点,但仍比pal制电视图像 768×576像素点或ccir601建议的720×576像素点的分辨率低,且此时的颜色只有16色,仍然不能满足电脑动画制作的要求。

随着计算机图形显示技术的不断发展,出现了大量与标准vga显示模式兼容的增强型vga显示卡,如ultra-vga、super-vga、 tvga。近些年来,更有具备3d图形加速功能的高分辨率显示卡相继问世,如winfast的3ds600dx等。这些增强的显示卡主要是增加了卡上图形 处理芯片的功能与速度,并相应增加了卡上显示缓冲区的存储容量及提高了时钟频率。因此,增强vga卡可以在1024×768的显示模式下同屏显示256种 颜色直至1670万种颜色,其中3ds600dx显示卡可以在1280×1024的超高分辨率下同屏显示1670万种颜色,更可以在1600×1200超 高分辨率下同屏显示6.5万种颜色。

在各种显示模式中,800×600像素点的分辨率超过了普通电视的分辨率,而1670万种颜色也足以超过人眼对色彩的分辨能力。因此,目前与具有 pal制电视编码功能的图像卡配合而输出标准电视信号的图形模式都是基于800×600这一显示模式。此时,在图像卡上视频缓冲区中的图像数据,首先经 d/a转换为模拟r、g、b信号,再经pal制电视编码后即可输出分辨率达768×576像素点的全彩色(也称作真彩色)隔行扫描电视信号。以前几年流行 的字幕机及三维动画工作站为例,经制作并渲染完成的三维动画各帧画面就是经targa图像卡或illumina�tor图像卡按上述模式输出单帧广播档标 准的pal制电视图像信号的,近年来的三维动画工作站则通过大容量的帧存储器或高速磁盘阵列,配合高效的mpeg-Ⅱ压缩算法,可输出实时的广播档电视信号。(图1: 显示缓冲区的存储单元与显示器屏幕坐标的对应关系)2.光栅图形显示器的工作原理

在图形显示卡上都有一个由视频存储器vram组成的显示缓冲区,它接受并暂存计算机送来的图形图像数字信息,经d/a转换为模拟信号后,再送到显示器 去显示。早期的mda卡上仅有4kb容量的显示缓冲存储器,到标准vga卡时容量增至512kb。增强vga卡一般为1mb容量,而目前扩展功能的显示卡 上,显示缓冲区的容量已达到2mb到4mb。

显示缓冲区可以看成是一个与屏幕上像素分布一一对应的二维矩阵,其中的每一个存储单元对应着屏幕上的一个像素,其位置可以由二维坐标(x,y)来表示。显示缓冲区的存储单元与显示器屏幕坐标的对应关系可以由图1来示意。(图2: 彩色光栅图形显示器的工作原理)

由于每一个显示缓冲单元可以由许多个位(bit)来表示,因此在图中用z方向来表示每一个显示缓冲单元的位。它可以只有1位,也可以多达8位、16 位、24位甚至更高。每一个缓冲单元所存储的信息称之为“像素值”,它决定了像素的颜色或灰度,因此,每个缓冲单元的位数越多,则颜色种类或灰度等级也就 越多。当对应每个像素的位数为n时,该像素所能表达的颜色或灰度等级数为2n。因此,当每像素为8位时,可以表示256种颜色或灰度,而当每像素为24位时,可以表示1670万种颜色或灰度。

实际的光栅扫描显示器大多采用荫罩式的crt,由红、绿、蓝三枪发射的电子束通过荫罩板射到荧光屏上对应颜色的荧光粉上。因此,前述的每一个像素值将通过一个“彩色表”将像素值转换为三种基色的分量信号,经相应的d/a转换后去分别控制三基色电子枪。图2示出了缓冲单元中的像素值为4位时,彩色光栅图 形显示器的工作原理。

3.图形显示过程

图形的显示过程应该从硬件和软件两个方面来说。就硬件方面来说,当电子束扫描到屏幕上某一像素的位置(坐标)时,显示器中的显示处理器 dpu(display processing unit)会同时从对应的显示缓冲单元中取出像素值,并以此查找彩色表的地址,从该地址处得到该像素的红、绿、蓝三基色分量,经d/a转换后分别控制三基 色电子枪,使屏幕上该像素显示出三基色的混合色。在图2示例中,彩色表的红、绿分量分别为15,而蓝分量为0,因此,屏幕上该像素的颜色会是黄色。

就软件方面来说,要完成图形显示的初始化及图形的加工。这里,初始化的意思是要将计算机的显示方式设置为显示器所能够显示的某一种模式,并将所有的显示缓冲单元清零,另外,对彩色表的每一个单元要分别填上预定的颜色值,使彩色索引与具体的颜色联系起来。

图形加工则是图形软件的主要任务,其主要内容是:根据需要显示的图形内容,随时改写显示缓冲单元的内容。这是因为屏幕上显示的图形是由显示卡上显示缓冲区中的内容唯一决定的。一旦在显示缓冲单元中写入要求的彩色索引值,图形就自然在屏幕上显示出来了。

二、图形的生成

1.初始化

各种图形显示模式已经写入到机器主板上的rombios中。通过对rombios的合理调用,就可以获得所需的显示模式。由于各种显示卡可以有许多种 显示模式,因此,在计算机生成任何图形之前,必须进行图形的初始化工作,也就是说必须要装入图形驱动程序,以确定计算机是工作在哪一种图形显示模式。

2.点的显示

由于图形显示器件的显示方式具有离散性质,使得任何图形的显示都是由点的集合形式呈现的,也就是说,点是构成直线、圆弧、抛物线及其它任意曲线的最基本元素,也是构成面、体等图形的最基本元素,因此在讨论计算机生成任何图形之前,首先应了解点的显示原理

根据前面的介绍,图形初始化后即可进入相应的图形显示模式。在不同的显示模式下,点的大小是不一样的,例如在320×200的显示模式下,满屏显示的 最多点数为320×200Κ64000点,因此,一个点的面积约占整个屏幕面积的1/64000。在1024×768的显示模式下,满屏显示的最多点数为 1024×768Κ786432点,因此,一个点的面积约占整个屏幕面积的1/786432,仅为前者的8%。图形分辨率越高,点就越小

点的显示一般有两种方式:其一,是采用dos操作系统的rombios的系统中断调用,其int10中断处理子程序就是对显示屏幕进行处理的;其二,是直接存储器存取(dma)的快速写点方式,即直接对显示卡上的视频vram进行存取。dosbios的调用方法一般比较简单,但由于需要经过ah、al、cx、dx等几个寄存器的存取动作,写点的速度要慢些。dma方式的写点速度要比dosbios调用方式的写点速度快得多,但算法稍复杂一些。

近些年来,对于图形图像显示技术的研究一直是计算机领域的一个热门话题,不少公司也相继推出了各式各样的图形图像加速技术。如最近新推出的 directdraw直接写屏技术,可以使图形图像的显示速度进一步加快,这对于大量3d图形的显示尤为显得重要。而基于directdraw技术的应用 程序一般可以通过visual basic、visual c++、borland c++或delphi等编程语言来编制。

3.基本图形的生成

基本图形一般指直线段、圆弧以及由它们构成的简单几何图形。根据前面关于在屏幕上写点的说明可知,要生成基本图形,只需根据构成基本图形的各曲线段的 方程找出所有符合曲线方程的点(即x、y坐标值),并在屏幕坐标的相应位置上以给定的颜色正确显示这些点,即可在屏幕上完整显示出由计算机所画出的图形。 值得说明的是,计算机显示器屏幕上所能显示的最大点数由显示卡的不同显示模式所决定。因此,在进入图形显示方式时,首先要在显示器的屏幕上建立一个坐标系,且水平和垂直坐标均取为整数。当通过方程计算出来的x、y坐标值不为整数时,还应对该坐标值以四舍五入方式取整。

在实际应用中,直接根据曲线方程进行编程常常会使得程序中出现大量的实数乘除法及多层循环运算,造成程序的执行效率极低,因此实用程序中大多采用了巧 妙的算法以尽量回避影响程序执行速度的因素。此部分内容属于计算机图形学的基本内容,有兴趣的读者可参阅有关的书籍,这里不赘述。