第四章 图元的属性
本章重点讲解内容: 颜色和亮度等级 线属性 曲线属性 区域填充属性 字符属性 反走样 本章内容相对容易理解、难度不大,但颜色、反走样是学习的重点和难点 由于内容难度小,可相对加快讲解速度,重点讲解反走样等知识 字符属性 反走样
4.1 颜色和亮度属性 颜色属性 亮度属性 直接存储 颜色查找表 通用光栅扫描系统通常提供较多的颜色,而随机扫描系统最多只能提供几种颜色供选择。颜色选项用0到某一正整数值编码。对于CRT显示器,这些颜色码被转换成电子束的强度等级。对于彩色绘图仪,这些编码将控制喷墨或选笔. 在彩色光栅系统中,可选颜色的数量取决于帧缓冲器中为每个像素提供的存储器数量.
颜色表:采用直接存储策略 在彩色光栅系统中,可选颜色的数量取决于帧缓冲器中为每个像素提供的存储器数量 帧缓冲区中像素信息直接控制RGB三枪强度 如何增大系统支持色彩数? 是本章的重点内容 必须清楚讲述颜色表的构成、使用方法,学会计算颜色数、存储量等
颜色表:采用直接存储策略 已知分辨率1024×1024 假如: 每个像素使用6位表示颜色, 帧缓冲区容量=1024×1024×6/8 每个像素使用24位表示颜色, 帧缓冲区容量=1024×1024×24/8=3MB 利用直接存储策略,一旦在应用程序中指定某种颜色编码,就在帧缓冲器中为要以那种颜色显示的输出图元的每个组成像素设置为对应的二进制值. 例如,每个像素占3位存储器时,它提供了最小数目的彩色颜色数,三位位置的每一位用来控制RGB显示器中对应电子枪的亮度等级(开或关),给缓冲器中每个像素增加位数将使可选择的颜色数量增加,假如每个像素6位,则每支电子枪用2位,这允许三支电子枪的每一支具有四种不同的亮度,对每个屏幕像素共有64个有效颜色。对于1024×1024的分辨率,真彩色/全色(每个像素占24位)RGB系统需要帧缓冲器的存储量:1024×1024×24 bit=3M byte。 彩色表是不需要增大帧缓冲器而又扩充颜色能力的一种变换方法
颜色查找表 帧缓冲区中的值作为颜色查找表的索引 存储在颜色查找表中的信息控制RGB三枪强度 彩色查找表中存储彩色码有许多优点。使用彩色表可提供合理的同时显示的颜色数量,而无需大容量帧缓冲器。对于大多数应用,256或512种不同颜色足以显示单个图像。表项可随时改变,从而使用户能容易地试验在设计、场景或图形中使用不同的颜色组合,而无需改变对图形数据结构的属性设置。有些图形系统为颜色码存储提供两种能力,从而使用户能选择在帧缓冲器中使用彩色表或直接存储彩色码
颜色查找表 每个像素在帧缓冲器中占8位,可引用表中256个表位置的任何一个 表中的每个表项可用24位来指定RGB颜色。 示例: 每个像素在帧缓冲器中占8位,可引用表中256个表位置的任何一个 表中的每个表项可用24位来指定RGB颜色。 允许从近1亿7千万种颜色的调色表中选择256种颜色同时显示。 减少了同时显示的颜色数目,但将缓冲器的容量需要减少到1M。 颜色查找表是减少存储空间的一个非常巧妙的方法,重点让学生理解颜色查找表中的索引,及实际颜色的存储位置
彩色查找表中存储彩色码有许多优点: 使用彩色表可提供合理的同时显示的颜色数量,而无需大容量帧缓冲器。 256或512种不同颜色足以显示单个图像。 表项可随时改变,容易试验在设计、场景或图形中使用不同的颜色组合,而无需改变对图形数据结构的属性设置。 有些图形系统提供两种能力,方便用户选择
二、灰度等级 光栅系统中采用与彩色编码类似的方式存储灰度级别 如果每个像素有3位,则可以实现8个灰度等级,而如果每个像素有8位就可给出256种灰度效果。 对于无彩色能力的显示器,颜色功能在应用程序中可用于设置显示元素的灰度等级。使用从0到1范围内的数值来指定灰度级别,而后被转换成适当的二进制存储在光栅中。 如果每个像素有3位,则可以实现8个灰度等级,而如果每个像素有8位就可给出256种灰度效果。
4.2 属性参数 定义:任何影响图元显示方法的参数 属性选择设计 为每个输出图元功能扩充参数表 系统当前属性值表 通常,任何影响图元显示方法的参数被称为属性参数。如颜色、大小等属性是确定图元的基本特性;其它则指出在特定条件下怎样显示图元。如三维视图的深度信息以及交互式对象选择程序所需的可见性或可检测性。这里我们仅考虑哪些控制图元基本显示特性的属性,而不考虑特定条件。如线段可以是点线或虚线、粗线或细线以及蓝色或其它颜色等。区域可用一种颜色或多色图案填充。文本可从左到右阅读方式显示,沿屏幕对角线倾斜或按垂直列向显示
线属性 线型:实线、虚线、点线等 线宽: 线色: 直线段的基本属性有线型、宽度和颜色。在一些软件包中,线用可选择的笔或刷来显。下面,考虑怎样修改画线程序来实现各种指定属性。
4.2.1 线宽 实现 显示相邻的平行线 线宽=2 |m|<1 (x,y) 和 (x,y+1) 4.2.1 线宽 实现 显示相邻的平行线 |m|<1 (x,y) 和 (x,y+1) 线宽=2 线宽选择的实现取决于输出设备的能力。在视频显示器上的粗线可以用相邻的平行线来显示。 在光栅实现中,标准线宽是用像Bresenham算法那样在每个取样位置处用一个像素来生成。其它宽度是作为标准线的正整数倍通过沿相邻平行线路径画额外的像素而显示的。
4.2.1 线宽 线宽=4 |m|>1 (x,y) & (x+1,y)& (x-1,y)&(x-2,y) 4.2.1 线宽 线宽=4 对于斜率绝对值小于1的线,可修改画线程序,通过在沿线的每个x位置画像素的垂直段来显示粗线。每段的像素数目等于线宽的整数值。在图中,我们通过在原线段路径之上生成一条平行线而画出了双倍线宽的线段。在每个位置x处,计算对应的y坐标,并使用屏幕坐标(x,y)和(x,y+1)画像素。通过交替地在单线宽度的上下画像素就可以显示线宽≥3的粗线 |m|>1 (x,y) & (x+1,y)& (x-1,y)&(x-2,y)
通过添加“线帽”来调整线端的形状以给出较好的外观 线帽有方帽、圆帽和突方帽。 用水平段或垂直段实现宽度选择的另一个问题是:不管斜率多少,所生成线段的端点是水平或垂直的。这对于较粗的线的影响更突出。我们可以通过添加“线帽”来调整线端的形状以给出较好的外观。线帽有方帽、圆帽和突方帽。方帽通过调整所构成平行线的端点位置,使粗线的显示具有垂直于线段路径的正方形端点。假如指定线的斜率m,则粗线的方端的斜率-1/m。
生成粗折线需要一些额外的处理。通常,显示单根折线段所用的方法不能生成光滑连接的折线段。 通过在线段端点进行额外处理来生成光滑连接的粗折线。 三种方法: 斜角连接 圆连接 斜切连接 生成粗线的其它方法包括将显示线段看作填充长方形,或用选定的笔或刷样式来生成线段。 生成粗折线需要一些额外的处理。通常,显示单根折线段所用的方法不能生成光滑连接的折线段。我们可通过在线段端点进行额外处理来生成光滑连接的粗折线。图显示出了两线段光滑连接的三种可能方法:斜角连接、圆连接和斜切连接。斜角连接通过延伸两条线的外边界直到它们相交来完成。圆连接通过用直径等于线宽的圆弧边界将两线段间连接而成。斜切连接则是通过用方帽和在两线段相交处的三角形间歇中填充来生成
4.2.2 线型 线型 绘制像素段 像素掩码 例: 00011111 线型属性可能包括实线、虚线和点线等。我们通过设置沿线路径显示的实线段的长度和间距来修改画线算法,以生成各种类型的线。虚线可通过在实线段间插入与实线段等长的空白段来显示;画线的长度和空白段长度常作为用户的选项来指定。点线,可通过生成很短的画线和等于或大于画线大小的空白段来显示 对于各种画线、点线和点画线,用像素掩模来指定实线段和空白段的长度。例如,掩模1111000可表示画线长度为四个像素和中间空白段为3个像素的虚线。
4.2.2 线型 问题:在不同的直线方向生成不等长划线 解决:根据直线斜率调整实心段和空白段的像素数目 调整前 调整后 4.2.2 线型 问题:在不同的直线方向生成不等长划线 解决:根据直线斜率调整实心段和空白段的像素数目 调整前 用固定数目的像素画线会产生如图所示的在不同方向不同长度的线段。为此,可按线的斜率来调整实心段和空白段的像素数目。另一个保持画线等长的方法是将画线看作为单独的线段,将每条画线的端点坐标定位后,调用沿画线路径计算像素位置的画线程序。 调整后
4.2.3 画笔和笔刷的选择 将显示线段看作填充长方形 用选定的笔或刷样式来生成线段。
4.2.3 画笔和笔刷的选择 画笔和笔刷的方式 形状 尺寸 样式 像素掩码
有些图形软件包中,线可选择笔或刷的方式来显示。选项包括形状、尺寸和式样。如图显示的可能的笔和刷形状。这些形状可以以像素位置数值形式存储在一个像素模板中,在必要时设置到线段路径上。例如图显示的是一个长方形笔的像素模板,用这个模板的中心沿线段路径就可画出相应宽度的线来 通过改变笔或刷的像素模板的尺寸,则使用该模板的笔或刷来生成的线段就可以有不同的宽度
4.2.4 线色 当系统提供颜色(或亮度)选择时,给出当前颜色索引的参数被包括在系统属性值表中。折线程序以当前颜色显示折线,是通过用setPixel程序将这种颜色设置在帧缓冲器中沿线段路径像素位置处得以实现。颜色选择的数目取决于帧缓冲器中每个像素有效值的数目
4.3 曲线属性 像素掩码 eg.11100 根据曲线斜率设置像素掩码的实心段和空白段像素数目 在计算机显示屏幕上显示曲线相对困难,特别是显示平滑曲线 曲线属性的参数与直线段相同,我们可用各种颜色、宽度、点划模式和有效的笔或刷选择来显示曲线。采用画线算法来适应属性选择的方法也类似于画直线。如图,显示的一个用模板11100来生成虚线圆弧。可用圆的对称性生成圆的其它部分。 如前面讨论的一样,各种宽度的光栅曲线可用水平或垂直像素段来显示,曲线斜率的绝对值小于1,用垂直段;斜率绝对值大于1,用水平段。如图示
4.3 曲线属性 水平(|m|>1)或垂直 (|m|<1)像素段
4.2曲线属性 填充平行曲线路径之间的区域 Eg. R=16 17 14 另一种显示粗曲线的方法是填充两条距离等于预定宽度的平行曲线路径间的区域。可以用指定的曲线路径作为一条边界,并在其内侧或外侧建立第二条边界来实现,然而,这样的粗曲线会发生偏移,因此,通常在曲线路径两侧以预定宽度的一半距离,设置两条边界曲线来保持曲线位置,如图。 曲线的笔或刷显示可使用前面直线段中讨论的相同方法来实现。当曲线斜率为1时,用这种长方形笔显示的曲线会比较粗。因此,要显示一致的曲线宽度可通过旋转长方形笔以使其在沿曲线移动时与曲线斜率方向一致,或用圆弧笔来实现
4.3曲线属性 画笔和笔刷 Eg. 矩形笔 3x3
4.4 区域填充属性 填充一个定义的区域的选择,包括选择实区域颜色或图案填充方式何选择某种颜色或图案,取决于可用软件包的能力,这些填充选择可应用于多边形区域或曲线边界定义的区域。此外,区域也可用多种画笔、颜色和透明度参数来绘制 . 区域显示有三种基本填充模式:具有颜色边界的空心区域,用实颜色填充的区域和用指定图案或设计填充的区域。在PHIGS程序中用下列函数选择基本填充模式: setInteriorStyle(fs) 填充模式参数fs的值包括空心、实心和图案。填充模式的另一个值是影线,它用选定的影线图案-平行线或交叉线来填充区域 空 实 图案
扫描线填充 P1(2,2) P2(5,1) P3(11,3) P5(5,5) P4(11,8) P6(2,7) E A B C D G F 0 1 2 3 4 5 6 7 8 9 10 11 x 1 2 3 4 5 6 7 8 y
扫描线填充 A B A C B A C C B 扫描线与多边形顶点相交时交点的取舍
不规则边界区域填充 边界填充 逐像素着色直至遇到边界色 泛滥填充 替换指定内部色
4.5 字符属性 字体:宋体 仿宋体 楷体 黑体 隶书 字高:宋体 宋体 宋体 宋体 宋体 字宽:宋体 宋体 宋体 宋体 宋体 4.5 字符属性 字体:宋体 仿宋体 楷体 黑体 隶书 字高:宋体 宋体 宋体 宋体 宋体 字宽:宋体 宋体 宋体 宋体 宋体 字倾斜角:倾斜 对齐 (左对齐、中心对齐、右对齐) 字色 下划线 ... 显示字符的外观由字体、大小、颜色和方向这些属性控制。属性既可以对整个字符串设置,也可对定义为标记符号的单个字符设置。 国际上最流行的字符集是“美国信息交换用标准代码集”(American Standard Code for Information Interchange)简称ASCII码。该字符集规定了128个字符代码。 我国除采用ASCII码外,还另外指定了汉字代码的国家标准字符集。最常用的是“信息交换用汉字编码字符基本集”GB2312-80。该字符集包括了6000多个常用汉字,以及英文字符、数字和其他图形符号。分成94个区94个位。
4.6 反走样 走样概念 反走样技术 受显示器物理特性的限制,在显示直线时,会出现梯形样的锯齿效果,如何减少这种失真现象,这是本节讲解的主要内容,虽然反走样技术已能通过图形显示卡使用硬件方式来实现,但必须让学生理解和掌握反走样技术
走样概念 走样的定义: 由于低频取样而造成的信息失真 图形数字化过程中,图形映射到光栅系统的 整数位置而产生的图形畸变。 增加光栅系统取样频率的简单方法: 提高分辨率
讲解清楚走样产生的原因 图中显示的不充分取样的效果。为了避免 这种周期型对象中丢失信息,必须把取样频率至少设置为出现在对象中的最高频率的两倍,这个频率称为Nyquist取样频率(或Nyquist取样率)fs: fs=2fmax 另一种解释是,取样区间不应超过循环区间(Nyquist取样区间)的一半。对于x区间取样,Nyquist取样区间Δxs为 Δxs=Δxcycle/2
反走样技术 思想 通过修改沿图元边界的各像素的亮度来平滑边界减小锯齿现象 类型: 过取样 区域取样 像素移相 增加光栅系统取样率的一种方法是提高分辨率。但即使用当前技术能达到的最高分辨率,锯齿形仍会在一定范围内出现。由于能将帧缓冲器做成多大并仍保持刷新频率在每秒30-60帧方面存在限制。而且要用连续参数精确地显示对象需要任意小的间隔。因此,除非硬件技术能发展到做成任意大的帧缓冲器,增加屏幕分辨率还不能完全解决走样问题 。 对于能显示两级以上亮度(颜色或灰度等级)的光栅系统,可以用反走样方法来修改像素亮度。通过适当地改变沿图沿边界的像素亮度,可以光滑边界以减小锯齿现象
过取样(或后滤波):在高分辨率下对对象特性取样并在较低分辨率上显示其结果的技术 把屏幕看成比实际所具有的更细的网格来增加取样率 沿这种更细网格使用取样点来确定每个屏幕像素的合适亮度等级 一种直截了当的反走样方法是把屏幕看成比实际所具有的更细的网格来增加取样率,而后沿这种更细网格使用取样点来确定每个屏幕像素的合适亮度等级。这种在高分辨率下对对象特性取样并在较低分辨率上显示其结果的技术称为过取样(或后滤波)。所显示的像素位置为覆盖屏幕有限区域的光斑,而非无限小的数学点。在线和区域填充算法中,每个像素的亮度是由对象边界上单个点的位置所决定的。用过取样方法,可从多个点对一个像素总体亮度的贡献来得到亮度信息。
区域取样(或前滤波):通过计算待显示每个像素被物体覆盖区域的多少来确定像素亮度 像素覆盖区域通过确定对象边界与单个像素边界的相交处而得到 像素移相:光栅显示系统上显示的物体可将像素区域的显示位置移动而实现反走样 通过与对象几何形状相关的电子束的微定位而作用
直线段过取样 思想 每个像素分为若干子像素; 统计沿直线路径的子像素数目; 每个像素的亮度等级正比于子像素数目 直线段的过取样可用多种方式完成。对于直线段的灰度显示,可把每个像素分成一定数目的子像素并统计沿线路径的子像素数目,而后将每个像素的亮度等级设置为正比于这个子像素数目的值
过取样___考虑有限尺寸的像素区域 像素点位置 亮度级别 (10,20) 3 (11,21) 2 (12,21) 2 (11,20) 1 (10,20) 3 (11,21) 2 (12,21) 2 (11,20) 1 (12,22) 1 22 21 如图,每个正方形像素区域被分成9个等大小的正方形子像素,阴影区域表示由Bresenham算法选择的子像素。因为任何像素中可供选择的子像素的最大数目是3,因此这种方法提供0以上3种亮度设置。因而,线亮度分布在较大数目像素上,并通过在阶梯状台阶附近显示有些模糊的线路径使阶梯形状得以改善。如要用更多的亮度等级来实现反走样,就需要增加每个像素中的取样位置数(子像素数目):16个子像素给出0以上4个亮度等级;25个子像素给出0以上5个等级,等等 20 10 11 12
过取样___考虑有限宽度的直线 22 21 20 10 11 12 总的线亮度分布在更多的像素上 在图的过取样例子中,我们考虑了有限尺寸的像素区域,但我们把线处理成具有零宽度的数学实体。实际上,显示的线具有大约与像素等宽的宽度。如果考虑直线的宽度,我们可设置象素的亮度正比于表示线段的多边形内部的子象素个数。如图 注:一个子象素的左下角坐标在多边形内部,则认为该子象素在多边形内部。 另一个优点 总的线亮度分布在更多的像素上。一个像素的效果可以来自其相邻像素。 假如有颜色显示,我们也可将此方法扩充来将背景色考虑进去。一特定的线可能穿过不同的颜色区域,我们可对子像素亮度进行平均来得到像素颜色设置。例如,一个像素区域内的5格子像素被确定在红线的边界内,而其余4个像素落在蓝色背景区域内,我们可将这个像素的颜色计算为 pixelcolor=(5*red+4*blue)/9 20 10 11 12
加权像素掩码 思想 赋给接近于像素区域中心的子像素更大的权值 3×3子像素网格的相对权值 1 2 4 在过取样算法的实现时,常给接近于像素区域中心的子像素更大的权,因为我们希望这些子像素在确定像素的整体亮度中起更重要的作用 图给出了3×3像素分割所采用的加权方案。这里,中心子像素的加权时角子像素的4倍,是其它子像素的2倍。,而后对子像素的每个网格所计算出的亮度进行平均。 指定像素的相对重要性的数组成为子像素权的掩模。也可为较大的子像素网格建立类似的掩模。同样,这些掩模常被扩展为包括来自属于相邻像素中子像素的贡献,以使亮度能遍及相邻像素而取平均。
直线段区域采样 思想 设置每个像素亮度正比于像素与有限宽度直线的重叠区域 如果子像素足够小,则子像素的总数近似等于覆盖区域。
直线段区域采样 例如:具有屏幕网格坐标(10,20)的像素的约90%被线区域覆盖,那么该像素的亮度就设置为最大亮度的90% 20 21 22 11 12 例如:具有屏幕网格坐标(10,20)的像素的约90%被线区域覆盖,那么该像素的亮度就设置为最大亮度的90% 通过将每个像素亮度设置成正比于像素与有限宽线的重叠区域,可完成对直线的区域取样。 例如:具有屏幕网格坐标(10,20)的像素的约90%被线区域覆盖,那么该像素的亮度就设置为最大亮度的90%。 计算区域覆盖多少:可用前面考虑有限宽度线段的过取样方法计算 对于彩色显示,则计算被不同颜色区域覆盖的像素区域,最后的像素颜色则看作为各覆盖区域的平均颜色
过滤技术 过滤技术是一种更精确的反走样方法。 类似于应用加权像素掩模,用一个连续的加权曲面(或过滤函数)覆盖像素,而不是一个离散的象素掩模。 用正方形、圆锥和高斯函数作为过滤函数 应用过滤函数的方法是将像素曲面集成来得到加权的平均亮度 为减少计算,常用查找表来求整数值。
可以用正方形、圆锥和高斯函数作为过滤函数。应用过滤函数的方法类似于应用加权掩模,但现在是将像素曲面集成来得到加权的平均亮度。为减少计算,常用查找表来求整数值。
像素移相 思想 微定位电子束到与实际位置更接近的近似位置 将电子束移动象素点直径的1/4,1/2或3/4,使描绘的点更接近直线的真实路径。 在对屏幕网格内的子像素位置编址的光栅系统上,可使用像素移相来反走样对象。将电子束启动到更接近由物体几何属性指定的近似位置,可光滑沿线路径或物体边界的阶梯。加入这种技术的系统被设计成,使单个像素位置可根据像素直径的小数部分来移动。特别地,电子束根据像素直径的1/4、1/2、3/4移动来画接近于线或物体编真实路径的点。有些系统也允许对单个像素的尺寸进行调整,作为分配亮度的附加工具。
直线亮度差的校正 现象: 光栅系统中,斜线比水平和垂直线暗 原因: 斜线沿线的像素点密度低于水平线和垂直线 调整方式: 为减轻阶梯效应,反走样线也为另一种光栅效果提供了校正,如图所示。用相同数目像素所画的两条线,对角线显得比水平线要暗、长。因为对角线以更低的单位长度亮度(单位长度像素的个数)显示。通过按照每条线的斜率来调整其亮度,画线算法就可对这种效果进行校正。水平和垂直以最低的亮度显示,而450线则以最高亮度显示,一旦反走样技术应用于显示,亮度就能自动校正。当考虑线的有限宽度时,像素亮度将调整,以便线以正比于其长度的整体亮度来显示
直线亮度差的校正 最低亮度 最高亮度