在基于扫描线的光栅图像处理器中跟踪深度的方法

文档序号:6485019阅读:611来源:国知局
专利名称:在基于扫描线的光栅图像处理器中跟踪深度的方法
技术领域
本发明通常涉及渲染图形目标,更具体地说,是涉及为了加速渲染而对图形目标的Z-级进行解析。
背景技术
光栅图像处理器是计算机图形领域的基本工具。光栅图像处理器(RIP)采集作为输入的几何图素或图元(primitives),并在光栅栅格上产生作为输出的像素(象素)值阵列。在此文件中,将考虑使用2D渲染系统。
两类重要的RIP是,基于目标(对象)的RIP和基于扫描线的RIP。这两类RIP的区别在于它们的内环不同,即,其算式迭代在哪一个实体上。基于目标的RIP迭代在它们必须渲染的所有图元上,而基于扫描线的RIP按光栅顺序迭代在将要渲染的每个扫描线上。
考虑轮廓、填充(fill)和渲染深度(即Z-级)彼此不同的一组多边形的渲染情形。基于目标的RIP一般按Z-级迭代在这组多边形上,从而依次渲染每个多边形。这就是“Painter’s算式”法。相反,扫描线RIP依次考虑每个扫描线,以便确定每个多边形的边缘在当前扫描线的何处。然后填充与当前扫描线相交的边缘之间的像素跨距。
基于扫描线的渲染系统的精彩之处在于,使用激活边缘目录。在这种方法中,扫描线RIP无需考虑每个扫描线上的每个多边形的边缘,而是仅仅保持与当前扫描线相交的那些边缘目录,并且一条扫描线接一条扫描线地跟踪那些边缘。此方法一般采用前向差分技术,其中以Bresenham’s扫描-转换算式的形式来跟踪这些边缘。
在开始渲染每个扫描线时,新的边缘可以添加到激活边缘目录中。分类在此处是重要的,因为它戏剧性地削减了需要考虑被添加到激活边缘目录中的边缘数。具体地说,整个这组边缘通常按起点的光栅顺序来分类。关于起点,我们指的是在整个光栅扫描中最先遇到的端点。这使得能够快速确定哪些边缘在扫描线起点变成激活的。在扫描线的终点,如果一个边缘被确定为不与下一个扫描线相交,那么就将该边缘从激活边缘目录中去除。
考虑上述RIP下的一般扫描线。如果与该扫描线相交的所有边缘的x-坐标都是已知的,并且需要输出该扫描线的光栅图像数据,则要解决的下一个问题是,确定交叉点之间的像素跨距的光栅数据内容。也就是说,按x-顺序邻接的交叉点之间的跨距,从光栅图像空间映射到图形模型空间中的一组多边形上。此方法允许RIP不处理抗锯齿。此方法隐含的是,重叠的多边形通过其深度来彼此区分。也就是说,在暴露于交叉点之间的跨距的一组多边形中,最上面的多边形如果完全不透明,那么在此跨距之上渲染的仅仅是此多边形。如果最上面的多边形不是完全不透明的(即包含一些透明度),那么下面的多边形将影响到此跨距。
扫描线渲染避免了需要屏幕(帧)缓冲器来聚集渲染结果,而这是基于目标(Painter’s算式)的渲染系统的典型特性和缺陷。然而,扫描线渲染系统通过考虑其如何解决上述问题,而具有进一步的特征。具体地说,一些扫描线渲染系统已经减少了从全屏缓冲器向下到扫描线缓冲器的需要,而其它扫描线渲染系统已经无需扫描线缓冲器,且能够直接渲染到下面的输出光栅数据缓冲器上。
考虑一些不同的行缓冲器RIP模型是适当的。首先,这些RIP保持光栅图像数据的行缓冲器。边缘按y-坐标(即扫描线)而不是按x-坐标(扫描线内的像素位置)进行分类,跨距以随机图案聚集在缓冲器内。即,跨距渲染的发生顺序与它们的x顺序无关。在这样的系统中,没有Z-级的概念,在Z-级中,当对像素进行写操作时,较高的灰度输出值优先于较低值。在当前扫描线的所有跨距聚集之后,按x-顺序将行缓冲器写到输出缓冲器。
在保持交叉点(而不是光栅数据)的基于扫描线的其它RIP中,发现上述RIP模型的变型。再者,边缘按y而不是按x进行分类。对于每个扫描线,确定所有的交叉点,然后利用x进行分类。换言之,保持交叉点的行缓冲器,而不是光栅数据的行缓冲器。然而,还要注意的是,交叉信息的行缓冲器按随机顺序进行聚集。
第三类基于扫描线的RIP既没有光栅数据的行缓冲器,也没有交叉信息的行缓冲器。通过在渲染之前对所有边缘进行完全光栅顺序分类,而避免这些情形。也就是说,通过始于x-坐标以及y-坐标,可对所有的边缘进行分类。当考虑扫描线的每个像素时,检查变成激活的边缘的边缘目录。
我们现在考虑,确定给定扫描线上的跨距的光栅数据内容的问题-即支持按深度分开的重叠多边形的所有扫描线渲染装置共有的问题。如上所述,一组恒定的多边形进行填充、按深度来排序、潜在地影响跨距。就出现多边形的填充和深度而言来考虑该问题,假设每个多边形具有一个继承多边形深度的填充。
在按x-顺序考虑跨距的系统中,当渲染一个跨距一个跨距地进行时,解决此问题意味着保持当前的激活深度表。一个跨距一个跨距的前进发生在与边缘交叉的任一像素上。也就是说,跨距是当前扫描线上的一个间隔,而这组当前的激活深度在当前扫描线上是恒定的。激活(active)意味着,贯穿与跨距相交的所有多边形的概念片段,包括所有激活深度(即影响最后的像素值的所有图形目标)。
这组激活深度允许确定一个跨距的光栅输出,如果这组激活深度按深度递减的顺序保持的话。如果不允许填充包括透明度,那么激活深度表头的填充将是最上面的并且是影响到此填充之光栅数据的唯一填充。如果允许包括透明度,那么与表中后面的深度有关的填充也可影响到光栅输出。
保持此当前激活深度表的问题的一种解决方案,存在于现有技术中。例如,构建为待渲染的页图像而存在的所有深度的完全状态表。此方法的特征是,深度存在于线性寻址存储器中,在该存储器中,深度被暗示在存储器中储存填充数据的位置,如果填充存在于该深度的话。换言之,有一整组狭槽点击器允许填充信息,每个深度一个,并且狭槽按深度顺序设置。将填充插入此表中是微不足道的,因为对于一个给定深度总有一个狭槽。然而,狭槽占据的图案一般是富余的。实际上,当考虑由边缘交叉点引用的填充和深度时,填充的深度用来给这个整个深度狭槽表作索引。这实质上是一个操作顺序,从而允许RIP以实时速度操作。
高速缓冲存储器,可称作总表,用来加速对这样的整个表的查寻。这一般是必需的,因为为一页而存在的深度总数可非常大。例如,一些实际PostScript打印渲染工作具有相当大的深度数。非常大尺寸的整个深度狭槽表的另一个结果是,此RIP模型的硬件实现不能经常将整个表保持在内部。此表因此必须保持在外部存储器中,因此引用起来较慢。如果存在比深度狭槽表所能聚集的深度多的深度,那么就以显著的额外复杂性为代价,来交换这些附表。
另外,具有这种模型的RIP不容易适合于动画,即在由填充占据的这组深度一个帧一个帧地改变时不适合应用。而且,如果动画渲染器的输入没有确定性,那么这组所占据的深度就也没有确定性。许多深度狭槽对于在特征帧上发现的填充来说不得不放弃。或者是,填充的深度从一个帧到另一个帧是不同的,但是在当前检查的这类已有技术的RIP中,填充与其相应深度紧密联系在一起。也就是说,填充通过占据某一存储器部位而具有默示深度。接着,重新指派的填充能够承担不需要的实质数据运动。
在合成的上下文中保持激活深度表时发现另一缺陷。将新的填充插入总表并不费事,因为它与此页上发现的所有深度狭槽表一样深,并且每个填充具有相应的待用狭槽。然而,当跨距将要合成时,此操作是昂贵的,因为总表非常大且经常稀少,而合成器需要考虑的这组填充通常比较小,并且是压缩的。实际上,在与状态表一样深的深度编码器中花费很多的复杂性和硅元素。此编码器然后利用由以上详述的深度所排序的这组激活填充的考虑过程,创建将要在所涉及的跨距上合成的一个压缩填充组。

发明内容
本发明的一个目的是,基本上克服或者至少改善现存布置的一个或多个缺陷。
按照本发明的一个方面,提供了一种扫描线渲染器中渲染像素跨距的方法,在扫描线渲染器中针对位于与图形目标图像的扫描线相交的两个相继x-顺序边缘之间的像素跨距渲染所述扫描线,对于每一所述跨距,该方法的特征在于,按深度顺序保持渲染过程中存在的一深度亚组,所述深度亚组是在所述跨距上的按深度顺序保持的那些深度,在相应的深度不再激活的情况下所述深度亚组被去除该相应的深度。
优选的是,这个深度亚组是利用内容可寻址的存储器来保持的。
按照本发明的另一个方面,提供了一种用于执行前述任一种方法的装置。
按照本发明的另一个方面,提供了一种包括计算机可读介质的计算机程序产品,所述可读介质具有记录在其上、用于执行上述任一种方法的计算机程序。


现在参照附图来描述本发明的至少一个实施例,其中
图1(a)-1(c)表示出子像素级的激活边缘确定;图2(a)-2(d)表示出子像素级的扫描线的边缘处理实例;图3是用于产生交叉信息的图23的步骤252的方法流程图;图4描绘出一种位像像素的产生方法;图5表示出修正的Bresenham’s算式的C语言源代码;图6是自底向上合成过程的流程图;图7表示出与图41的跟踪参数产生过程相关的贝塞尔(Bezier)曲线实例;图8描绘出图2实例中的子像素值的卷绕计数的复制;图9(a)、9(b)和图10表示出不同的合成情节;图11是图13的步骤113的流程图;图12(a)-12(d)提供了覆盖率和A缓冲操作的图形指示;图13是本文使用的合成方法的高级流程图;图14是表示Bresenham’s算式的操作的一个圆;图15是用于将排序的坐标组转换成排序的边缘组的图46的步骤465的流程图;图16(a)-16(c)表示出二维图素或图元是如何组合而形成图形目标的;图17(a)和17(b)表示出小图形(sprites)与变换矩阵之间的关系;图18(a)和18(b)表示出笔划(stroke)的端帽;图19表示出广义的椭圆;图20表示出确定在椭圆形下面的圆;图21是在交叉点处重新排序的激活边缘的实例;图22(a)和22(b)描绘出图56的边缘处理模块的数据流;图23是图24的步骤257的流程图,表示出一个扫描线的边缘处理;图24是一个帧的边缘处理的流程图;图25表示出梯度填充查寻的操作;图26表示出产生字形的交叉信息;
图27表示出多种不同的梯度跟踪参数;图28(a)和28(b)表示出端帽类型的多种不同的填充;图29(a)-29(c)分别表示出两种现有技术的误差扩散方法和图56的像素提取模块所用的误差扩散方法;图30是模块618的误差扩散过程(半调色)的流程图;图31(a)-31(c)表示出小图形与局部图形目标之间的Z-级关系;图32是用于确定梯度查寻表的索引的流程图;图33(a)-33(c)表示出用来产生图16的目标的左右填充;图34描绘出用于本发明的渲染系统的多种不同的图像空间;图35(a)-35(c)描绘出变形(morphing)过程中的几组坐标;图36(a)-36(c)表示出笔划路径的一个实例;图37是用于将像素输出到帧缓冲存储器的像素提取模块的工作流程图;图38(a)和38(b)是直接输出到显示器的像素提取模块的工作流程图;图39是像素生成模块的处理流程图;图40是产生输出颜色的像素流的处理流程图;图41是产生二次方程贝塞尔(Bezier)曲线的跟踪参数的流程图;图42是增量方法的径向梯度确定的流程图;图43(a)和43(b)表示出产生于非零卷绕、负卷绕和奇数-偶数填充规则的不同填充结果;图44表示出计算显示目录中的绝对深度;图45(a)和45(b)描绘出笔划接合的边缘管理;图46是利用变形、变换和笔划模块在每个有序坐标组上实施的处理的流程图;图47(a)-47(f)描绘出基数分类算式的操作;图48表示出子像素级的不透明度的影响;图49(a)-49(f)表示出笔划边缘的实例;图50(a)-50(e)表示出笔划和变换边缘的实例;
图51(a)-51(e)表示出笔划边缘的左右填充;图52(a)和52(b)表示出Z-级激活表的操作;图53(a)和53(b)表示出重新构建Z-级激活表的实例;图54(a)和54(b)是对于改变兴趣的Z-级,更新Z-级激活表的实例;图55是自顶向下合成过程的流程图;图56是按照本发明公开文本的瘦客户机(thin client)成像机的示意性方框图;图57(a)和57(b)表示出按照三个卷绕规则将S缓冲转换成A缓冲;图58是Z-级激活模块的工作流程图;图59表示出由Z-级激活模块保持的感兴趣的Z-级目录;图60是计算机布置的示意性方框图,所描述的一些布置就是根据它来实践的;图61(a)、61(b)和图62描绘出采用合成堆栈的自顶向下和自底向上的分段的合成方法;图63表示出添加到路径的离散部分上的不同笔划;图64表示出自顶向下合成的一种替换形式;图65A和65B描绘出贯穿扫描线的Z-级激活表的更新;图66表示出字形边缘的交叉信息的产生;图67表示出在y-坐标上将椭圆形片段分裂成片段单调;图68A-68C表示出图像帧的动画序列;图69A-69C表示出为了产生图68A-68C的动画序列而处理新的和静态边缘缓冲器的过程;图70表示出零交叉信息的S缓冲的更新;以及图71是与图58类似的流程图,但表示出Z-级激活模块从目录中删除几个级的操作。
具体实施例方式
内容表 绍1.1.坐标空间1.2.图形目标1.3.字形1.4.Z-级1.5.笔划1.6.变形2.驱动器模块2.1.小图形2.1.1.小图形变换矩阵2.1.2.图形目标及其深度2.2.显示目录2.2.1.帧的渲染2.2.2.图形目标和Z-级2.2.3.局部深度和绝对深度3.变换、变形和笔划3.1.变形3.2.变换3.3.产生边缘3.4.将笔划解析成边缘和Z-级3.4.1.笔划直边3.4.2.笔划弯曲边缘3.4.3.笔划接合3.4.4.笔划相等的或相反的边缘接合3.4.5.在路径终点产生端帽3.4.6.笔划与非笔划边缘之间的端帽3.4.7.不透明笔划的Z-级分派3.4.8.透明笔划的Z-级分派
3.4.9.笔划图素或图元的变换3.5.滤波3.6.产生边缘跟踪参数3.6.1.产生直边跟踪参数3.6.2.产生二次方程贝塞尔(Bezier)曲线跟踪参数3.6.3.确定符号3.6.4.产生椭圆弧跟踪参数3.6.5.产生字形边缘跟踪参数4.分类5.边缘处理5.1.输入和输出5.2.顶-级操作5.3.激活边缘跟踪5.4.边缘处理的实例5.5.将边缘转换成激活边缘和边缘余辉5.5.1静态边缘余辉5.6.激活边缘处理5.7.跟踪边缘5.7.1.跟踪直线5.7.2.跟踪二次方程贝塞尔(Beziers)5.7.3.跟踪二次方程多项式片段5.7.4.跟踪椭圆弧5.7.5.跟踪字形5.8.抗锯齿和交叉信息的产生5.8.1.产生字形的交叉信息5.9.交叉信息的实例5.9.1另一实例5.10.激活边缘和交叉信息的重新排序6.Z-级激活模块
6.1.有序的感兴趣的Z-级组6.2.Z-级激活模块中的控制流6.3.激活及去活Z-级卷绕计数6.4.有序的感兴趣的Z-级组-继续6.5.将新的Z-级添加到有序的感兴趣的Z-级组中6.5.1.将有序的感兴趣的Z-级组保持在硬件中6.6.处理流6.7.将S缓冲转换成A缓冲卷绕规则6.8.处理流,继续7.合成模块7.1.中间体7.2.Z-级填充7.3.基流7.4.图形概述7.5.影响计算7.6.自底向上的合成7.7.自顶向下的合成7.8.另一种合成方法7.9.自顶向下的优点8.像素的产生8.1.线性梯度像素的产生8.2.径向梯度像素的产生8.3.位像像素的产生9.像素提取9.1.输入数据9.2.输出到帧缓冲器9.3.直接输出到显示器9.4.半调色10.执行
1、介绍此文件描述一种瘦客户机成像机(TCIE),该机器是采用最少计算资源渲染2D图形目标的系统。可施加的源级实例包括便携式装置或那些具有小显示器的装置例如手持计算装置(包括手机和游戏)和办公设备例如打印机和复印机。TCIE系统699的顶级图在图56中示出,其中TCIE系统699是作为处理模块流水线构建的。每个模块以通过系统的数据流顺序来描述。模块在概念上在显示目录编译器608与渲染(机)器610之间划分。显示目录编译器608制备描述所需输出的信息,而渲染(机)器610利用该信息产生输出图像(例如渲染到显示器或帧缓冲器上)。TCIE系统699可用来产生一系列的暂时隔开的输出图像,这样的输出图像此后被称作“帧”。TCIE系统699的此用途产生在输出显示器上播放的动画(或“电影”)效果。
1.1.坐标空间参见图56,系统699的第一模块是保持图形目标集合以及有关它们的信息的驱动器模块615。图34描述了由系统699使用的空间。图34首先表示出在目标空间335描述的图形目标。其次,同一图形目标被表示出变换成全局逻辑空间336。接着,同一图形目标被表示出变换成渲染空间337,最后,同一图形目标被表示出变换成显示空间338。
从目标空间335到全局逻辑空间336的变换,是通过图形目标的位置变换而实现的。此位置变换可以是变换矩阵(随后将描述)的层级产品。从全局逻辑空间336到渲染空间337的变换,是利用将全局逻辑坐标转换成子像素(为了抗锯齿)的视见变换来实现的。从渲染空间337到显示空间338的变换,是通过用组成子像素产生显示像素的抗锯齿过程实现的。在一个一个抗锯齿的退化情形中,渲染空间337和显示空间338是同一个,即逻辑空间336直接被变换成显示空间338。
1.2.图形目标系统699内的输入包括一组图形目标和相关的元数据。图16(c)表示出渲染到显示器上的图形目标171,其相应的组成部分在图16(a)和图16(b)中表示出。图形目标是由一有序组的一个或多个下列制元描述的二维显示图元新的制图位置、直线和曲线。制素或图元描述图形目标的轮廓部分。每个图素或图元与一个或多个坐标相关。新的制图位置被规定为从目标原点的绝对偏移或相对于前一个图元终点的偏移。新的制图位置是用一个坐标来描述的,直线用一对坐标来描述,而曲线用三个坐标的序列来描述。直线用这对坐标来限定线的起点和终点。曲线是作为二次方程贝塞尔(Bezier)曲线来执行的,其中第一个坐标限定贝塞尔(Bezier)曲线的起点,第二个坐标限定一个控制点,第三个坐标限定贝塞尔(Bezier)曲线的终点。贝塞尔(Bezier)曲线是本领域技术人员众所周知的。
边缘坐标是作为一个有序的相对坐标组来储存的,这组坐标减少了存储器存储的需求并且还确定边缘的方向。需要提示的是,直线或曲线的第一个共坐标是前一个制元的最后一个共坐标。表1是可能形成图16(c)所示显示目标的一个有序的图元组实例。在此例中,Y坐标向下增大,X坐标向右增大。而且,新的制图位置、直线和曲线的项分别是MOVETO-ABS、MOBETO-RELL、INETO和CURVETO。此例的起点是(0,0)141。
表1

1.3.字形字形是特殊类型的图形目标,所具有的进一步的限制是,它们总是被直接绘制成显示空间。字形是为具有如下渲染形状的情形设计的(i)小,以及(ii)被设计成放置在精确的像素边界。
非常适合用字形表示的形状实例包括提示字体字符。
字形不用路径表示,而是用具有两个相关填充的每个像素1位的位图来表示。此位图向掩模那样起作用-当设定位数时,就显示“开通(on)”填充,当不设定位数时,就显示“关闭(off)”填充。
1.4.Z-级Z-级是显示图元,用来描述由一个图形目标边缘亚组围绕的显示部分是如何着色的。例如,Z-级描述用单色填充的闭合区域。Z-级还被指配给绝对深度,此绝对深度是用来规定哪个Z-级出现在哪个顶部的整数值。具有更高绝对深度的Z-级被渲染在具有更低绝对深度的Z-级顶部。
高达两个Z-级与直线和曲线制元相关,其中是被渲染到该图元制图方向左边缘的可能的第一Z-级,和被渲染到该图元制图方向右边缘的可能的第二Z-级。图33(a)-33(c)通过描述用来产生以前在图16(c)作为目标171看到的图形目标331的左右填充,而验证此概念。
图33(a)表示出制元316-329。图元316-329引用图33(c)所示的Z-级333,332,334。Z-级以绝对深度顺序表示出-即它们分别具有绝对深度2,3和4。表2表示出制元引用哪个Z-级。例如,LINETO 316被指引到页下部,并具有渲染到其制图方向左边缘的Z-级332。渲染结果如图33(c)所示。
表2

Z-级的样式可包括(但不限于)单色、用一个或多个颜色描述的线性混合、用一个或多个颜色描述的径向混合、或位像。所有这些Z-级样式还支持透明(α)信道。图33的Z-级333,332和334表示单色样式的Z-级。这些Z-级通过大多数流水线不变地来使用。
1.5.笔划制元与笔宽相关。具有一个笔宽的制元被转换成多个边缘(边缘没有宽度)。这些边缘形成表示笔划的封闭填充形状。关于详细论述,可参见题为“变换、变形和笔划”的部分。
1.6.变形变形在本领域内也是公知的。变形被定义为,向图形目标提供两组制元和一个比例,此比例规定,图形目标按照这两组之间的插值来绘制。这一点在题为“变换、变形和笔划”的部分还有更详细的描述。
2.驱动器模块以下就驱动器模块615处理的信息以及其将什么信息传递到渲染流水线的剩余部分这两方面,来论述驱动器模块615。驱动器模块615的作用是,组织制元集合。制元首先被集合成图形目标(如上所述)。
图形目标又被集合成小图形(如下所述)。这些小图形被规定为具有添加到整个集合中的特性。驱动器的首要作用是,对小图形进行有效的高级操作,而不会使剩余的图形流水线变得复杂。当驱动器模块615输出用于图形流水线中后序模块的制图信息时,小图形的特性就被添加到其每个图形目标的每个制元上(例如,其变换矩阵)。这允许后序模块仅仅处理所导向的边缘和Z-级。
2.1.小图形驱动器模块615将小图形作为其输入部分来接受。小图形在本领域内是公知的,并且在驱动器模块615中,它们是指具有变换矩阵、深度和存在于小图形上下文内的图形目标目录的图元。小图形可包含零或更多图形目标和零或更多其它小图形。关于“包含”,是指,将小图形的变换矩阵添加到可疑小图形所拥有的所有图形目标和小图形上。包含其它图元的小图形的概念还指,其包含的所有图形目标和小图形的深度局限于此小图形。图形目标不包含其它图形目标或小图形。
2.1.1.小图形变换矩阵变换矩阵在本领域内是公知的。小图形的变换矩阵添加到此小图形所拥有的所有图形目标上它限定此小图形的局部空间。在图17(b)中,提供两个小图形和两个图形目标,并且用树来描述它们的渲染方式。小图形185包含小图形189和图形目标180。也就是说,链接188和186代表所有权关系。小图形189又包含第二图形目标182。
图17(a)表示出存在于此例中的变换矩阵的几何形状。空间179包含小图形185之内的目标。看到目标180位于空间179内,由此目标180的组成制元的坐标是指空间179。图17(b)中的小图形189也位于此空间179中。空间181代表小图形189的图形目标所占据的那个空间。
在此例中,小图形189具有变换式,此变换式具有旋转、平移和比例换算。平移用点划线183表示,旋转用角度184表示,而比例换算用179和181(其轴用来分别代表小图形185和189)分割(divisions)的相对尺寸来表示。比例换算在此例中在两个轴上是一样的。
还是参见图17(a),描述一个小图形所拥有的图形目标的位置的变换矩阵,与描述此小图形的位置的变换矩阵并置。在图17(a)的实例中,添加到图形目标182上的变换矩阵与小图形189和小图形185的变换矩阵并置。目标182的这个合成变换矩阵添加到目标182包含的所有制元上。
2.1.2.图形目标及其深度图形目标的深度局限于包含目标的小图形。这一点在图31(a)-31(c)中示出。在图31(a)所示的渲染树中,节点294代表包含另一个小图形296和图形目标302的小图形。所属关系分别用直线295和301表示。296又包含图形目标298和299(分别如所属关系297和300所示)。表4提供了所有这些图元的局部深度。
表4

通过观察图31(a)中的子树外观,可阐明局部深度的概念。图31(b)表示出小图形296(是分别渲染的目标298和299)的可视外貌。由于目标298具有比目标299小的深度值,因此目标298出现在目标299之下。图31(c)表示出图形目标302和296的直观外貌。由于图形目标302具有更小的深度值,因此它出现在目标296之下。注意,根据局部深度图例304,来保存296的后代的局部深度。
节点303是宿主树的根部,并代表包含所有顶端小图形的小图形。根部303拥有总是在其最下面的局部深度(页是最下面的球形深度)的背景Z-级309。因此,此背景Z-级位于所有圆形目标之下。
2.2.显示目录一个帧的所有小图形和图形目标的目录,包括它们的所属关系、局部深度和变换,都被定义为显示目录。显示目录在本领域内是公知的。驱动器模块615保持树形的显示目录。此树就所属关系而言集合小图形和图形目标,并就局部深度而言进行排序。图31(a)还示出这种布置。例如,小图形294的后代按局部深度来排序;第一个后代302在最下面的局部深度1处,下一个后代296在更高的局部深度2处。
2.2.1.帧的渲染对于动画的每个帧,显示目录可以在渲染到显示器上之前进行修改。显示目录保留在帧与帧之间。
2.2.2.图形目标和Z-级恰恰在小图形能够引用多个图形目标时,图形目标可引用多个Z-级。这些每个Z-级在图形目标之内具有一个深度。例如图33(c)的图形目标需要具有如图33(b)所示深度的三个Z-级。
2.2.3.局部深度和绝对深度虽然局部深度是在驱动器模块615之内使用的,但是后一个模块需要绝对深度。驱动器模块615为每个Z-级指配一个绝对深度。
图形目标的Z-级的绝对深度从驱动器模块615到后一个模块,在此处它们被简单定义为深度应该理解,所有在后的深度都与已经被指配绝对深度的Z-级一起工作。这些指配恰恰是在渲染之前在一个帧一个帧的基础上实现的。如果新的显示目标或小图形已经插入显示目录或者旧的已经弃掉,那么就发生这样的现象。
如果图31(a)表示一个帧的所有图元,以上的表4表示出图31(a)中的所有图元的绝对深度。一个帧的所有Z-级的绝对深度始于1,这是指配给具体背景Z-级的深度。Z-级用从背景Z-级向上的相邻整数编号。注意,小图形本身并不具有绝对深度(尽管它们可以记录有关其后代深度的信息)。小图形是作为与它们所包含的绘制目标有关的信息(例如位置变换)的容器而存在的,但是并不绘制它们自己权限内的目标。渲染流水线内的随后模块不使用小图形。图形目标也不存在于驱动器模块615之外。图形目标的局部深度用来计算由构成图形目标的绘制图元所引用的Z-级的绝对深度。
当显示目录的内容将要渲染时,每个帧仅计算一次绝对深度。计算这些绝对深度的方法在表示出显示目录树的图44中示出。显示目录树的根部节点440拥有位于所有其它Z-级之下的背景Z-级441。也就是说,背景441具有最低的可能绝对深度1。节点432-439构成显示目录树的剩余部分。
绝对深度在树的第一深度遍历过程中被指配给每个图形目标的每Z-级(如点划线442所示)。绝对深度指配给图形目标的Z-级的过程从图形目标的最低Z-级开始着手,该最低Z-级将绝对深度指配给比紧接“前进”的图形目标的Z-级高的那一个Z-级。关于“前进”,意味着,图形目标是第一深度遍历过程中访问的前一个目标。在图44中,第一深度遍历过程被示出到达图形目标438。为了将绝对深度指配给目标438的最低Z-级,可以将绝对深度指配给比目标435中的最高Z-级高的、前一个图形目标所访问的那一个Z-级。
如果目标438还具有其它Z-级,那么它们是从下一个最低Z-级到最高Z-级的规定顺序的绝对深度。读数器将呼叫,所有的小图形和图形目标具有独自的局部深度范围,因此交错是不可能的。显示目录树中的每个节点储存一个绝对深度。图形目标储存其顶端Z-级的绝对深度。小图形储存其后代的顶端Z-级的绝对深度。树的遍历总是始于根部。
当仅仅部分显示目录已经由于节点的插入或去除而改变时,考虑到效率,对树进行最少的更新。在显示目录树的遍历过程中,绝对深度的更新仅从已经改变的第一节点开始进行。比此节点早(在遍历次序上)的图形目标的Z-级保留它们的有效绝对深度。在到达第一改变的节点之前,通过注意每个节点顶端的绝对深度,而实现对绝对深度的跟踪。当遇到第一改变的节点时,从此节点值开始绝对深度的指配。
例如,在图44中,如果目标438是显示目录树上的新节点,并且这是前一个帧之后的唯一变化,那么指配的绝对深度就从目标438开始。
3.变换、变形和笔划作为输入,图56的变换及笔划模块616从驱动器模块615采集一个或多个有序坐标组,所述坐标组共同限定出将要渲染的图形目标的一个或多个轮廓。每个有序坐标组可伴随有附加参数,包括-形态比-变换矩阵-笔划宽度-左手Z-级的引用-右手Z-级的引用,以及-笔划颜色Z-级的引用。
形态比、变换矩阵和笔划宽度参数其描述了描绘图形目标轮廓的有序坐标组是怎样位于显示器上的。其余参数是表示由有序坐标组限定的轮廓内的显示像素的颜色、混合或纹理的Z-级引用。
图46是表明模块616在每个有序阶式坐标组上实施的处理的流程图。此处理的目的是将每个有序阶式坐标组(例如,参见图16(a))转换成相应的有序边缘组,在此处,有序边缘组的每个边缘由渲染空间内的至少一个起点坐标和终点坐标描绘。也就是说,边缘具有方向性。对边缘所占有的Z-级的左右引用,是就方向性而言的。形态比、变换矩阵和笔划宽度参数用来控制此处理。
此外,模块616任选地接受一个或多个字形描述。这些描述包含以下信息-字形位置-字形高度和宽度-字形位图-“on”Z-级的引用(可能是NULL)-“off”Z-级的引用(可能是NULL)-字形描述进入阶段470的流水线。
3.1.变形如果模块616接收对应于形态目标(即在图46中,阶段464=是)的一个有序坐标组,那么就接收每个坐标的两个版本以及形态比参数。每个所接收坐标的一个版本被称作起始版本。每个所接收坐标的第二版本被称作终止版本。模块616利用形态比参数在阶段467插补每个所接收坐标的一个中间版本。例如,图35(a)和图35(c)表示出分别代表形态“起始”形状和形态“终止”形状的一个有序坐标组。这两个有序坐标组被示出起始和终止于“逻辑”坐标空间内的原点342。变形过程的目的是,通过在图35(a)的“起始”版本与图35(c)的“终止”版本之间进行插值,而产生如图35(b)所示形状的中间版本。每个坐标的版本(“起始”和“终止”)被表示为一个有序的坐标对组,在此例中,339和346是第一对,然后是343和340,344和347,最后一对是341和342。形态比用来插值来自每个坐标对的中间版本。如果用形态比0表示图35(a)的“起始”形状,而用形态比1表示图35(c)的“终止”形状,那么形态比0.25就对应于图35(b)中所示的形状。形态过程因此产生用350,351,352和353表示的一个有序坐标组作为输出。
3.2.变换其次,在图46中,在阶段468将变换矩阵添加到坐标上。变换矩阵允许待规定的坐标(以及因此描绘的目标)旋转、比例换算和/或平移。在此描述中,变换矩阵据说将坐标(以及因此描绘的目标)从“逻辑空间”变换成“渲染空间”。
3.3.产生边缘在有序坐标组已经变形(如果合适的话)并变换之后,图46的流程图中的后序阶段465将该有序坐标组转换成有序边缘组。如何可以实现阶段465的实例由图15的流程图给出。该实例假设,坐标能够形成三种绘制图元之一的一部分,这三种绘制图元是直线、二次方程贝塞尔(Bezier)曲线和新的绘制位置。该例还假设,提供附加信息(例如标签字节)来表示什么类型的绘制图元跟随着,以及何时到达绘制图元的终端。
首先,如图15所示,在步骤140当前的绘制位置在步骤140被初始化到(0,0),然后,在步骤124,125,126和127确定其次将要遇到的“跟随着的”绘制图元的类型。
如果上述类型表示,跟随的坐标描述一个新的绘制位置(步骤124),那么坐标就在步骤128读出,并用来在步骤131设定一个新的当前绘制位置。
如果上述类型表示,跟随的坐标描述一个直边(步骤125),那么就在步骤129产生新的直边,并且该直边具有等于当前绘制位置的起点坐标。然后在步骤132读出坐标,并且在步骤134这可用于新的直边终点坐标,在步骤136用于新的绘制位置。
如果类型表示,跟随的两个坐标描述(例如二次方程贝塞尔)曲线(步骤126),那么就在步骤130产生新的曲线,并且该曲线具有等于当前绘制位置的起点坐标。第一坐标然后在步骤133读出,并在步骤135用作新曲线的“控制点”坐标。第二坐标然后在步骤137读出,并在步骤138用作新曲线的终点坐标,在步骤139用作新的绘制位置。
处理继续,直到在步骤127到达有序坐标组的终点为止。
3.4.将笔划分辨为边缘和Z-级回到图46,处理的下一个步骤任选地在步骤471有用,并且是笔划步骤466。笔划是产生一个或多个轮廓的过程,以便模拟利用给定厚度的笔沿曲线和矢量路径追踪的效果。笔划实例在图50(a)-图50(e)示出。图50(a)表示出待笔划的一个三边缘523的有序组。所产生的笔划轮廓524参见图50(b),其提供了给定笔宽525的圆尖笔已经追踪待笔划的三个边缘的路径的效果。
虽然图46暗示,笔划步骤466必须在变换步骤468之后实施,但是也期望笔划可能发生在变换之前,以便产生不同的结果。例如,再参考图50(a),如果由边缘523描述的原始形状首先变换,从而产生图50(c)所示的形状526,然后进行笔划,那么结果将是如图50(d)所示的形状528。然而,如果由边缘523描述的原始形状首先笔划524,然后应用相同的变换,那么结果就变成图50(e)所示的形状527。TCIE系统699通过在笔划466之后任选地实施步骤468的坐标变换,可获得其中任一结果。
注意,随后的笔划论述假设,笔划是在具有正Y-轴的坐标系统中实施的,所述正Y-轴顺时针90度成为正X-轴(例如X增大到右边,Y向下增大)。
模块616通过迭代有序边缘组中的边缘,来笔划原始的有序边缘组。对于每个边缘,相应于已经对中并沿原始边缘路径追踪的圆尖笔笔划的左右延伸范围,产生新的左手边缘和右手边缘。椭圆形弧用来在两个连续的原始边缘之间产生接合,以及在没有形成闭合形状的原始有序边缘组的起点和终点产生端帽。如果有序边缘组的第一边缘的起点坐标等于有序边缘组的最后边缘的终点坐标,则有序边缘组仅仅闭合。
弧是作为目标空间中的圆弧放置的,然后经在后面部分描述的过程变换成显示空间中的椭圆弧。虽然此图元目前仅仅在内部使用,但是应该注意,弧容易暴露为对使用者有用的绘制图元。
3.4.1.笔划直边图49表示出由起点坐标474和终点坐标472描述的待笔划的直边473的一个实例。图49(b)表示出笔划直边473的所需结果,该结构包括左手边缘477和右手边缘478。
为了笔划直边,产生左法向矢量479,该矢量-具有与直边的方向逆时针成90度的方向,以及-具有等于笔划的一半笔宽的长度。
然后,利用直边坐标473,474(Xs,Ys)和472(Xe,Ye)以及左法向矢量479(Xn,Yn),计算左手笔划边缘和右手笔划边缘。
对于左手笔划边缘477,如下计算起点坐标(Xs_left,Ys_left)和终点坐标(Xe_left,Ye_left)Xs_left=Xs+XnYs_left=Ys+YnXe_left=Xe+XnYe_left=Ye+Yn通过从当前边缘的坐标中减去法向矢量,而产生右手笔划边缘478
Xs_right=Xs-XnYs_right=Ys-YnXe_right=Xe-XnYe_right=Ye-Yn3.4.2.笔划弯曲边缘图49表示出待笔划的弯曲边缘483。用起点480、控制点481和终点482来描述弯曲边缘(二次方程贝塞尔曲线或二次方程多项式片段-QPFs)。
图49(d)表示出为了笔划此边缘必须产生的两个左法向矢量487和488。这两个左法向矢量都具有等于笔划的一半笔宽的长度。这两个左法向矢量的第一个487与从起点480到控制点481的矢量逆时针成90度。这两个左法向矢量的第二个488与从控制点481到终点482的矢量逆时针成90度参照图49(e),产生具有起点493、控制点494和终点495的弯曲左手笔划边缘。左手笔划边缘(Xs_left,Ys_left)的起点493用平移480计算,弯曲边缘(Xs,Ys)的起点坐标用第一左法向矢量487(Xn1,Yn1)计算Xs_left=Xs+Xn1Ys_left=Ys+Yn1左手笔划边缘(Xe_left,Ye_left)的终点用平移482计算,弯曲边缘(Xe,Ye)的终点坐标用第二左法向矢量488(Xn2,Yn2)计算Xe_left=Xe+Xn2Ye_left=Ye+Yn2左手笔划边缘的控制点494用两个直线的交集计算。第一直线穿过左手笔划边缘的起点493延伸,并且平行于从弯曲边缘的起点480延伸到弯曲边缘的控制点481的直线。第二直线穿过左法侧笔划边缘的终点495延伸,并且平行于从弯曲边缘的终点482延伸到弯曲边缘的控制点481的直线。
同样产生弯曲的右手笔划边缘,如实例图49(f)所示,其中画出了起点503、控制点504和终点505。如下计算右手笔划边缘的起点坐标(Xs_right,Ys_right)和终点坐标(Xe_right,Ye_right)Xs_right=Xs-Xn1Ys_right=Ys-Yn1Xe_right=Xe-Xn2Ye_right=Ye-Yn2右手笔划边缘的控制点504用两个直线的交集计算。第一直线穿过右手笔划边缘的起点503延伸,并且平行于从弯曲边缘的起点480延伸到弯曲边缘的控制点481的直线。第二直线穿过右手笔划边缘的终点505延伸,并且平行于从弯曲边缘的终点482延伸到弯曲边缘的控制点481的直线。
图49(g)表示出相应于各个控制点绘制的左手笔划边缘514和右手笔划边缘515。
注意,以上所述的技术是笔划曲线的近似方法,并且不适合窄角曲线例如图49(h)所示的曲线520。在由曲线的起点517、控制点518和终点519形成的三角形中,控制角被规定为由(即相反)直线的接合起点517和终点519所对着的角度。如果控制角小于或等于120度,那么曲线被认为是窄角的。便利的实验是利用两个左法向矢量521(Xn1,Yn1)和522(Xn2,Yn2)的点积大小如果(Xn1Xn2+Yn1Yn2)2<1/2(Xn12+Yn12)*(Xn22+Yn22),]]>那么曲线就是窄角的。
用起点、控制点和终点描述的二等分二次方程贝塞尔(Bezier)曲线方法,在本领域内是公知的。被确定为窄角的弯曲边缘首先二等分成两个相等的弯曲边缘,然后再进行二等分,从而产生总共四条弯曲边缘。然后,利用以上所述的过程笔划外面的两个新边缘(不与原始窄角相邻的那些边缘)。利用本领域内公知的技术,将里面的两个新边缘向量化成近似直线的边缘的路径。然后,利用在第3.4.1部分所述的过程对此路径进行笔划。
3.4.3.笔划接合为了笔划路径边缘接合的区域,需要产生附加曲线。接合被规定为具有进入边缘和现存边缘。图45(a)表示出形成接合444的两个直边,其中边缘443由于该接合形成其终点而成为进入边缘,边缘445由于接合形成其起点而成为现存边缘。利用以上所述的过程,已经产生左手笔划边缘446和447,以及右手笔划边缘448和449。为进入边缘462的终端和现存边缘463的起点确定左法向矢量。首先考虑左侧,进行实验来确定,是否需要产生将进入边缘453的终端与现存边缘454的起点连接起来的接合的弯曲轮廓。如果具有分量(Xn1,Yn1)的左法向矢量462对于待笔划的进入边缘终端来说已经是已知的,而具有分量(Xn1,Yn1)的左法向矢量463对于待笔划的现存边缘的起点来说已经是已知的,然后,利用下面的实验确定产生弯曲轮廓的必要性如果Yn1Xn2<Yn2Xn1,那么弯曲边缘就用来链接笔划的左手边缘,直边就用来链接笔划的右手边缘。
同样,如果Yn1Xn2>Yn2Xn1,那么弯曲边缘就用来链接笔划的右边缘,直边就用来链接笔划的左边缘。
如果Yn1Xn2=Yn2Xn1,那么形成接合的边缘在接合处就具有相等或相反的方向。这样情形的过程在下面的第3.4.4部分中给出。
在图45(a)所示的实例中,上述实验表明,对于接合的左侧,必须产生弯曲边缘。此弯曲边缘是具有以下特性的精确圆弧-弧的起点和终点是点453和454;-弧的半径是左手矢量462的长度;-弧的中心是原始路径点444;以及-弧以顺时针的方式从起点前进到终点(如果处理接合的右侧,弧就逆时针行进)。
这些值用来产生椭圆弧边缘,其进一步的处理如下所述。
继续图45(a)所示的实例,以上实验标明,对于接合的右侧来说必须产生直边,以便链接第一右侧边缘451的终点与第二右侧边缘450的起点。
图45(b)表示出不同笔划路径的同一侧的边缘455和456不接合的情形。一个新的边缘产生,从相应的至高点460和461延伸,并围绕与边缘455和456相关的控制点或焦点452,图45(b)还表示出不接合的相应相对边缘457b和457a。一个新的边缘插入至高点458与459之间,以便使路径闭合。当此边缘对笔划填充的作用为零时,其是直边。
3.4.4.笔划相等或相反的边缘接合在以上笔划接合的技术描述中,描述了这样一个实验该实验用于显示,形成待笔划的接合的两个原始边缘何时具有相等或相反的方向Yn1Xn2=Yn2Xn1其中(Xn1,Yn1)是待笔划的进入边缘终端的左法向矢量,(Xn2,Yn2)是待笔划的现存边缘起点的左法向矢量。
另外,如果Xn2=Xn1,那么左法向矢量是相等的,因此进入和现存边缘在接合处具有相同的方向。无需附加边缘用于笔划接合。
如果Yn1Xn2=Yn2Xn1但Xn2≠Xn1,那么进入和现存边缘在接合处具有相反的方向,因此必须产生用于接合的端帽(如下所述)。
3.4.5.在路径终端产生端帽产生用于待笔划的未闭合路径端点的端帽。还得产生用于进入边缘和现存边缘的方向相反(如上所述)的两个边缘之间的接合的端帽。
该过程利用椭圆弧产生端点的端帽。笔划端帽的实例在图18(a)中给出,该图表示出待笔划路径的原始边缘192,其终止于点193。所绘制的左手笔划边缘195和右手笔划边缘200分别终止于端点196和198。表示出具有用于终止边缘端点的分量(Xn,Yn)的左法向矢量194。
为了产生端帽,放置具有以下特性的椭圆弧-弧开始于左手端点196,终止于右手端点198;-弧的中心是原始路径点193;-弧的半径是左法向矢量194的长度;以及-弧绕圆顺时针移动。
当笔划具有有效左侧Z-级引用和/或有效右侧Z-级引用(除了具有有效笔划z-水平引用之外)的路径时,这表示,被笔划的路径还形成部分待填充的闭合区域。对于这样的路径,必需将附加的两个直边添加到任何端帽中。
在这种情形下,产生新的具有分量(Xn_knee,Yn_knee)的左法向矢量199,以便使该矢量等于顺时针旋转90度的终止边缘的终点的左法向矢量。然后,利用终止点193(Xj,Yj)的坐标和具有分量(Xn_knee,Yn_knee)的新的左法向矢量199产生膝形(knee)坐标197(Xknee,Yknee)
Xknee=Xj+Xn_knee,Yknee=Yj+Yn_knee图18(b)描绘出始于膝点197、终止于待笔划的原始边缘的终止点193的附加两个边缘207a和207b。第一附加边缘207a是附加左手笔划边缘,第二附加边缘207b是附加右手笔划边缘。以下给出有关如何将Z-级引用指配给左手笔划边缘和右手笔划边缘的描述。
3.4.6.笔划与未笔划边缘之间的端帽当引用笔划填充的边缘在路径中被不引用笔划填充的边缘跟随时,也产生端帽。图28(a)表示出被部分笔划的三角形。顶点275是笔划边缘276接合未笔划边缘277的地方。端帽在顶点275产生。
利用与前述部分所示的相同方法(即用于在路径端部产生的端帽的相同方法)以及如下所述的其它步骤,构成此端帽。应用此方法的结果在图28(b)中详细示出。
考虑形状的内部填充,这是边缘278所引用的左侧填充。从其中可以看出,小端帽边缘280的加入确保了内部填充被闭合的边缘组完全限定。边缘279,280,282,278是闭合接合区域上的形状填充的那组边缘中的。没有在图中示出的其它边缘闭合不在接合内的区域中的填充。本领域内公知的是,填充形状的方法依赖于正在闭合的那些形状-特别是在卷绕规则和卷绕计数用来填充由边缘限定的区域时。
边缘278是图28(b)中示出的唯一边缘,其不是用笔划方法产生的,而是取自输入边缘组并包括在输出边缘组内。
3.4.7.不透明笔划的Z-级指配当有序坐标组作为输入提供时(并且该有序坐标组将形成笔划路径),那么除了左侧Z-级引用和右侧Z-级引用之外,还要求有效笔划Z-级引用和笔宽作为输入。用于笔划的Z-级格式与用来填充路径的Z-级之间是没有区别的。一旦有序坐标组已经被处理成有序边缘组,它们就可利用上述技术进行笔划。模块616产生一组左手笔划边缘和一组右手笔划边缘。如果模块616将左侧Z-级、右侧Z-级和笔划Z-级作为输入接收,并且笔划Z-级被确定为不透明的,那么所产生的左手笔划边缘被指配为
-引用作为输入接收的左侧Z-级的左侧Z-级引用;-引用作为输入接收的笔划Z-级的右侧Z-级引用;所产生的右手笔划边缘被指配为-引用作为输入接收的笔划Z-级的左侧Z-级引用;-引用作为输入接收的右侧Z-级的右侧Z-级引用;在这部分,左或右笔划边缘的引用是被笔划边缘外边界上的边缘的引用(正如追随边缘的方向所看到的)。在这一点上,当边缘从显示器的左上方指向显示器的右下方时,左笔划边缘出现在边缘的右侧。
当采用这种Z-级指配时,被笔划路径的原始边缘就被弃掉,并因此被所产生的左手笔划边缘和右手笔划边缘完全替代。
在图51(a)-51(e)表示出一个实例。图51(a)表示出用于以上给出的笔划方法并限定出闭合路径的一组输入边缘。边缘533,532和534都与左侧Z-级530、右侧Z-级531和笔划Z-级529相关。在不透明笔划的情形中,来自输入边缘533的笔划方法的边缘输出,在图51(d)中示出,并具有它们的Z-级指配。在图51(a)给出的笔划路径的直观结果,在图51(b)示出。
注意,所产生的左手笔划边缘535具有引用作为输入提供的左侧Z-级530的左侧Z-级引用538,和引用作为输入提供的笔划Z-级529的右侧Z-级引用539。而且,所产生的右手笔划边缘536具有引用作为输入提供的笔划Z-级529的左侧Z-级引用540,和引用作为输入提供的右侧Z-级531的右侧Z-级引用541。原始笔划边缘533被弃掉。
3.4.8.透明笔划的Z-级指配现在给出以上的另一种Z-级指配。该指配特别适合于具有笔划Z-级的有序边缘组的笔划,所述Z-级具有一定的透明度。在这种Z-级指配中,所产生的左手笔划边缘被指配为-无效的左侧Z-级引用,-引用作为输入接收的笔划Z-级的右侧Z-级引用;所产生的右手笔划边缘被分派为-引用作为输入接收的笔划Z-级的左侧Z-级引用;
-无效的右侧Z-级引用。
当采用这种Z-级指配时,并不弃掉原始边缘,即笔划过程的输出是原始边缘组、所产生的左手笔划边缘组和所产生的右手笔划边缘组的合并。原始边缘被指配为作为输入左侧z-级引用提供的左侧Z-级引用和作为输入右侧z-级引用提供的右侧z-级引用。
图51(a)表示出用于以上给出的笔划方法的一组输入边缘。边缘533,532和534都与左侧Z-级530、右侧Z-级531和笔划Z-级529相关。在透明笔划的情形中,由输入边缘533的笔划方法输出的边缘,在图51(e)中示出,并具有它们的Z-级指配。在图51(a)给出的笔划路径的直观结果,在图51(c)中示出。
注意,所产生的左手边缘542具有为空(null)的左侧Z-级545,和引用作为输入提供的笔划Z-级529的右侧Z-级引用546。原始边缘533没有弃掉,并具有引用作为输入提供的左侧Z-级530的左侧Z-级引用550,和引用作为输入提供的右侧Z-级531的右侧Z-级引用549。而且,所产生的右手边缘543具有引用作为输入提供的笔划Z-级529的左侧Z-级引用547,和引用为零的右侧Z-级531的右侧Z-级引用548。
图63表示出需要笔划并用许多定向边缘6302,6304,6306和6308形成的路径6300。正如所看到的,定向边缘从至高点6310,6312,6314,6316和6318延伸并与之接合。
在此例中,期望路径6300按照与每个定向边缘6302-6308相关的笔划宽度来进行笔划。关于这一点,注意,定向边缘6304和6306具有相同的笔划宽度和颜色,并由此,这两个边缘共同限定出单独一部分待笔划的原始路径6300。
如前述关于图18(a)和图18(b)所指示的,当笔划边缘端部时,可发生赝像现象。具体地说,如图63所示,在具有不同笔划宽度的边缘交叉(例如,在至高点6312和6316)的情形中,实质上,对于所有边缘都发生准确的笔划,从而可以从边缘信息中实施准确的合成。关于这一点,不同的笔划宽度可导致一个笔划合成在另一个之上,并由此在使用不透明笔划时能够提高真实误差。另外,当使用透明笔划时,可出现较不真实但还是实质性的误差。为了确保路径6300被准确笔划,必需确保,用路径6300的离散边缘部分形成的各个笔划路径能够准确再现。
这是通过识别笔划宽度改变的原始笔划路径6300的那些至高点,而最初实施的。从图63中看出,笔划宽度在至高点6312和6316改变。在所有其它至高点,笔划宽度是恒定的,并对应于将要产生的相应笔划路径的宽度。另外,对笔划宽度改变的至高点的识别,允许对没有改变的那些其它至高点(例如,顶点6314)进行准确笔划。利用适当识别的至高点,然后可产生原始路径6300的每个离散部分的单独笔划路径。对于由边缘6302限定出的第一离散部分,笔划路径6320和6322每个都源自于至高点6312,并指向位于定向边缘6302的延伸部6338上的顶点,并从至高点6310延伸。路径6320和6322围绕最高点6310的笔划,可以用图18(a)中所示的前述方式来实施。路径6320和6322围绕最高点6312的笔划,可以用参照图18(b)的前述方式来实施,并且注意,图63夸大了从至高点6312(比较,图18(b)中看到的边缘207a和207b)延伸的路径6320和6322。特别是,笔划路径6320和6322共同包封原始路径6300的相应离散部分(用边缘6302形成)。
对于和边缘6304及7306相关的笔划路径实施类似的方法。在此具体情形中,由至高点6312和6316限定出的路径的每一端,都结合对应于图18(b)中前述部分的布置。与边缘6308相关的笔划路径6328和6330以与边缘6302类似的方式来产生。显然,在每个这些实例中,要求笔划路径越过所识别的位于笔划宽度改变的路径上一点的至高点。
现在参照图51(b)或51(c)来理解图63的布置,图中示出了闭合路径。图63的布置能够使结合离散部分的闭合路径进行笔划,从而路径的内部能够利用以前参照图51(a)-51(e)描速的负卷绕规则和填充规则进行准确填充。以这种方式,用限定出具有左右填充的笔划路径的边缘替代原始路径边缘的前述方法,可用来限定闭合路径的内部及其笔划部分和内部的随之而来的填充水平。
3.4.9.笔划图元的变换如果在渲染空间内实施笔划,那么由笔划模块产生的线、贝塞尔(Bezier)曲线和弧就无需变换。然而,如果在目标空间内实施笔划,那么这些图元必须经历与形状的原始边缘相同的变换。
笔划线和贝塞尔(Bezier)曲线以与形状线和贝塞尔(Bezier)曲线类似的方式进行变换(如3.2部分所论述的)。另一方面,当将仿射变换施加到圆弧上的结果是广义的椭圆弧时,笔划端帽和接合必须经历一个单独过程。
广义的椭圆弧在图19中示出。用主轴208、小轴209、中心点215和旋转角度210来描述下面的椭圆211。通过进一步设置起点Y坐标213、终点Y坐标214和片段方向(顺时针或逆时针)来充分描述位于此椭圆上的椭圆弧片段212。在椭圆形片段212的情形中,方向是逆时针的。
有几种从下面的圆和变换中找回椭圆形坐标的方法。一种方法是找出以下公式的两个解modπtan(2θ)=2ab+2cda2-b2+c2-d2]]>其中Γ=abcd]]>是变换矩阵的非平移部分。
然后通过以下公式给出归一化主轴和短轴矢量(相对于椭圆的中心并且对于一个单元圆来说)θ的两个解答A=Γcosθsinθ]]>这些归一化轴(或其倒转)之一A’位于第一象限中。此轴矢量的长度与预变换的圆的半径相乘得出变换后椭圆的主轴长度。此轴矢量与水平线所成的角度给出椭圆的旋转。另一个轴的矢量长度与圆的半径相乘给出椭圆短轴的长度。
通过将使用者提供的变换施加到圆的中心,而找出椭圆的中心。通过将这个同一变换施加到原始圆的起点和终点坐标上,而找出椭圆弧的起点和终点坐标。
使用者提供的变换有可能一维反置。如果是这种情况,那么弧片段的方向就必须改变。为了测试变换是否反置,要充分采集矢量 和 将Γ施加到其中,并确定从所得到的矢量的水平线开始的旋转。这两个矢量将内切小于180°的一个角度。如果Γ10]]>在此角度逆时针的那一侧,那么变换就是反置的;否则就不是。
3.5.滤波就起点坐标(Xs,Ys)、终点坐标(Xe,Ye)、(仅对于曲线来说)附加控制坐标(Xc,Yc)而言在已经产生描述边缘的坐标之后,下一个过程就是弃掉明显不影响输出帧的边缘,这是在图46中看到的滤波过程470。在处理的这个阶段,边缘的所有坐标都在“渲染空间”内(因为它们已经发生变换),并因此能够直接与显示器的边界坐标进行比较。例如,如果帧具有w宽度和h高度,用(0,0)描述的帧的左上方以及用(w-1,h-1)描述的帧的右下方,那么就能够安全地对直边进行滤波(即弃掉),如果(Xs>=w)和(Xe>=w)//偏离到右边或(Ys<0)和(Ye<0) //偏离顶部或(Ys>=h)和(Ye>=h) //偏离底部为了进行滤波,对字形进行处理,好像它们是从字形的左上方的角落伸展到右下方角落的直边。
曲线(具有附加的控制坐标)的类似实验是(Xs>=w)和(Xc>=w)和(Xe>=w)//偏离到右边或者
(Ys<0)和(Yc<0)和(Ye<0) //偏离顶部或者(Ys>=h)和(Yc>=h)和(Ye>=h)//偏离底部也对水平的(即Ys=Ye)直边进行滤波。
应该注意,并不弃掉完全偏离到显示器左边的边缘,这样的边缘确实影响显示器的输出。
3.6.产生边缘跟踪参数在图46中,以下过程469的目的是,将边缘转换成修改的表达形式,这种形式可包括跟踪参数的计算。此修改的表达形式更适合后序模块的处理,并且这种修改的表达形式至少包含-起点坐标(X,Y),-左侧Z-级的引用和/或右侧Z-级的引用,-终点Y坐标,以及-跟踪参数。
术语“跟踪参数”在本文中用来描述一个或多个这样的参数这些参数允许边缘的X坐标相对于Y的单位增量进行增量计算,除非表明相反的意图。例如,可以用起点坐标(Xs,Ys)、终点坐标(Ye)和ΔX项(代表X坐标相对于Y坐标(即梯度)中的单位阶变化的改变)来描述直线。ΔX项是边缘的单个跟踪参数。
因为TCIE系统699总是从左上方渲染到右下方,所以需要规定边缘(直线或曲线),以便它们具有大于起点Y坐标的终点Y坐标。通过比较起点和终点Y坐标并交换起点和终点坐标(如果合适的话),可确保这一点。如果交换起点和终点坐标,那么还必须交换左右侧Z-级引用。
3.6.1.产生直边跟踪参数已经表明,直线能够用作为跟踪参数的ΔX项来描述。然而,经常要求ΔX包含分数数据。作为用浮点或固定点格式代表ΔX的一种替换形式,更准确的表现形式是,储存梯度的整数部分和剩余部分。
在软件的实现中,此过程可以用C语言编码来实现,以计算梯度的这两个部分Grad=(Xe-Xs)/(Ye-Ys)Ient=(Xe-Xs)%(Ye-Ys)其中(Xs,Ys)是边缘的起点坐标,(Xe,Ye)是边缘的终点坐标。
对于以适当形式准确描述的边缘,提供以上的Grad和Ient项,以及起点坐标(Xs,Ys)、终点Y坐标(Ye)、左右侧Z-级引用和附加的左标志(Left flag)(Boolean值),其中Left flag=TRUE 如果(Xe<Xs)=FALSE如果(Xe>=Xs)3.6.2.产生二次方程贝塞尔(Bezier)曲线跟踪参数对于每个曲线,图46的步骤465如上所述产生-起点坐标,-控制坐标,以及-终点坐标。
由于曲线的坐标已经变换(在处理该步骤468中的相应有序坐标组的过程中),因此曲线的坐标与“渲染空间”中的位置有关。图7表示出用由原点(代表动画61的帧的左上方)和X及Y轴(分别为63和62)表示的渲染空间中的起点坐标58、控制坐标59和终点坐标60代表的贝塞尔(Bezier)曲线实例。现在参照图41来描述起点坐标58(Xs,Ys)、控制坐标59(Xc,Yc)和终点坐标60(Xe,Ye)产生二次方程贝塞尔(Bezier)曲线的跟踪参数的过程。
在图41中,第一步骤403用于测试起点、控制和终点坐标共线的情况。如果是这种情况,那么控制坐标就忽略,并将边缘的跟踪参数象在步骤404中针对直边描述的那样来计算。
下一个步骤405检查二次方程贝塞尔(Bezier)曲线,看看在Y中是否是单调的(也就是说,对于每个Y轴,曲线贯穿的仅有一个相应的X坐标)。例如,图7中的贝塞尔(Bezier)曲线在Y中明显是非单调的。要求这样的非单调二次方程贝塞尔(Bezier)曲线用两个在Y中单调的等效弯曲边缘来描述。以下的逻辑用来确定用起点(Xs,Ys)、控制点(Xc,Yc)和终点(Xe,Ye)定义的二次方程贝塞尔(Bezier)曲线是否需要两个弯曲边缘如果操作数是正的话,sign()即回送Boolean值TRUE的函数(如果操作数为负则为FALSE),并且如果(sign(Ys-Yc)=sign(Ys-2Yc+Ye))和(|Ys-Yc|<|Ys-2Yc+Ye|)那么贝塞尔(Bezier)就需要两个弯曲边缘。
在确定需要相关弯曲边缘的情形中,用以下公式计算原始非单调贝塞尔(Bezier)上的点(Xsplit,Ysplit)Xsplit=Xs(Ye-Yc)2+2Xc(Ys-Yc)(Ye-Yc)+Xe(Ys-Yc)2(Ys-2Yc+Ye)2]]>Ysplit=YsYe-Yc2Ys-2Yc+Ye]]>然后,利用以下边缘在步骤409产生代表原始非单调二次方程贝塞尔(Bezier)的两个单调的弯曲边缘-第一弯曲边缘,具有-起点坐标=原始非单调二次方程贝塞尔(Bezier)的起点坐标(Xs,Ys),以及-终点坐标=(Xsplit,Ysplit);以及-第二弯曲边缘,具有-起点坐标=(Xsplit,Ysplit);以及-终点坐标=原始非单调二次方程贝塞尔(Bezier)的终点坐标(Xe,Ye)。
已经显示,要求规定边缘(直线或曲线),以便它们具有大于起点Y坐标的终点Y坐标。通过在步骤406比较每个曲线的起点和终点Y坐标并在步骤410交换起点和终点坐标(如果合适的话),现在可以确保这一点。如果交换起点和终点坐标,那么还必须交换左右侧Z-级引用。
如果曲线部分在正在渲染的帧之上(即,它具有小于0的起点Y坐标Ys,其中Y=0代表帧的顶部),那么下一个步骤407就进行“裁剪(夹制)”曲线的工作。用以下公式确定最顶部的坐标Ytop=max(0,Ys)其中max(a,b)是回送两个操作数a或b中的最大数的函数。
下一个实验确定,对于每个曲线来说,是否需要将曲线作为二次方程多项式片段(QPE)来描述。在求解后序的二次方程时需要避免被零除。如下给出在步骤413实施的基于起点、终点和控制点的对此情形的快速实验Ys+Ye=2Yc,意味着曲线是QPF。
如果确定曲线是QPF,那么就在步骤411产生三个跟踪参数A、C和D。这些参数得自于曲线的起点、终点和控制点以及最顶部的坐标Ytop,如下所述给定的中间值Ai=Ye(XsYe-XcYs)+Ys(XeYs-XcYe)(Ye-Ys)2]]>Ci=(4XcYc-2XsYe-2XeYs)(Ye-Ys)2]]>Di=(Xs+Xe-2Xc)(Ye-Ys)2]]>然后由此得出A,C和DA=Ai+CiYtop+DiYtop2C=Ci+Di(2Ytop+1)D=2Di如果在步骤413确定,曲线不是QPF,那么就在步骤408产生跟踪参数A、B、C和D。A、B、C和D通过以下计算得自于起点、终点和控制坐标以及最顶部的坐标Ytop使Xg=Xs-XeYg=Ys-Ye
Xh=Xc-XeYh=Yc-YeYterm=Yg-2Yhmix=XgYh-XhYg然后B=Xg-2XhYterm2]]>A=2mix×YhYterm2+B(Ytop-Ye)+Xe]]>D=Yterm×mix2Yterm4]]>C=mix×Yh2Yterm4+D(Ytop-Ye)]]>3.6.3.确定符号参数A、B、C和D被随后的过程采用,以便利用如下方程跟踪二次方程贝塞尔(Bezier)曲线的X坐标x=A±2C]]>在制备跟踪参数的过程中图41的最后步骤412确定,方根项是应该添加到A中还是应该从其中减去。基于A,Xs,Ys,Xe,Ye和D使用下面的伪码,其中结果“符号=+1”表示添加方根项,“符号=-1”表示减去方根项如果(A>0)符号=-1;另外如果(A<0)符号=+1;另外{如果(Ys<Ye)符号=-1;另外符号=+1;如果(D<0)符号=-符号;如果(Xs<Xe)符号=-符号;}
3.6.4.产生椭圆形弧跟踪参数对于每个弧来说,步骤466(以上参照图46所描述的)产生-椭圆的长轴和短轴半径‘a’和‘b”;-(轴a的)与水平所成的椭圆角‘θ’-椭圆的中心(x,y)-弧的起点和终点坐标(xs,ys)和(xe,ye);以及-左右侧Z-级引用。
可以将椭圆描述成仅相对于Y扭斜、仅相对于X比例换算的圆。因此,为了简化椭圆的跟踪,TCIE系统699将所有的椭圆作为变换圆来处理。
计算跟踪参数469的第一步骤必须在转换椭圆边缘用于确定圆位于椭圆之下时实施。图20证实了此过程。椭圆216通过扭斜系数与直线椭圆217相关。此扭斜的幅度是线218的梯度,线218不是216的轴,而是从椭圆的最低端到最高端的线。
此线的高度(从最低点到中心)用以下公式来计算h=b2cos2(θ)+a2sin2(θ)]]>此线的宽度(也是从最低点到中心)由以下公式给出w=cos(θ)sin(θ)(b2-a2)h]]>扭斜‘e’因此是 椭圆217然后转换成具有高度h的圆219。通过将以下的比例因子施加到椭圆217上,可简单地实现这一点f=h2ab]]>对于宽度相比长度很大(即a>>b,且θ较小)的椭圆来说,变换所产生的圆并不能给出足够的分辨,并且所合成的椭圆出现斑驳。此问题可通过超采样(即跟踪半径大得多的圆)来解决,并将几个线的结果在变换之前一起相加。
用于确定超采样的圆的尺寸的保守方法是,继续使比例因子(初始化到1)加倍,同时a>2*比例*b。此方法假设,a>=b,-90<θ>90,并且如果需要的话则-45<θ>45。
如下所述,利用Bresenham圆算法的修正来跟踪圆。由于实时目标渲染的性质,仅操纵在Y坐标上单调地增大的片段。因此,由图46的步骤469实施的第二步骤将横穿椭圆的上顶点或下顶点的片段分裂成两个或更多个片段。
此处描述这种分裂的一种可能的执行方式。首先,通过施加扭斜‘e’和比例‘f’,将椭圆的起点坐标和终点坐标转换成圆的起点坐标和终点坐标。其次,执行下面的算法。此算法接受起点和终点(S)和(E)以及方向(d)(顺时针或逆时针)。进一步的输入是,分别由(xc,yc-h)和(xc,yc+h)给出的圆的最顶点(T)和最底点(B)。该算法产生包括起点y坐标、终点y坐标和圆‘侧’(左侧或右侧)的片段目录。
考虑图67,在步骤6701将S和E的x坐标比作圆中心的x坐标(xc,yc)。如果S和E位于相反的两侧,那么就在步骤6702进行测试,看看是否横穿圆的顶部或底部。该测试为是否S位于左侧,d是顺时针的,或者是否S位于右侧,d是逆时针的?如果是这样,圆的顶部就被横穿,并且输出如在6703所表示的(T-->S,T-->E)。圆的侧面从分段最低点的那一侧开始跟随,于是对于6704中所示的情形,输出将是(T-->S(L),T-->E(R))。在图67中,6704和6705是对称关系的可能的布置。在此处讨论的其余部分,应该理解,每个输出将继承片段最低点的那一侧。如果在步骤6702,测试表明,圆的底部被横穿,那么输出就在6706显示,并且在6707和6708看到可能的布置。如果在步骤6701,S和E被发现在圆的同一侧上,如果E象在步骤6709所确定的那样是在S之上,那么片段的终点和方向就象在步骤6710显示的那样进行交换,借此使进一步的考虑简化。
继续S和E在圆的同一侧的情形。在步骤6711确定S和E是否横穿T和B。条件是是否S和E位于左侧,d是顺时针的,或者是否S和E位于右侧,d是逆时针的。如果是这样,正如在6712所显示的,输出是(S-->E),并且在6713和6714示出可能的布置。如果不是这样,如在步骤6715所显示的,输出是(T-->B,T-->S,E-->B)。在这种情形下,T-->B分段将位于S和E的相反侧。可能的布置在6716和6717示出。
3.6.5.产生字形边缘跟踪参数用TCIE系统流水线699的下部将字形处理成规定的边缘。结果,笔划变形及变换模块616得将字形描述转换成边缘描述。
TCIE系统699跟踪字形的右边缘而不是左边缘。结果,如果(Sx,Sy)在提供给笔划变形及变换模块616时是字形的左上方的坐标,W是字形的宽度,H是字形的高度,那么-字形边缘的起点坐标是(Sx+W-1,Sy);-左侧Z-级引用被设定为“内”Z-级;-右侧Z-级引用被设定为“外”Z-级;以及-终点Y坐标是Sy+H。
字形专用的跟踪参数包括代表字形的位图和字形宽度。
4.分类将变形、笔划及变换模块616产生的那组边缘提供给图56中的分类模块617。分类模块617将这些边缘重新排序,以便这些边缘首先按照Y轴的上升值、其次按照X轴的上升值进行排序(即,边缘在Y轴上是严格进行分类的;在共享Y值的每个边缘亚组内,在X轴上对它们进行分类)。对于边缘来说,以这种方式排序是必要的,从而渲染过程的后序阶段能够以像素顺序来完成。像素顺序是指,一次一个像素地实施渲染,始于屏幕顶部左侧的像素,并且从左向右的行进在向下步进到下一个像素线之前,横穿每个像素线,也就是说,被处理的最后一个像素是平面底部右侧的像素。像素顺序的渲染无需传统渲染系统所用的随机存取帧存储器,从而减少了存储器的使用,使渲染速度典型增大。本领域的技术人员应该明白,本文所用的关于X和Y轴的方向和优先级的惯例,对于任何其它(但是正交的)惯例来说,是可以互换的,而不会损害描述系统699的操作。
分类模块617利用公知的基数分类算法来完成它的功能。基数分类算法通过对一组要素执行部分分类序列,而对其进行分类。每个部分分类都是通过相对于每个要素的仅仅一部分分类索引进行分类而执行的(在每个阶段使用的分类索引部分具有等于基数的对数的位数长度)。这部分分类索引用来选择哪一个分类二进制将要素置于其内。所要求的分类二进制的数目等于基数的数目(即,所要求的分类二进制的数目等于每部分分类索引可表现的可能值的总数)。当要素置于每个分类二进制中时,它们预先存在的顺序就保持在每个分类二进制内,同时穿过二进制断开,这样确保后面的部分分类不取消前面的部分分类所执行的有用分类工作。在每个部分分类结束时,所有二进制的内容都按序连接在一起,从而将正在分类的这组要素重新分成(新的)简单序列。第一部分分类与分类索引的最低有效二进制一起工作,同时后面的部分分类与分类索引的逐次更有效部分一起工作。
基数分类算法在图47(a)-47(f)举例说明。
图47(a)表示出需要分类的10个要素序列。每个要素具有二位数的八进制分类索引。注意,八进制数字“0、1、2、3、4、5、6、7”用符号“A,B,C,D,E,F,G,H”代替,以避免与附图数混淆。
图47(b)表示出将基数八分类的第一阶段用于图47(a)所述的要素序列。采用八分类二进制,并按照其分类索引的第一部分将要素置于这些二进制中。用于此第一部分分类的分类索引部分是最低有效的三位(想起,基数R的分类与位数长度等于R的对数的分类索引部分一起工作;在此情形中为三位)。分类索引的最低有效的三位对应于其最低有效的八进数位,从而第一部分分类能够被描述成对要求分类的要素序列的遍历,将每个要素分配到与要素分类索引最右侧的八进数位对应的分类二进制中。
图47(c)表示出分类的第二阶段。在此阶段,所有八个分类二进制的内容都连接起来,从第一二进制的内容开始,依次行进,直到最后的二进制为止。这导致产生新的要求分类的十个要素序列。注意,这个合成序列相对于最右侧的八进数位正确排序;但是相对于最高有效的八进数位不正确排序。
图47(d)表示出分类的第三阶段。此阶段是第一阶段的重复,但是输入序列是图47(c)描述的序列,所用的分类索引部分是第二个三位,即左手八进数位(最高有效的八进数位)。由于这部分分类索引包括最高有效的二进制,因此这部分分类阶段是所要求的最后一个。此阶段能够被描述成对要求分类的要素序列的遍历,将每个要素分配到与要素分类索引最左侧的八进数位对应的分类二进制中。
图47(e)表示出分类的第四阶段。此阶段是第二阶段的重复,但是分类二进制的内容已经改变,现在是图47(d)所描述的。所有八分类二进制的内容再次连接起来,从第一二进制的内容开始,依次行进,直到最后的二进制为止。这导致产生另一个新的要求分类的十个要素的序列。这个合成序列相对于最左侧(最高有效)的八进数位正确排序,但是相对于最右侧(最低有效)的八进数位不正确排序。然而,注意,在共享同一个最左侧八进数位的此新序列的后面序列内,最右侧的八进数位的顺序是正确的。因此,这个新的序列按照分类索引进行正确排序。为了清楚起见,该序列在图47(f)中重新画出。
图47(a)-图47(f)例举了十个要素序列的基数八分类,其中每个具有六位的分类索引。基数分类算法的原理扩展到两个基数的其它整数幂、其它分类索引尺寸和其它序列长度,对于本领域的技术人员来说是显而易见的。注意,较大的基数尺寸减小了所需的部分分类的数目(所需的部分分类的数目等于分类索引的位数大小除以基数的对数,取整)。较小的基数尺寸减小了所需的分类二进制的数目(所需的分类二进制的数目等于基数的数目)。对于具体的分类任务,基数大小的选择涉及到分类速度与分类二进制消耗的内存之间的平衡,于是最佳的基数大小将随着操作环境的不同而改变。
在将基数分类算法施加到正在描述的图形渲染系统中时,所用的分类索引是通过并置边缘起点的X和Y坐标而形成的。X坐标在Y坐标之后进行并置可确保分类操作首先在Y轴上进行分类,其次在X轴上进行分类。边缘在如此分类之后,可容易地完成所需的像素序列渲染。
为了允许抗锯齿,渲染系统610可以描述具有子像素准确度的边缘坐标。抗锯齿在本文件的其它地方进行详细描速,但是在此处提到它是因为边缘坐标的表现形式影响分类操作。执行分类,以便使像素序列的渲染容易进行,于是在产生分类索引时弃掉边缘坐标的子像素细节。在坐标用定点表现形式(其中子像素的准确度包含在分数中)来表现的情形中,利用等于分数数目的多位数字,通过将这些坐标右移,可容易地实现这一点。
简单的优化在某种程度上可加速基数分类运算的操作。此优化涉及到用前一模块(变换、变形和笔划模块617)的操作覆盖分类模块617的操作。在严格分离这些模块的操作的未优化系统中,可如下描述这些模块的相互作用。变换、变形和笔划模块616产生一组边缘。产生这些边缘,而无论什么次序对于变换、变形和笔划模块616来说都是便利的,并且这些边缘以该次序被并置到序列中。当此边缘序列完成时,就将其提供给分类模块617,以便一同用于基数分类。拥有上述优化的系统修正这些模块的相互作用(如下文所述)。变换、变形和笔划模块616产生边缘(如前所述),但是不对它们进行并置。取代边缘并置的是,直接将这些边缘提供给通过应用第一部分分类来处理它们的分类模块617(即,按照边缘的最低有效位,将其分布到分类二进制中)。在变换、变形和笔划模块616完成将边缘提供给分类模块617的操作之后,执行后序的部分分类操作。此优化是可能的,因为当需要分类的一组目标正在发育时,基数分类的第一部分分类可以在“飞行上”执行,同时在这组目标敲定之后,仅仅执行后序的部分分类。
5.边缘处理正如在图56中可看到的,显示目录编译器68的输出是在屏幕上描述所需输出(单个帧的)的一个有序边缘组。渲染(机)器610将这些有序边缘组作为输入来采集。注意,双缓冲器609可用来允许渲染(机)器610处理一个帧的边缘,同时显示目录编译器608制备后续帧的边缘。
5.1.输入和输出通过渲染(机)器610的显示数据流始于边缘处理模块614的操作,它的数据流参数汇总在图22(a)和22(b)中。动画电影中的当前帧用一个有序的新边缘组232和有序的静边缘组233来描述。有序的新边缘组232包括由显示目录编译器608(如前所述)产生的用于当前帧的那些边缘。这些新的边缘232描述不存在于前一帧上或者已经移到前一帧之后的新位置上的显示目标。有序的静边缘组233描述由于被当作新的边缘引入到前一帧上而坚持(并且不移动)的目标。
在边缘处理242已经处理帧的所有边缘(新边缘232和静边缘233)之后,边缘处理242将产生有序的交叉信息组243(该信息组是作为输入提供给Z-级激活模块613的)作为输出,和将被边缘处理239用于下一个帧(即,这组边缘241在下一个帧的起点变成边缘组233)的有序静边缘组241。
边缘处理242还负责弃掉在当前帧之后不再影响到输出显示器上的边缘。这样的边缘必须进行标记,以便除去。此除去标记由外部部分(例如驱动器)来安放,并且在此文件的范围之外。当将每个边缘从有序的新边缘组或有序的静边缘组中找回时,边缘处理242就检查,看看是否已经对除去的边缘进行标记。如果是这样的,那么边缘就不转移到下一个帧241的有序静边缘组中。
5.2.顶级操作图24中给出了单个帧的边缘处理242的汇总。对于将要渲染的每个帧来说,边缘处理242通过从一个扫描线接一个扫描线(一行接一行)向下迭代显示、并计算有序新边缘组或有序静边缘组中的任何边缘与当前扫描线相交的位置,来进行操作。对于本领域的技术人员来说,基础算术可用于其它扫描方向中。
参照图24,在开始处理帧时,当前的扫描线计数器在步骤255被初始化到零(例如最上方扫描线)。如果任何边缘与当前的扫描线相交(如在步骤256所确定的),那么这些边缘就在步骤257进行处理。如果当前的扫描线计数器显示,最后的扫描线已经处理(步骤258=是),那么处理对于这个帧来说是完成了,否则当前的扫描线计数器就在步骤259递增,并对后序扫描线的边缘进行处理。
5.3.激活边缘跟踪图22(b)给出处理当前扫描线257时通过边缘处理239的数据流的总图。与当前扫描线相交(并因此需要处理)的边缘被称作激活边缘,并按照扫描顺序储存到有序的激活边缘组236中。当新边缘或静边缘的起点坐标与当前扫描线相交时,边缘处理239就从新边缘234和静边缘235产生激活边缘。激活边缘具有与新边缘或静边缘稍稍不同的格式,例如激活边缘不是具有起点坐标(Xs,Ys),而是具有从一个扫描线接一个扫描线获得更新的当前X字段。current_X(当前的X)字段对应于边缘与当前扫描线相交的位置。在处理每个激活边缘之后,如果确定激活边缘还与后面的扫描线相交,那么就以扫描顺序将激活边缘放置到下一扫描线238的有序激活边缘组内。
图23提供了单个扫描线的边缘处理239的操作的更多细节(对应于图24的步骤257)。在渲染显示的第一个扫描线之前,有序的激活边缘组236将被顷空。这个有序组将保持倾空,直到边缘处理239处理与有序的新边缘组232中的新边缘或有序的静边缘组233中的静边缘的起点(顶部)相交的扫描线为止。在到达该扫描线之前,边缘处理239一直都无事可作,即有序的激活边缘组是顷空的(本步骤244的确定=是),且没有剩余的静或新边缘(步骤246=是),或者所有的静或新边缘在到达后一个扫描线之前一直都没有开始处理(步骤247=否)。
如果有序的激活边缘组是为空的(步骤244=是),并且确定,新边缘或静边缘在当前扫描线(步骤244=是)上的某处开始(步骤246=否,步骤247=是),那么就将新边缘或静边缘从相应的有序静边缘组或有序新边缘组中除去,并且在步骤250转换成激活边缘,以便处理。
边缘处理239必须总是沿扫描线以扫描顺序(X坐标增大)来处理边缘。已经有有序的激活边缘组中的激活边缘作为处理前一个扫描线的结果(即,步骤244=否)。如果已经有激活边缘,并且有任何新边缘或静边缘(步骤245=否)在当前扫描线上开始(步骤248=是),那么下一个新边缘/静边缘的X坐标必须在步骤249中与下一个激活边缘的X坐标进行比较,以便确定下一步应该处理哪一个边缘。鉴于这三个边缘的来源(新的、静的和激活的)都按照扫描顺序进行储存,因此经常通过考虑每个来源14(参见图2(a))的下一个有用边缘,可确定需要处理的下一个边缘。
5.4.边缘处理的实例图2(a)中的实例表示出展示被三角形状15覆盖和包附的矩形形状14的电影第一帧的所需输出。为了此实例,显示像素的当前扫描线16已经叠加。当前扫描线的最左侧的显示像素是13。该显示像素对应于X坐标零,而向右的后序像素对应于X坐标1等等。
在边缘处理239产生图2(a)所示的帧的任何输出之前,显示目录编译器608产生包含四个新边缘的有序新边缘组,所述的四个新边缘描述此帧的所需输出(注意水平边缘被滤出)。这些四个边缘被示出与图2(b)中的当前扫描线16相交。边缘19和22相应于矩形分别使Z-级激活和失活。边缘20和21相应于三角形分别使Z-级激活和失活。
到边缘处理239处理图2(b)所示的当前扫描线的时候,边缘19和22将存在于有序的新边缘组中,而边缘20和21将存在于有序的激活边缘组中。边缘20和21在前一个(更高)扫描线上从新边缘转换成激活边缘。
针对当前的扫描线处理边缘(如图23所概述的)。总之,对于此实例,这将涉及到首先处理边缘19(因为它具有最小的X)。边缘19在产生任何交叉信息之前,先转换成激活边缘。其次处理边缘20和21,最后边缘22将转换成激活边缘,然后进行处理。在该实例中,当前扫描线的四个边缘的处理,产生图2(c)所示的交叉信息组。这些信息的产生和形式将在5.8.部分更详细地描述。
5.5.将边缘转换成激活边缘和边缘余辉现在返回到图23,如果需要处理的下一个边缘起源于新边缘或静边缘有序组,那么此边缘必须在步骤250转换成激活边缘,以便有益于处理,否则下一个激活边缘就在步骤251采集。如果需要处理的下一个边缘是新边缘或静边缘,并且此新边缘或静边缘就不会被标记被去除,那么就将此新边缘或静边缘置于有序的静边缘组237内,用于下一个帧。利用这种方式,边缘能够持续在多个帧上。有多种在特定帧上除去边缘的机构的执行方式。一种技术是,将识别字段指派给每个边缘,并且对于每个帧来说,提高对应于应该在此帧上除去的边缘的一组识别字段。另一种技术是,提供由边缘引用的Z-级内的标记,以便指示,所有的引用边缘都将除去。
5.5.1.静边缘余辉静边缘缓冲器的操作实例在图68A-68C和图69A-69C中给出。图68A-68C表示出动画序列的三个帧6800,6802和6804。图68A示出了包括房子6806的初始帧6800。图68B表示出第二个帧6802,这个帧保留了来自前一个帧6800的房子6806,但加了一个站在房子6806门口的人6800。图68C表示出第三个帧6804,这个帧再次保留了房子6806,但是现在将人从房子门口移到了房子6806右边的位置6810。
图69A-69C分别示出了产生在图68A-68C中看到的帧所需的处理操作的时间顺序。如图68A所示,代表房子6806的目标首先输入到显示目录编译器608中,从而产生包含将添加到当前帧6800中的新边缘的新边缘缓冲器6901。图16(a)在别处描述,是指勾画出房子形状的坐标,以及为了产生由新边缘缓冲器6901保留的边缘,如何解释这些坐标。输入静边缘缓冲器6902包含将从前一个帧保留的静边缘。然后经渲染(机)器610渲染缓冲器6901和6902,以便输出当前帧6800的渲染显示6903。图69A还示出了输出静边缘缓冲器6904,其包含将要为后序帧保留的静边缘。
在图69A中,显示目录编译器608通过变换、笔划、变形和储存图16(a)中的坐标,而对这些坐标进行处理。在该特定情况下,无需变形或笔划,但是显示目录编译器608还需处理时间以将坐标变换到正确的屏幕位置以及将边缘分成屏幕顺序。在准备渲染操作时,将所处理的边缘置于新的边缘缓冲器6901内。当这是动画中的第一个帧6800时,输入静边缘缓冲器6902是空的(并因此没有边缘可从前一个帧中保留)。现在,边缘缓冲器6901和6902准备好,显示目录编译器608停止这个帧6800的操作,渲染(机)器610开始着手这个帧6800的操作。渲染(机)器610合并来自边缘缓冲器6901和6902的边缘并把它们渲染到显示器6903上,从而将为后序帧保留输出的边缘到输出静边缘缓冲器6904。动画的第一帧6800的处理现在完成了。
在图68B和68C中,引用6808和6810分别是指勾画出将要渲染到第二和第三动画帧6802和6804上的人的形状的坐标。
在图69A中,执行对动画的第二帧6802的处理。注意,图69B的输入静边缘缓冲器6902与图69A的输出静边缘缓冲器6904是一样的。这可能是因为输入和输出静边缘缓冲器以“乒乓(ping-pong)”的方式在帧与帧之间交换。图69B的输出静边缘缓冲器6904在“乒乓”交换之后立即清理。
显示目录编译器608处理将为此帧6802加入的新边缘的坐标6808,从而将所处理的边缘置于新边缘缓冲器6901中。房子6806的边缘不需要显示目录编译器608的任何处理,因为它们是以已经处理过的方式从前一个帧中保留的。这就是静边缘技术减少所需的处理时间的原因。
与前一个帧的处理中一样,显示目录编译器608现在停止,而渲染(机)器610开始着手此帧6802的处理。边缘缓冲器6901和6902的内容被合并,并且渲染到显示器6903上,将要为下一个帧6804保留的边缘储存到输出静边缘缓冲器6904中。
在图69C中,执行对动画的第三帧6804的处理。显示目录编译器608处理将要为此帧6804加入的新边缘的坐标6810,从而将所处理的边缘置于新边缘缓冲器6901中。与前一个帧6802中一样,房子6806的边缘不需要显示目录编译器608的任何处理,因为它们是以已经处理过的方式从前一个帧中保留的。然而,人形状的边缘无需处理,因为人的形状6810已经移动并且在与前一个帧相比时变大了。因此,显示目录编译器608处理坐标6810,从而将所处理的人形状的边缘置于新边缘比较器6901中。
如其所述,显示目录编译器608现在停止,而渲染(机)器610开始着手此帧6804的处理。边缘缓冲器6901和6902的内容被合并,并且渲染到显示器6903上,将要为下一个帧保留的边缘储存到输出静边缘缓冲器6904中。注意,此处假设,房子目标6806将要不变地保留下来,以便包括在动画的第四个帧中;如果不是这样,那么房子形状就不包括在输出静边缘缓冲器6904中。
5.6.激活边缘处理下一个激活边缘在步骤252中的处理包括,产生将在后序模块(Z-级激活模块)上经过的一个或多个交叉信息。每个信息包括激活边缘的当前X坐标以及边缘的左右侧Z-级引用。
如果确定,激活边缘继续向显示屏幕的下面,至少进入下一个扫描线(在图23中,步骤253=否),那么激活边缘就在步骤254中添加到有序的激活边缘组中,以便在下一个扫描线的过程中进行处理。
5.7.跟踪边缘从一个扫描线接一个扫描线跟踪边缘的X坐标的这个过程,如图23的步骤252中所执行的,经常是指已有技术中的“边缘跟踪”。在描述系统699中,边缘可以是直线、二次方程贝塞尔(Bezier)曲线、椭圆弧或二次方程多项式片段。以下描述这四种边缘的每一个的边缘跟踪技术。
5.7.1.跟踪直线Bresenham的线性算法作为描绘直线的方法在本领域内是公知的。边缘处理239利用修正的Bresenham算法在步骤252为每个扫描线计算激活直线边缘的X坐标。图5中的C语言源代码表示出正在用来跟踪(和描绘)从起点坐标(Xs,Ys)到终点坐标(Xe,Ye)的直线的修正Bresenham算法的一个实例。该实例表示出对于Ys至Ye范围内的每个Y坐标来说,基于三个预先计算的值err,delta_err1和delta_err2,而递增计算的线的X坐标。
当作为直线的边缘数据由显示目录编译器608产生时(参见3.6.1.部分-产生直边跟踪参数),其至少包含-起点坐标(Xs,Ys),-终点Y坐标(Ye),-整数梯度项(grad),-剩余梯度项(ient),-.左标志,以及-左侧和/或右侧Z-级的引用当直线边缘在步骤250转换成激活直线边缘时,ient项就被用直边数据如下计算的err,delta_err1和delta_err2所代替使ty=Ye-Ys然后err=(2×ient)-tydelta_err1=2×ientdelta_err2=2×(ient-ty)然后在每个扫描线上,按照步骤252,利用修正的Bresenham算法,用现存的当前X坐标以及err,delta_err1和delta_err2参数如下计算激活边缘的新的当前X坐标如果err小于零,那么err=err+delta_err1current_X=current_X+grad否则err=err+delta_err2current_X=current_X+grad如果左标志是真值,那么当前_X=当前X-1否则当前_X=当前_X+1.
5.7.2.跟踪二次方程贝塞尔(Beziers)二次方程贝塞尔(Beziers)用如实例图7所示的起点、终点和控制点来描述。当作为二次方程贝塞尔(Beziers)曲线的边缘的数据用显示目录编译器608处理时(参见3.6.2.部分-产生二次方程贝塞尔(Bezier)曲线跟踪参数),二次方程贝塞尔(Beziers)边缘的描述就被重定格式,并呈现给边缘处理239,从而其至少包含-起点坐标(Xs,Ys),-终点Y坐标(Ye),-跟踪参数A、B、C和D,-符号标记(+1或-1),以及-左侧和/或右侧Z-级的引用。
对于每个扫描线来说,基于A、B、C和D,在图23的步骤252中如下重新计算贝塞尔(Bezier)曲线的当前X位置A=A+BC=C+D如果符号标记是+1,那么Current_X=A+2C]]>否则Current_X=A-2C.]]>5.7.3.跟踪二次方程多项式片段显示目录编译器608(参见3.6.2.部分-产生二次方程贝塞尔(Bezier)曲线跟踪参数)产生二次方程多项式片段的边缘描述,从而它们至少包含-起点坐标(Xs,Ys),-终点Y坐标(Ye),-跟踪参数A、C和D,以及-左侧和/或右侧Z-级的引用。
对于每个扫描线来说,基于A、C和D,在步骤252中如下重新计算二次方程多项式片段的当前X(current_X)位置
A=A+CC=C+D当前X=A5.7.4.跟踪椭圆弧显示目录编译器608产生椭圆弧的边缘描述,所述椭圆弧至少包含-等效圆中心(Cx,Cy),-等效圆半径‘R’,-等效圆起点坐标(Sx,Sy),-起点误差值‘E’,-圆-椭圆变换(扭斜‘e’+比例‘f’),-终点Y坐标‘Ey’,以及-左右取向。
当图23的步骤250将此数据转换成激活椭圆弧时,当前坐标、当前误差值和当前模式(以下描述)就从此数据初始化。
跟踪算法跟踪相对于圆中心的坐标。然后,当前坐标被设定为起点坐标减去等效圆的中心。当前误差值被设定为由显示目录编译器608提供的误差值。模式用来保持目前正被扫描的八分圆的跟踪,并根据提供给步骤250的起点坐标进行初始化。
注意,在任何阶段,绝对椭圆坐标都是利用以下公式、由相对的当前坐标(cx,cy)衍生的(SEx,SEy)=(fcx+ecy+Cx,cy+Cy)利用Bresenham的圆算法对圆进行跟踪,以便迭代更新当前的坐标和误差值。此算法,在本领域内是公知的,仅仅跟踪圆的右上方的八分圆(图14中的八分圆120),并利用反射序列产生另七个八分圆。进一步的细节记载在“Computer GraphicsPrinciples and Practice”;Foley & Van Dam Second Edition;3.3.部分-扫描转换圆中。
5.7.5.跟踪字形激活字形目标将当前的指示器保持在字形位图内。当字形边缘被跟踪时,这个指示器一行接一行地递增。由于字形的左手边缘是垂直的,因此current_X(当前的X)位置在边缘被跟踪时无需更新。
5.8.抗锯齿和交叉信息的产生通过利用额外的(子像素)分辨跟踪边缘,来实现抗锯齿。正如本领域内所公知的,此额外分辨力用来确定,每个像素的什么部分被图形图元所占据。此部分(在一些已有技术中被称作像素覆盖率)可用来削弱图形图元对每个输出像素颜色的影响,从而产生大大改善的渲染结果。例如,边缘坐标在XH和Y上具有额外的二位分辨,借此使X和Y上的分辨力增大四倍,现在参照图1(a)-1(c)给出边缘处理239如何采用额外解析的描述。图1(a)表示出进入目前正渲染的显示像素的扫描线1的激活边缘0。在图1(b)中,此扫描线被分成四个子像素线(空间元素线(spel-line))3、4、5、和6,代表由边缘数据的Y坐标上的额外2位提高的额外子像素分辨力。然后,利用前面描述的一种合适的边缘跟踪技术,为四个空间元素线的每一个,迭代地确定边缘的具有子像素准确度的X位置。对于被跟踪边缘与至少一个空间元素线相交的每个显示像素来说,产生边缘如何影响像素的4×4位屏蔽表现形式。这样的位屏蔽在本领域内经常被称作A缓冲,其最先记载在“The A-buffer,an Anti-aliasedHidden Surface Method,”Carpenter,L,Computer Graphics,Vol.18,No.3,Jul.1984(此后称作“Carpenter”)中。A缓冲用来指示显示像素内的哪一个空间元素被边缘所影响,并包括在从边缘处理模块614到Z-级激活模块613的交叉信息中。在此实例中,所产生的三个A缓冲如图1(c)所示,是A缓冲8、11和12,它们对应于当前扫描线像素X=2,X=3和X=4。如图1(c)所示,空间元素9并没有被边缘所影响,而空间元素10被边缘所影响。
交叉信息及其相关的A缓冲的产生是在图23的步骤252中针对激活边缘执行的。现在参照图3详细描述此步骤。
在图3的第一步骤35中,当前的空间元素线值被初始化为0,表示当前扫描线的最顶部的空间元素线被最先处理。A缓冲在空白时被初始化,并且用对应于显示像素的X值将当前的像素值初始化,在显示像素内,激活边缘进入当前的扫描线。此X值是激活边缘的当前X坐标的非小数部分。
其次在步骤36,正在处理的激活边缘的当前X坐标与当前的像素值进行比较,以便查看,current_X(当前的X)是否在用当前像素表示的显示像素内。作为步骤35的结果,这在第一迭代上是真实的。
下一个步骤39的操作是为了修正对应于当前空间元素线的一行A缓冲,其中最顶行的A缓冲对应于当前的空间元素线=0。当前X的小数数据用来确定,有多少空间元素应该设定在对应于当前空间元素线的那行A缓冲上。如果诸如,二位子像素准确度是由current_X(当前的X)提供的,那么就能产生代表每行四个空间元素的A缓冲(如A缓冲8、11和12所示)。表5表示出二位小数数据是如何用来确定,怎样设定对应于当前空间元素线的那行A缓冲的。
表5

返回来参照图1(b)的实例,在针对最顶部的空间元素线3(当前的空间元素线=0)进行处理的过程中,激活边缘0的当前X值具有非小数分量4(100b)和小数分量0.75(小数位是11b)。在这种情况下,按照表5仅仅设定A缓冲12的顶行的最右边的空间元素。
在修正A缓冲之后,如图3所示,在对应于哪一个激活边缘与后面的空间元素线4相交的步骤40,计算新的当前X。通过将前述的跟踪技术之一应用于激活边缘的数据,可实现这一点。当前的空间元素线在步骤41是递增的,并且如果有更多的空间元素线将要处理(步骤42=否),那么处理就返回到将激活边缘的当前X与当前像素进行比较的步骤36。
如果current_X(当前的X)指示,激活边缘与当前像素所指示的一个不同显示像素内的当前空间元素线相交,那么就执行产生至少包含以下因数的交叉信息的步骤37-X坐标=当前像素-A缓冲-激活的Z-级引用(用激活边缘的左侧Z-级引用复制)-失活的Z-级引用(用激活边缘的右侧Z-级引用复制)。
注意,Z-级引用可以是零填充。
所产生的交叉信息经分类装置(例如,分类缓冲器)作为输出传递到Z-级激活模块613。为了确保Z-级激活模块613按扫描顺序(即,按X坐标的增大来分类)接收交叉信息,分类装置是必需的。
然后,A缓冲被重新初始化为空白,并且当前像素被设定为激活边缘(0)的当前X值的非小数部分。然后,将A缓冲修正为A缓冲11(如其所述),从而显示激活边缘对当前像素的当前空间元素线5的作用。
处理针对剩余的空间元素线6继续进行,从而使包含A缓冲11的交叉信息被输出。
一旦所有的空间元素线已经处理(步骤42=是),就产生包含A缓冲8的最后交叉信息,并且如前所述在步骤43输出。
5.8.1.产生字形的交叉信息将每行所渲染的字形分裂成字节宽(或8个像素宽)的几组,然后依次进行处理。每个字节用作256条目查询表(LUT)内的索引,每个条目占据32位。LUT中的单个条目识别,8像素行交差信息必须在哪儿产生。
每个条目在4位字节进行处理-前4位字节所产生的交叉数目,而每个后续4位字节记录交叉相对于开始区域的位置。记录8个交叉但却没有位置的特定条目用于在每个像素具有交叉的字节的独特情形。
参照图26,该图表示出具有宽度为16、高度为2的位图256的实例。二进制表现形式256是{0xD6,0x54,0x99,0xCC}(注意,每个字节内的位‘7’是指相应像素组中的最左边的像素)。采集此位图的第一字节,并在LUT266中查阅其无符号的值,看到,在位置0,2,3,4,5和7具有六个交叉。假设,LUT265位于屏幕坐标(100,100)处,这可能意味着,必须针对(100,100)、(102,100)、(103,100)、(104,100)、(105,100)、(107,100)产生交叉信息。产生8个交叉信息的字节也可在此图中观察到。
在已经标引LUT266并获得字节的一组交叉之后,额外的交叉可以插入到删除的错误交叉内,或者就是删除的错误交叉。这是由在位图的每行开始处被初始化为0的标志所控制。当清理此位时,就不会修改交叉。当设定此位时,如果对应于像素组中的最左边位置的交叉(“零交叉”)不存在,那么就插入一个。相反,如果零交叉存在,就将其删除。
标志的状态在这一行中每个字节的处理终止时进行更新。奇数个交叉信息使标志逆转,而偶数个交叉信息保持标志的当前值。如果在一行的终点设定标志,那么就输出最后的交叉信息,以便使这一行正确终止。此信息的位置在紧邻当前像素组右边的像素组的起点。
返回来参照图26,可追踪横贯位图中的四个字节的此标志的状态。在第一行的开始,标志被初始化为0。第一字节解析成偶数个交叉,于是标志在此字节的终点不被触动。然而,第二字节解析成奇数个交叉。结果,标志被触发为0。第二字节是这一行中的最后一个,因此产生最后的交叉信息,以便结束这一行。
现在移动到第二行,标志被初始化为0。第三字节被分解成奇数个交叉信息,从而导致标志在此字节的终点被初始化为1。第四字节在1,1,2,3,4,5,6和7解析成8个交叉信息。然而,设定标志。当零交叉信息存在时,删除这个信息,从而导致7个交叉信息被输出。当这是奇数个交叉时,标志又被触发到0。当处理现在处于这一行的终点并且标志没有设定时,就没有最后的交叉信息被输出。
所有情况下的交叉信息都配有S缓冲,该缓冲将所有的子像素设定为-1。结果,总是应该用奇数-偶数卷绕规则来渲染字形。
5.8.1.产生字形交叉信息和抗锯齿图66表示出与图26所示相同的扫描线。考虑单个像素6601,在该扫描线上产生交叉信息6602。交叉信息6602具有被设定为-1的所有子像素。此交叉信息将导致整个像素6603输出。结果,字形没有抗锯齿,也没有考虑子像素。这对于为字形产生的所有交叉信息来说是真实的,包括那些在考虑“零交叉”标志时加入的信息。
5.9.交叉信息的实例继续图2(c)所示的实例,该图表示出由边缘处理模块614为激活边缘产生的交叉信息(如图2(b)所示)。在此实例中,采用4×4抗锯齿,其中用对应于显示像素内的子像素(空间元素)的额外2位分辨力来描述激活边缘坐标。首先执行对边缘19的处理,并因此首先将产生相应的交叉信息23。由于激活边缘具有描述矩形填充的左侧Z-级引用,因此所产生的交叉信息23的激活Z-级引用将具有描述矩形填充的激活Z-级引用。
激活边缘20的处理其次发生。当模块614(在图3中勾画出其轮廓)通过激活边缘20的四个空间元素线的头三个迭代时,就产生交叉信息25。因为激活边缘与不同像素上的第四个空间元素线(最底部的空间元素线)相交,所以为此需要产生不同的交叉信息,于是交叉信息24其次产生。这些交叉信息都具有描述三角形填充的激活Z-级引用。
同样,为激活边缘21产生交叉信息26和27,并且这些具有三角形填充的失活Z-级引用(用原始的激活边缘21的右手Z-级引用复制的)。最后用边缘22产生交叉信息28,并且该信息具有矩形填充的失活Z-级引用。
5.9.1另一实例图70表示出描述接受零交叉信息的S缓冲的更新的进一步实例。最初,对于扫描线中的像素#1,没有边缘交叉,因此对于此像素没有交叉信息或S缓冲n。如此,对于像素#1,S缓冲n被设定充满零。然后,此S缓冲n的最右栏被复制到下一个像素#2的S缓冲n-1的第一(即最左)栏上。然后,此栏横贯S缓冲n-1的这一栏被复制,在此情况下,这导致该缓冲也充满零。如图所示,边缘与像素#2交叉,并按照所示出的子线(用于和4,2或1子线交叉)交叉规则,确定像素#2的零交叉信息。如图所示,该信息在其下右侧四分之一处充满+1,由此弥补与扫描线交叉的边缘。对于像素#2,零交叉信息与S缓冲n-1相加,给出该像素的S缓冲n。在此情形下,这仅仅是交叉信息,因为缓冲(区)为零。对于下一个像素#3,最右栏再次从S缓冲n复制,并在S缓冲n-1充满1(在此例中为1)。按照交叉规则确定#3处的交叉信息,在所述规则中,相关边缘仅仅与像素的右上方四分之一处的2个子线交叉。再者,交叉信息和S缓冲n-1相加,从而给出像素#3的S缓冲n。对于像素#4,最右栏再次进行复制,并在S缓冲n-1上充满1。交叉信息再次利用规则来确定,并相加,从而给出像素#4的S缓冲n。这个所描述的利用交叉信息和S缓冲影响抗锯齿的方法努力能够准确确定位于扫描线上的像素的激活水平,而无需在子像素的基础上组合水平。所有的子像素处理是利用S缓冲和交叉指示器发生的,由此留下像素水平的合成任务。
5.10.激活边缘和交叉信息的重新排序虽然扫描线的激活边缘是按扫描顺序处理的,但是相应的交叉信息并不一定按照扫描顺序(X增大)产生和输出。例如,当边缘20在图2(b)中处理时,首先产生和输出交叉信息25,然后是信息24。交叉信息25具有比信息24高的X坐标,因此该交叉信息不按扫描顺序输出。而且,在边缘处理模块614的操作过程中新的当前X的计算结果可使第一激活边缘具有低于已经在此扫描线上处理过的第二激活边缘的扫描位置。
此情形的实例在图21给出。在该图中,两个虚水平线230和231代表输出显示的扫描线。上虚线230代表当前由边缘处理模块614处理的扫描线,下虚线231代表待处理的下一个扫描线。图21表示出分别在交叉224、225和226与当前扫描线230相交的三个激活边缘221、222和223。激活边缘的当前X字段指示出相交的位置。边缘处理模块614计算对应于下一个扫描线231上的交集227、228、229的每个激活边缘的新当前X值。在此实例中,这些修正的激活边缘不再按扫描顺序,因为激活边缘223具有交叉的激活边缘221和激活边缘222。因此,修正的激活边缘在放到下一个扫描线的有序激活边缘组中之前,需要重新进行分类。在该实例中,下一个扫描线的有序激活边缘组中的激活边缘的所需顺序是,第一是223,其次是221,最后是222。
边缘处理模块614将修正的激活边缘插入分类装置(例如分类缓冲器)中,以便它们在转换成下一个扫描线的有序激活边缘组之前,按扫描顺序排列。还有一点必要的是,使输出交叉信息(如图23的步骤252中所产生的)通过分类装置(例如,分类缓冲器),以便Z-级激活模块613按扫描顺序接收交叉信息。
6.Z-级主动模块Z-级主动模块613利用从边缘处理模块614传递到其中的边缘交集数据来保持当帧渲染时影响输出颜色的Z-级轨迹。输出像素流将按扫描顺序由渲染(机)器610产生。来自边缘处理模块614的每个交叉信息,代表当按扫描顺序产生时所需的输出颜色就改变的显示坐标。在下面的描述中,始于特定光栅空间位置的一个或多个按扫描顺序的邻接像素,被称作像素流。该描述假设,对于边缘交叉点(即当渲染系统610正在执行抗锯齿时候的情形),产生A缓冲。
6.1.感兴趣的Z-级有序组Z-级激活模块613保持“感兴趣的(interesting)”Z-级目录(在图59中一般示出)。关于感兴趣的,是指,所指的Z-级必须被Z-级激活模块613所考虑。Z-级激活模决613利用有序的感兴趣的Z-级组将交叉信息输入转换成区域信息输出,而区域信息输出指示出,哪一个Z-级影响沿当前扫描线的像素流的输出颜色。即,该像素流位于由两个相邻交叉信息描述的几个点之内。
对于将交叉信息流转换成区域信息输出而言,也能够看出Z-级激活模块613的操作,所述的区域信息输出指示出,跨距上存在哪些的深度和跨距之上的相对深度如何排序。关于跨距,是指由交叉信息界定的扫描线上的内部。由于Z-级使结合填充和的深度相联系,因此有序的深度组可用来确定哪那些Z-级影响沿当前扫描线的像素流的输出颜色。这就是合成器的作用(以后需考虑)。反之,确定存在于跨距上的一组Z-级,与确定存在于跨距上的这些深度是等同的。
6.2.Z-级激活模块中的控制流与边缘处理模块614一样,Z-级激活模块613按照一个扫描线接一个扫描线来考虑渲染任务,并且希望按扫描顺序接收输入(交叉信息)。图58汇总出Z-级激活模块613对于单个扫描线的功能性。通过将激活Z-级目录初始化为空的并将当前X值在步骤628设定为0,而开始扫描线的处理。current_X(当前的X)用来指示目前正处理的像素,0值代表扫描线的第一(最左边的)像素。
扫描线的交叉信息按自左到右的顺序(X增大)进行处理。
如果没有此扫描线的边缘交叉信息(如由步骤627的“否”所确定的),那么Z-级激活模块613就立刻需要在步骤629渲染整个扫描线。因为在此阶段,感兴趣的Z-级目录是空的,所以这将导致所渲染的扫描线仅具有缺省的背景颜色。
如果当前扫描线的交叉信息存在(步骤627=是),那么下一个有用的交叉信息的X坐标就在步骤630与current_X(当前的X值)进行比较。如果current_X(当前的X)和交叉信息的X坐标不相等,那么Z-级激活模块613就必须要求在处理此交叉信息之前,渲染current_X(当前的X)和交叉信息的X坐标之间的像素流。此要求导致在步骤631,渲染(机)器610中的合成模块612利用有序的感兴趣的Z-级组的内容产生此像素区域的输出颜色。
在current_X(当前的X)和交叉信息的X坐标相等的情形(步骤630中的“是”)中,交叉信息对应于当前像素的颜色生成,于是交叉信息的处理继续进行。
6.3.激活和去活Z-级卷绕计数为了使自身相交的目标易于渲染,Z-级激活模块613采用卷绕规则。不是储存用于指示Z-级是否已经激活的Boolean指示,该模块而是储存每个激活Z-级的小卷绕计数整数值。卷绕计数对于本领域的技术人员来说是公知的。可以采用的两个卷绕规则在已有技术中得到普遍描述非零和奇数-偶数(奇偶)。可以采用的第三个规则(不太普遍,但在已有技术中也有描述)是负卷绕,在下面的6.7.部分(将S缓冲转换成A缓冲;卷绕规则)有所描述。
交叉信息可包含将被‘激活’的Z-级引用,即Z-级必须具有递减的卷绕计数。交叉信息还可包含将要‘去活’的Z-级引用,即Z-级必须具有递增的卷绕计数。Z-级的这个递增和/或递减仅仅应用了交叉信息的A缓冲中所指示的像素部分(如图2(d)所示)。A缓冲29、30和31是被交叉信息23、24和25激活的子像素的实例,32、33和34是被交叉信息26、27和28去活的子像素的实例。
这些使Z-级对输出像素的影响激活和去活的作用,取决于哪一个卷绕规则与该Z-级一起使用。
6.4.有序的感兴趣的Z-级组-继续Z-级激活模块613为感兴趣的Z-级目录中的每个Z-级储存卷绕计数的二维阵列(如图59所示)。卷绕计数的二维阵列被称作“S缓冲”。每个卷绕计数代表正在渲染的当前像素(643,647和651)内的一个子像素的Z-级状态。这使得Z-级激活模块613保持每个Z-级在其上是活动的当前像素的那部分轨迹。有序的感兴趣的Z-级组的顺序是深度顺序。在图59所示的实例中,Z-级640,644和648按其深度进行排序;641,645和649。填充数据642,646和650规定Z-级640,644和648的颜色。
6.5.将新的Z-级添加到有序的感兴趣的Z-级组中返回到图58,如果新的交叉信息没有活动Z-级(步骤638=否),那么就不执行有关活动Z-级的处理步骤。同样,如果交叉信息没有失活的Z-级(步骤639=否),那么就不执行有关失活Z-级的处理步骤。
如果新的交叉信息激活Z-级,并且该Z-级已经不在感兴趣的Z-级目录中了(步骤632=否),那么就在步骤640a中,检查感兴趣的Z-级目录。如果目录是满的,就从目录中除去具有所有零卷绕计数的Z-级。此后,对应于步骤638中的检测,将新的条目插入到此目录中,以便该目录保持Z-级深度顺序(如步骤634所示)。交叉信息的A缓冲用来初始化将要与新插入的Z-级相关的子像素计数阵列(即,z-级的S缓冲)。由A缓冲所指示的子像素对应于应该“-1”值初始化的S缓冲中的子像素计数。剩余的子像素计数用0值初始化。从A缓冲到卷绕计数阵列的这个转换的实例在图2(d)中示出。
如果新的交叉信息激活已经在有序的感兴趣Z-级组中的Z-级(632=是),那么此交叉信息的A缓冲就用来确定,与该Z-级相关的S缓冲中的哪些子像素计数将要递减。
还是参照图58,如果新的交叉信息使还不在感兴趣Z-级目录中的Z-级失活,那么就在步骤636将对应的新条目插入此目录中,以便该目录保持Z-级的深度顺序。交叉信息的A缓冲用来初始化将要与新插入的Z-级相关的子像素计数阵列(即,Z-级的S缓冲)。由A缓冲所指示的子像素对应于初始化为+1的S缓冲中的子像素计数。剩余的子像素计数用0值初始化。从A缓冲到卷绕计数阵列(S缓冲)的这个转换的实例在图2(d)中示出,其中X=14,X=15和X=15的交叉信息是使Z-级失活的交叉信息。
如果新的交叉信息使已经在感兴趣的Z-级目录中的Z-级失活(635=是),那么该交叉信息的A缓冲就用来确定,该Z-级的S缓冲中的哪些子像素计数将要递增。对于A缓冲中所指示的每个子像素,S缓冲中的相应子像素的卷绕计数在步骤637递增。
图71表示出操纵图58所示的交叉信息的另一种方法。在图71中,与图58所示的那些对应的所有附图标记都具有相同的功能。图71不同于图58的地方是,已经删除了图58的步骤640a,这样步骤634直接接着步骤632的“否”指示。图71还包括额外的步骤641a,该步骤操作后面的步骤637,以便检查感兴趣的Z-级目录中的条目是否具有都为零的卷绕计数。如果有,该条目就不再有效并由此从目录中去除。这样,图71的方法进行操作,以便在条目不再影响正在渲染的图像时将它们从目录中除去,并且与图58相反,图58仅仅在目录中需要新条目的空间时采除去条目。
6.5.1.将有序的感兴趣的Z-级组保持在硬件中现在轮到讨论硬件(例如ASIC)的执行了。Z-级激活模块613根据扫描线管理Z-级激活表(ZLAT)中的Z-级(如图52(b)所示)。当从左向右处理扫描线时,交叉信息所引用的Z-级就逐渐引到ZLAT中。给每个输入的Z-级指派一个ZLAT目录,以便储存S缓冲573、填充信息572,并且可以被Z-级深度571寻址。
ZLAT中的Z-级条目不按深度来排序。而是,它们最有可能按在交叉信息中被接收到的顺序来设置。图52(a)表示出在特定的X坐标是活动的5个Z-级及其相对深度的实例,而图52(b)表示出,ZLAT中的各自5个Z-级条目不按深度来排序。为了利用映射570来减小深度,而将Z-级条目保持在Z-级激活模块613中。图570是包含与ZLAT相同数目的条目的表,并且是有序的局部深度目录,每个局部深度目录都包括对ZLAT中各条目的映射引用。例如,Z-级555具有局部深度1(它是第二最高的Z-级,其中局部深度0是最高的),并且被映射到ZLAT条目3中;即,Z-级555。还示出有更新的映射574。
利用此机制,Z-级条目可以两种方式来存取。本公开文本的ZLAT是作为内容可寻址的存储器来执行的,从而提供Z-级深度将回送相应的Z-级条目。这使得ZLAT的大小将根据跨距中的活动目标数目来改变,同时允许Z-级准备包括在ZLAT中并从其中除去。ZLAT在由于接收交叉信息而更新S缓冲状态时,以这种方式来存取。反之,ZLAT条目经映射表还可被局部深度寻址。也就是说,通过将映射应用到特定局部深度上,可确定存在于该特定局部深度的Z-级。ZLAT在确定有序的深度亚组时以这种方式来寻址,其中这些深度在特定跨距上对于合成是活动的。
6.5.1.1.在硬件中加入新的Z-级条目在Z-级第一次被扫描线上的交叉信息引用时将Z-级添加到ZLAT中。在后序的引用中,相应的条目仅需要更新,其仍然保留在ZLAT内的同一部位。保持输入计数器,以便跟踪ZLAT中将插入下一个新Z-级条目的部位。计数器在扫描线的起点最初重新被设定到位置0,并且在每个新的Z-级添加到ZLAT中时递增。因此,在ZLAT变满之前,Z-级条目一直都保持被接收到交叉信息中的顺序。
在扫描线的起点,ZLAT最初是空的。映射570也处于初始状态,以便局部深度0包含对ZLAT条目0的映射,而局部深度1包含对ZLAT条目1的映射,等等。当新的Z-级然后作为一个条目添加到ZLAT中时,就将其插入输入计数所指的那个位置上,更新映射570,以便反映Z-级的任何变化的排序,并且输入计数递增。为了更新该映射,必须相对于目前正保持在ZLAT中的Z-级的局部深度来确定输入Z-级的局部深度。也就是说,确定哪些Z-级具有输入Z-级以上的局部深度,以及哪些Z-级具有输入Z-级以下的局部深度。
此过程在图53(a)和53(b)中示出。作为此过程的第一步骤,参见图53(a),目前正保持在ZLAT578中的Z-级条目与待加入的Z-级进行比较。ZLAT条目通过比较它们的Z-级深度而被标记为局部位于输入Z-级以上或以下。在图53(a)中,ZLAT条目被标记为在添加到目录577中的Z-级575以上(标记=0)或以下(标记=1)。
第二步骤是,以诸如映射579所确定的标记的相关局部深度的顺序来记录所述标记。这具有区别映射中在输入Z-级局部深度以上或以下的局部深度的作用。利用所记录的标记576,对映射579进行更新,以便反映由于新Z-级的加入而导致的局部深度的新的排序。
为了更新映射579,使被标记为在待加入的Z-级以下的局部深度按序降级,同时提升新的局部深度,以便产生下一个映射580。注意,相应ZLAT条目的局部深度改变,然而,由于ZLAT条目不动地保持在ZLAT内,因此它们的映射仍然不变。例如在ZLAT578中,深度9的Z-级在加入新的Z-级575之前在当前的映射579中具有局部深度4。它映射到ZLAT578中的位置1,并且这个映射甚至在其局部深度在加入新的Z-级575之后降到下一个映射580中的5之后,仍然保持不变。
图53(b)表示出将进一步的Z-级586添加到出自于图53(a)的ZLAT581中的另一个实例,和适当更新映射584,585的步骤。
6.5.1.2.将硬件中的Z级条目重新分类作为扩展,Z-级条目以减小Z-级深度所遵循的感兴趣Z-级的顺序保持在ZLAM中。感兴趣的Z-级是那些其填充规则应用到其S缓冲上导致非零A缓冲的产生的Z-级。也就是说,感兴趣的Z-级是潜在的影响因素。虽然Z-级深度不可能改变,但是存在这样的情况Z-级的状态从感兴趣的变为不感兴趣的,反之亦然。这发生在两种可能的情节中。这种情况可发生在以下情节Z-级激活模块613接收一个引用已经驻留在ZLAT内的Z-级的交叉信息,并且还与交叉信息相关的A缓冲使Z-级改变其感兴趣的状态。这种情况还发生在跨距处理完成时,其中必须横贯整个S缓冲来复制ZLAT条目的S缓冲的最右边空间元素。此步骤可具有使感兴趣的Z-级变成不感兴趣的作用。
改变其感兴趣状态的Z-级事件对ZLAT中的条目没有作用,只是使相应的Z-级的S缓冲更新。然而,它需要更新映射,以便影响新的局部深度排序。这样,由映射所保持的局部深度需要重新分类,而不是插入分类。
图54(a)表示出驻留在ZLAT590中的Z-级587变成不感兴趣的情节。ZLAT590的当前状态599表示出在何处一些深度是感兴趣的、而一些深度是不感兴趣,并且当前的映射591反映了当前的局部深度排序。这可用来形成对ZLAT590的划分。为了更新映射591,以与加入新的Z-级的过程相似的方式,针对ZLAT590中的条目制作标记。条目被标记为,相对于局部深度排序,在状态改变的Z-级以上或以下。在标记栏589中,如果条目的局部深度排序一旦更新就在改变的Z-级以上,那么就用1标记该条目。同样还记录这些标记,以便反映局部深度状态588,通过提升改变的Z-级以上的局部深度映射并将改变的Z-级的映射降到更低的局部深度,而将映射591更新为映射592。
图54(b)表示出条目593正在变成感兴趣600时的此过程。在此实例中,ZLAT596中的条目用1标记(如标记栏595所示),如果它们的局部深度在变化Z-级593以下的话。类似地记录标记594,并将映射597更新为映射5098,以便将所标记的局部深度映射被降到更低的局部深度,以及将改变的Z-级的局部深度提升。
6.5.1.3.Z-级条目的更换不需要用于除去当前扫描线上的不活动ZLAT条目的机制。可执行惰性(lazy)政策,由此忽略不活动的条目,除非新的Z-级将加入并且ZLAT中不再有空间(即假定其有限尺寸)。在这样的情形下,除去由最低局部深度所映射的Z-级条目,并且正在加入的Z-级采集其在ZLAT中的条目。对映射表进行更新,好象正在认领的ZLAT中的条目是空的一样。
6.5.1.4.对单个扫描线的简化ZLAM管理图65A和65B是对有序的感兴趣Z-级组在利用图58中所述的方法进行更新时,是如何在扫描线之上变化的概述。为了清楚起见,没有示出在6.5.1.3.部分所描述的不活动Z-级改造的任选惰性政策。
图65A表示出用正在具有[1,18]范围上的X坐标的特定扫描线6508上渲染的矩形6502、圆6504和三角形6506形成的图像6500。图65B相对于扫描线6508上的活动边缘,表示出在遇到每个边缘之后形成Z-级激活表的一组有序的感兴趣级6530。
在6500,与矩形6502相关的左手边缘与扫描线6508上的像素#4相交,并产生交叉信息。此交叉信息导致与矩形6502相关的Z-级6521被添加到有序组6530中。
在6512,与三角形6506相关的左手边缘与像素#6相交,并产生交叉信息。此交叉信息导致与三角形6506相关的Z-级6522被添加到有序的感兴趣Z-级组6530中。在这种情况下,看到,图58的方法的应用导致三角形6504的填充被插入有序组6530的最顶部。填充如此插入,使得这个组6530按深度顺序来保持,并且三角形6506位于矩形6502之上。
同样在6513,将圆6504的Z-级或填充6523分别插在三角形5606和矩形6502的Z-级6522与6521之间。在6514,如此不活动的矩形6502的填充6521的除去不会影响有序组6530的排序。在6515,圆6504变成不活动的,并且将其填充6521从然后变成空的有序组6530中除去。
6.6.处理流以下描述现在将从对更相关问题的讨论返回到硬件,并继续来自6.5.部分的更一般方法的描述。
交叉信息的处理继续进行,直到没有对应于当前X(630)的进一步交叉信息为止。当此行为发生时,Z-级激活模块613必须要求合成模块612,以便在进行到处理任何进一步的交叉信息的阶段之前产生像素流的输出颜色631(如图40所示)。
图40表示出输出到合成模块612的数据流,以及相关的感兴趣的Z-级组不变的像素流轨迹。
首先,必须要求在步骤399产生显示像素的当前X的颜色。此时,有序的感兴趣Z-级组的内容描述所有影响该像素颜色的Z-级,并且利用子像素的S缓冲将子像素的覆盖信息提供给每个Z-级。图40的剩余部分将在6.8.部分中描述。
6.7.将S缓冲转换成A缓冲卷绕规则合成模块612将与每个感兴趣Z-级相关的A缓冲作为输入来采集。因此,Z-级激活模块613在将数据流传递到合成模块612之前,将与每个感兴趣级相关的S缓冲转换成A缓冲。在如此实施时,Z-级激活模块613采用卷绕规则。上述的三个卷绕规则在图57(a)和图57(b)中示出,其中S缓冲624和620利用每个卷绕规则分别被转换成A缓冲621,622,623和626,625,619。
-奇数-偶数当卷绕计数是奇数时,填充影响子像素,如A缓冲623和619中所示;-非零当卷绕计数是非零时,填充影响子像素,如A缓冲621和626中所示;以及-负卷绕当卷绕计数是负数时,填充影响子像素,如A缓冲622和625中所示。
这些卷绕规则对整个形状421产生的结果在图43(a)中示出。在图43(a)中,表述出扫描线424上的许多卷绕计数420,426和422。同样,卷绕计数429,427和423存在于扫描线425之上。在图43(b)中,应用非零卷绕428、负卷绕430和奇数-偶数431规则的结果,假定形状的边缘在形状的范围内限定出影线填充(如图43(b)的表现形式所示)。
负卷绕规则对于利用最少量的计算产生和渲染笔划边缘是特别有用的。笔划路径的过程作为变换、变形和笔划模块616的一部分(参见3.4.部分)在本文已经描述过。部分笔划路径的实例在图36(a)-36(c)中示出。图36(a)表示出待笔划的三边缘362,361和360的有序组,这些边缘从原点359形成顺时针的三角形路径。这个待笔划的有序边缘组伴随有“空”左侧Z-级366、右侧Z-级367和笔划Z-级(即,笔的颜色)365。在图36(b)中给出用三边缘的有序组和相关Z-级表示的形状的所需输出的实例。为了获得描述图36(b)所示的所需输出的边缘,变换、变形和笔划模块616将产生左手笔划边缘355和右手笔划边缘356,如图36(c)所示,该图表示出在原点354的最顶部接合的更大比例的表现形式。在笔划Z-级365不具有透明性的情况中,笔划过程-将零(空)左侧Z-级366指派给所有左手笔划边缘355的左侧Z-级引用;-将笔划Z-级365指派给所有左手笔划边缘355的右侧Z-级引用;-将笔划Z-级365指派给所有右手笔划边缘356的左侧Z-级引用;以及-将右侧Z-级367指派给所有右手笔划边缘356的右侧Z-级引用。
图36(c)描绘出两个扫描线357和358。在这两条扫描线的每一个之上是表示沿扫描线的不同点的原始边缘组的右侧Z-级引用367的卷绕计数的数目。如果采用奇数-偶数或者非零卷绕规则,那么就如图36(c)所示,用自身相交边缘形成的无用三角形区域368就被用活动Z-级367渲染的右手笔划边缘所闭合,这是由于卷绕计数在此区域为‘1’。通过利用负卷绕规则,卷绕计数‘1’被认为是不活动的,并因此将正确地渲染该接合。
6.8.处理流,继续返回到图40的讨论-处理流,利用A缓冲和有序的感兴趣填充组,步骤399中的合成模块612计算单个像素的抗锯齿颜色。
感兴趣的Z-级目录还用来产生后序像素的颜色,所述后序像素沿扫描线一直到下一个交叉信息的X坐标。然而,必须先修正每个扫描线的卷绕计数阵列(S缓冲),以便指示出后序像素的每个Z-级的正确覆盖率,因为它与像素的当前X是不一样的。对于这些后序像素,每个Z-级的覆盖率在到达下一个交叉信息的X坐标之前一直都是不变。
再参照图2的实例,矩形14的左边缘使边缘处理模块614产生交叉信息(X=4)。A缓冲表示,对于像素X=4,用来填充矩形的Z-级对于输出像素的右下方的四个子像素是激活的。然而,为了正确渲染矩形,此Z-级对于沿扫描线的所有后序像素上的更低的两个子扫描线来说,还应该保持为活动的,直到右手边缘在X=15为止(其中Z-级是失活的)。通过将最右边的子像素值复制到同一行上的所有其它子像素值上,可产生正确的S缓冲(如图8所示),此S缓冲表示Z-级对显示像素X=5直至但不包括X=15的影响。图8表示出对于图2中的像素X=4,对应于交叉信息64的S缓冲65。S缓冲66表示对于每行来说,横贯最右边的卷绕计数复制到所有其它卷绕计数上的结果。此结果对于像素X=5直至并包括X=14来说,正确地表示出用于渲染矩形的Z-级的卷绕计数。
返回到图40,步骤400进行操作,以便横贯有序的感兴趣Z-级组中的所有Z-级的最右边卷绕计数进行复制,而current_X(当前的X)递增。合成模块612现在按照步骤401用于处理流中的剩余像素。如果没有为当前的扫描线保留交叉信息,那么就需要合成模块612,产生从current_X(当前的X)到当前扫描线终点的像素。
注意,为这些像素所生成的颜色在在处理流上是变化的,诸如在一个或多个活动Z-级是混合或位图的情形中。在处理流上保持恒定的只是所涉及的覆盖信息和Z-级。基于感兴趣的Z-级目录的内容生成像素颜色的细节公开在合成模块612的描述中(参见第7部分)。图40的最后步骤402是将current_X(当前的X)修正到下一个有用交叉点的X坐标(如果有一个有用的话)。
用有序的感兴趣Z-级组中的每个Z-级的S缓冲生成A缓冲的过程与合成单个像素的过程一样,并且已经在上述的“将S缓冲转换成A缓冲;卷绕规则”这部分中有所描述。
最后,返回到图58,针对当前的扫描线处理边缘交叉信息,直到没有一个剩下为止,这是在步骤627执行的。针对将要渲染的所有扫描线重复图58的操作。
7.合成模块合成模块6123是将以下因素的每一个作为输入来采集的-诸如Z-级激活模块613所产生的有序的Z-级组及其各自的A缓冲,-限定出待生成的输出像素流长度的输出显示空间中的坐标,并且生成作为输出的以下因素-适合在输出显示器件上表现的像素流。
有序的输入Z-级组是按深度顺序分类的。Z-级深度的概念在前面已经描述过。在下面的描述中,使用术语顶部和底部。给出两个Z-级,即A和B,如果最后的输出在遮蔽Z-级B时描绘Z-级A,那么Z-级A就被认为是在Z-级B的顶部或之上。反之,Z-级B就被认为是在Z-级A之下或下面。此外,最顶部的Z-级在概念上被认为是在所有其它Z-级的‘顶部’,即它可遮蔽所有其它Z-级,又不会被其它任何Z-级所遮蔽。反之,最底部的Z-级是不能遮蔽其它Z-级但能够被所有其它Z-级所遮蔽的一个Z-级。此外,总是存在一个背景Z-级,其被认为是在输入组中的最底部Z-级之下。背景Z-级不包括在有序的输入Z-级组中,并且对作为输入组一部分的Z-级的任何讨论都不包括背景Z-级。如果需要背景Z-级,那么它将会被明确指出。
7.1.中间体在合成过程中,需要存取中间合成缓冲器。此缓冲器大得足以容纳最大尺寸(即输出设备的宽度)流的任何中间合成结果。本领域的技术人员将看到,合成缓冲器可以是任何尺寸的,并由此需要重复应用所描述的过程。
合成模块612还采用工作缓冲器,此缓冲器大得足以储存单个像素的任何中间合成结果。这些缓冲器可以在ASIC内形成以便硬件实现,或者可以在一般存储器内形成以便软件实现,并且一般具有红色、绿色、蓝色和α(透明)成分。
7.2.Z-级填充每个Z-级包含对填充的引用,其可以是下述类型之一。
实心填充是颜色值和α值在像素流的长度上保持恒定的一种填充。实心填充的实例是不透明的红色填充或具有50%α的蓝色填充。
X依赖型填充是颜色值在像素流上不是必需恒定的一种填充。在此定义中,x依赖型填充在像素流上具有恒定的α值。X依赖型填充的实例包括在所有的混合控制点具有相同α的线性或径向混合,或者位图纹理的填充(具有恒定的α)。
可变α填充是α在像素流上可以改变的一种填充。可变α值填充的实例包括α在每个混合控制点是不一样的线性或径向混合,或者具有不恒定的α的位图纹理的填充。
7.3.基本流程合成算法的基本流程在图13中示出。这是高级概述,并且随后将提供对一些步骤的更详细描述。
第一步骤110是测试看输入组是否是空的。如果该组是空的,则意味着不存在填充,并且它是应该绘制的背景填充,这在步骤111生成。然后完成合成过程。
如果输入组不是空的,那么下一个步骤112就确定,有序的Z-级输入组是否包含被分类为可变α的任何填充。在合成算法中,它是感兴趣的最顶部的可变α填充。通过在有序的输入Z-级组一个一个地进行迭代、对可变α填充进行测试,来执行此检查。优选的顺序是迭代有序组,以便所检查的第一要素是最顶部的填充。当已经发现第一可变α填充,或者已经检查了整个组并且没有发现可变α填充时,就终止检查。
下一个步骤113对在步骤112发现的最顶部的可变α填充之上的所有填充进行影响计算。如果不存在可变α填充,那么就时存在于有序输入组中的所有填充进行此影响计算。
决定114是下一个步骤。如果在步骤112发现可变α填充,那么在步骤115执行处理。否则就在116执行处理。
在不存在可变α填充的情形中,步骤116将合成缓冲器初始化为空的。
步骤115执行最顶部的可变α填充之下、包括该最顶部可变α填充的所有填充的自底到上的合成。其次,在步骤117,计算在步骤115自底向上合成的所有填充的总影响。
步骤118利用自顶向下的合成,来合成最顶部的可变α填充之上的所有填充。
最后的步骤119生成适合在输出显示器件上表现的输出像素。
7.4.图形概述这个处理的各个阶段在图9(a)和9(b)以及图10以图形的方式示出。这些图证实不同的合成情节。
图9(a)表示出一个简单实例。示出了有序的输入填充70,71,72组。这些填充中的每一个都是实心填充。执行影响计算,并且在67,68和69表示出各个实例的影响。不存在可变α填充,因此下一个过程是自顶向下的合成。将结果储存在工作缓冲器73中,然后将该结果复制必要的次数,以便产生所需的输出像素流74。在此实例中,产生一个四像素流。
图9(b)的第二情节包括x依赖型填充。填充75和77都是实心填充,而填充76是x依赖型的。执行影响计算,并且结果如80,81和82所示。由于不存在可变α填充,因此所执行的下一个过程是自顶向下的合成。产生x依赖型填充76的像素,并将这些像素合成为合成缓冲器79,而实心填充75和77的颜色生成并合成为工作缓冲器78。工作缓冲器和合成缓冲器的分别都在图中示出。最后的步骤是通过将工作缓冲器的单个像素合成为合成缓冲器的每个像素,而产生输出像素,即产生输出像素83。
图10的最后实例更加复杂,并且包括可变α填充。填充84是实心填充,填充85是x依赖型填充,填充86是可变α填充,填充87是实心填充。在影响计算之后,填充84和85具有与它们有关的影响值(分别表示为88和89),并且可变α填充86之下并且包括可变α填充86的每一个都不执行。将要执行的下一个过程是自底向上的合成。将填充86和87自底向上合成,并将结果储存在合成缓冲器92(c1)中。在自底向上合成之后,通过将填充88和89的影响从100%中简单地减去,可完成储存在合成缓冲器中的结果的影响。下一个步骤是自顶向下的合成。最顶部的填充84是实心填充的,并由此被合成为工作缓冲器95。填充85是x依赖型的,并由此被合成为合成缓冲器97(c2)。在自顶向下的合成步骤之后,可看出,工作缓冲器95包含单个填充84的合成结果,合成缓冲器97(c2)包含填充85,86和87的合成结果。最后的阶段是产生输出像素。工作缓冲器的单个像素被合成为合成缓冲器的每个像素,从而产生输出像素。
7.5.影响计算参照图11更详细地检查图13的步骤113。回顾,该过程是针对诸如在步骤112中发现的最顶部可变α填充之上的有序输入Z-级组中的所有填充执行的。如果输入组中不存在可变α填充,那么该过程就针对输入组中的所有填充执行。如果最顶部的可变α填充也是输入组中的最顶部填充,那么就无需执行影响计算。
影响计算为此过程处理的每个填充引入一个新的变量。这就是填充的影响值。总是将此值初始化为0影响值。例如,可利用8位整数来储存该影响值,其中0代表零影响,255代表100%影响。影响计算的目的是确定,每个填充有多少影响到输出像素。
此处介绍两个变量即累积的不透明度和覆盖率。覆盖率是与正在处理的填充相关的A缓冲的空间元素目前正在考虑的描述。便利的是,将覆盖率表达为A缓冲。累积的不透明度是所考虑的空间元素被当前填充之上的填充遮蔽的范围的测量值。在下面的讨论中,0%的累积不透明度是指完全透明,而100%的累积不透明度是指完全不透明。这两个变量以及正在处理的当前填充的指示,构成描述影响计算算法状态的一组参数。“堆栈”的概念,如本领域内所公知的,用来储存能够被影响计算算法读取并据此运作的这三参数组。在下面的描述中,术语“压入”的意思是,将一组参数添加到堆栈的顶部,“出栈(pop)”的意思是,将堆栈顶部的这组参数删除。堆栈将被称作参数堆栈。
图48表示出当按序自顶向底渲染时,A缓冲中累积不透明度的效果。部分目标A4800、B4801、C4802和D4803的每一个都具有可添加到相应的A缓冲中的某些空间元素上的不透明度值。注意,100%的不透明度的意思是,目标完全不透明。目标渲染到具有0%不透明度(即100%透明度)的背景目标4804上。在图48中,黑影表示目标在A缓冲的相关子像素上的覆盖率。最初,将目标A4800添加到背景4804中展现了结果4805。由于A的仅仅两个空间元素是35%的不透明度,因此目标A4800的影响仅为所合成的像素值的17.5%。注意,0%的不透明度给出0%的影响。累积不透明度如图所示分解成树状,其中树枝的数目被局限为屏蔽中的子像素数目,在这种情况下是四个。目标A4800添加到背景4804中的两个结果4806和4807在图中示出。其次,当时间目标B4801时,这样的操作仅对A缓冲的较低两个空间元素进行。由于左下方的空间元素4808与目标A的相交,因此这两个影响将累积,而对于右下方的空间元素4809来说,目标A4800没有影响,因此空间元素这个阶段的结果将局限于目标B4801的结果。由图示的计算确定目标B的净影响为16.5%。据此,在施加目标B之后,空间元素的不透明度分别为,在4810为61%,在4811为35%,在4812为40%,以及在4813为0%。目标C4802具有100%的不透明度,并且影响给出结果4814,4815,4816和4817的右边两个空间元素,借此指示出对像素的40%影响。由于目标C是完全不透明的,因此不需要考虑任何较低的目标(目标D),其中这样的目标可与目标C相交。结果,对于右边的空间元素来说,树枝终止于目标C。目标D4803具有100%的不透明度,并且如4818,4819,4820和4821所示,对像素提供26%的影响。从图48看到,用活动图形目标的不透明度值确定的累积影响相加到100%。
对于图48的A缓冲来说,可如下表达所得到的部分

从图48中看到,对树进行遍历,其中用子像素屏蔽(A缓冲)的尺寸来确定级数。进一步如关于目标C 4802所看到的,只要达到100%的不透明度,树的任何枝的遍历都停止了,因为对于该子像素没有实施进一步的影响。
现在返回到实际处理,图11的第一步骤98用于初始化参数。当前的填充被初始化为输入组中的最顶部的填充。累积不透明度被初始化为0%,覆盖率被初始化,以便代表A缓冲的总覆盖率。将这个参数初始组压入到参数堆栈。此外,将要处理的所有填充的所有影响值都被初始化为0。
主处理环的最初步骤99使来自参数堆栈的下一组参数出栈。为此在步骤100检查空结果。如果是没有更多的参数组存在于堆栈上的情形,那么影响计算就结束。如果参数组成功地从堆栈中出栈,那么下一个步骤101将计算当前填充的影响,该当前填充给出当前的累积不透明度和覆盖率,并将此加到当前填充的总影响值中。按照如下公式执行计算当前影响=当前α*(1-累积不透明度)*覆盖率其中当前α=当前填充的α值累积不透明度=诸如当前参数组中给出的累积不透明度覆盖率=活动比率(覆盖∩A-缓冲器)A缓冲=与当前填充相关的A缓冲,以及活动比率(A缓冲)=给定A缓冲中的活动空间元素的数目在给定A缓冲中的空间元素总数中的比率。
注意,主公式的所有元素都意指被表达为具有范围
的实数的值。这是对此公式的表达的简化,并且本领域的技术人员明白,为了容许这些元素的其它表达方式,如何操纵该公式。在当前覆盖率的情形中,
的范围表示具有当前填充的A缓冲的覆盖率A缓冲交集中的‘活动’空间元素数目与A缓冲中的空间元素总数的比例。
然后,将这个所计算的当前影响值添加到当前填充的影响值中。
图11的过程的下一个步骤102检查,是否有下一个填充需要处理。如果当前填充是输入组中的最后填充,或者如果下一个填充是可变α填充,那么此检查就有负结果。然后将此过程的执行返回到步骤99。如果检查结果是正的,那么就更新当前的填充,以便识别此下一个填充。
在下一个步骤103中,将一组参数压入到参数堆栈。这些参数是当前填充←当前填充累积不透明度←累积不透明度覆盖率←覆盖率∩(覆盖率∩A缓冲)下一个步骤104将根据如下来更新
当前填充←当前填充累积不透明度←(1-当前α)*(1-累积不透明度)覆盖率←覆盖率∩A缓冲注意,累积不透明度和当前α意指被表达为具有范围
的实数的值。
施加到覆盖率上的操作的图形指示在图12(a)-12(d)中示出。A缓冲107提供了代表覆盖率的实例。第二实例A缓冲106代表填充的A缓冲。当施加如在步骤103中给出的产生新覆盖率A缓冲的操作时,结果就是A缓冲108。当施加如在步骤104中给出的产生新覆盖率A缓冲的操作时,结果就是A缓冲109。
一旦此更新已经发生,就测试累积不透明度,看看是否已经获得足够的不透明度。实例的阈值是完全不透明度的255/256。如果已经达到足够的不透明度,那么该过程的执行就返回到步骤99。否则,该过程的执行从步骤101继续进行。
7.6.自底向上的合成回来参照图13,如果在步骤114的输入组中已经检测了可变α填充,那么就执行自底向上的合成步骤115。
自底向上的合成过程按从最底部向上到最顶部的可变α填充(并包括此填充)的顺序,来合成填充。当下面的讨论提到‘下一个’填充时,这是指紧接当前填充之上的填充。
自底向上的合成过程需要存取填充生成缓冲器。此缓冲器必须能够储存至少与像素一样多的合成缓冲器。例如,通过采用一半的合成缓冲器,可实现此缓冲器。这样平分了合成缓冲器的尺寸,并且在大于合成缓冲器原始长度的一半的输出流情形中,需要第二次应用合成模块612。
参照图6,所描绘的自底向上的合成过程是,第一步骤50将背景填充合成为合成缓冲器。因为这确保是被合成为合成缓冲器的第一填充,所以不需要具体的计算。刚好复制填充颜色。为了第一执行下一个步骤,当前填充被认为是背景填充。
下一个步骤51测试看看是否有需要自底向上合成的下一个填充。如果当前的填充是最顶部的可变α填充,那么就不会再有填充进行自底向上的合成,并且自底向上的合成过程移动到倒数第二个步骤55。
在步骤55自底向上合成的结果影响的确定,是按照以下算法执行的总影响=0对于最顶部的可变α填充来说总影响=总影响+填充[n].影响自底向上的部分=1-总影响其中填充[n].影响=最顶部可变α填充之上的第n个填充的影响值,如在流程图13的步骤113中所计算的。
一旦已经计算自底向上的合成结果的影响值,就按照以下算式将其扩增成合成缓冲器对于合成缓冲器内的每个像素来说cb[n]=cb[n]*自底向上的影响其中cb[n]=合成缓冲器的第n个像素标量值(自底向上的影响)乘以颜色值(cb[n])的以上表达式,是指颜色的所有成分的标量的乘积。
如果步骤51确定,还有填充需要自底向上的合成,那么就经步骤52将当前的填充设定为下一个填充。然后测试当前填充,看看其是否是步骤53中的x依赖型填充。如果此填充不是x依赖型填充,那么就按照步骤54将填充颜色生成为工作缓冲器。然后,利用以下算式将工作缓冲器的内容合成为合成缓冲器对于合成缓冲器中的每个像素来说cb[n]=cb[n]+工作α*(cb[n]-工作)其中eb[n]=合成缓冲器的第n个像素工作α=工作缓冲器中的像素的α工作=工作缓冲器中的像素然后,自底向上的合成的执行返回到步骤51。
如果填充是x依赖型的,那么就在步骤56中将像素流的所有像素生成填充生成缓冲器。然后在步骤57中,利用以下算式将填充生成缓冲器合成为合成缓冲器对于合成及填充缓冲器中的每个像素来说cb[n]=cb[n]+fb[n].α*(cb[n]-fb[n])等式1其中cb[n]=合成缓冲器的第n个像素fb[n]=填充缓冲器的第n个像素fb[n].α=填充缓冲器中的第n个像素的α然后,自底向上的合成的执行继续到51。
7.7.自顶向下的合成自顶向下的合成过程,在图13中的步骤118示出,现在参照图55进行详细描述。将其应用于如在步骤112中所确定的最顶部可变α填充之上的所有填充。如果输入组中不存在可变α填充,那么自顶向下的α过程就应用于输入组中的每个填充。
自顶向下的过程采用填充的影响值,如在步骤113所计算的。应该注意,在自顶向下的合成过程中,处理填充的顺序对于最后的结果是不重要的。在以下的实例中,填充以与在输入组中相同的顺序进行处理,其始于组中的最顶部填充。
如图55所示,自顶向下的合成过程的第一步骤601将确定,是否还有填充需要处理。如果没有下一个填充需要处理,或者下一个填充是最顶部的可变α填充(如在步骤112中所确定的),那么该过程就移动到步骤607。
如果还有填充需要处理,则在步骤602将当前填充储存在可变的当前填充中。下一个步骤604将检查当前填充的影响值,看看其是否大于0。如果此测试返回失败,执行就移动到步骤601。
如果影响值大于0,执行就移动到步骤603。步骤603测试当前填充,看看其是否描述x依赖型填充。如果填充不是x依赖型的,执行就移动到步骤606。否则,如果步骤603回到正的结果,执行就移动到步骤605。
在步骤606操纵非x依赖型填充,如下进行。生成填充的颜色,并按照以下算式合成为工作缓冲器wb=wb+当前填充.影响*当前填充.颜色 等式2(wb=wb+current_fill.contrib*current_fill.color)其中wb=工作缓冲器,当前填充.影响=当前填充的影响值,当前填充.颜色=当前填充的颜色值。
在步骤605操纵x依赖型填充,如下进行。当x依赖型填充的每个像素生成时,就按照以下算式将其立即合成为合成缓冲器cb[n]=cb[n]+当前填充.影响*gp(cb[n]=cb[n]+current_fill.contrib*gp)其中cb[n]=合成缓冲器的第n个像素,当前填充.影响=当前填充的影响值,以及gp=所生成的被考虑的填充像素。
在步骤605或步骤606完成之后,执行就回到步骤601。
如果步骤601确定,不再有填充需要处理,执行就移动到步骤607。在此步骤,将工作缓冲器合成为合成缓冲器,从而产生最后结果。按照以下算式执行此步骤对于合成缓冲器中每个像素来说cb[n]=cb[n]+wb其中cb[n]=合成缓冲器的第n个像素,wb=工作缓冲器。
现在完成自顶向下的合成,并且合成缓冲器包含输出流的充分合成像素。
7.8.另一种合成方法以下描述另一种合成方法。这种方法在遇到可变α层时,无需进行潜在的大的自顶向上合成,而是利用自顶向下的合成过程,无论什么情况下,由此使自顶向下合成提供的益处最大化。
影响计算过程如上所述,在遇到最顶部的可变α层时停止。这种合成方法检查看看此最顶部的可变α层之下是否有一层存在。如果有,那么就回归地调用合成器,其中最顶部的可变α层之下的这个层是新调用中的最顶层。这个新调用以及任何后序调用,常规地处理这些层,并且当它们达到完全不透明时,就将像素常规地生成工作和合成缓冲器。当任何回归的调用组返回到母体时,就将母体中发现的可变α层与合成缓冲器中的结果合成。然后计算工作缓冲器和合成缓冲器中的结果的影响(诸如在图6的步骤55中),并由此调整这些缓冲器中的像素值。
对于像素流来说,这些合成方法的一个概括如下所述(i)将这些层分成几组,每一个组被可变α层分开;(ii)对每一组执行自顶向下的合成,以便确定一组像素值,借此将原始层分解成包括由可变α层分开的组像素值的减小数量;(iii)当任何一组的影响在100%(即完全不透明)的预定阈值之内时,所有可变α层和该阈值组之下的组可被忽略为无影响的;以及(iv)对像素流中的每个像素,执行这些影响组和可变α层的自底向上的合成,以便确定相应的像素值。
利用以下方式用两个缓冲器完成合成过程的进一步执行(i)用最顶层开始着手,并利用第一缓冲器,执行向下到第一可变α层(包括此层)的自顶向下的合成;(ii)利用第二缓冲器,执行向下到下一个可变α层(包括此层)的这些层的自顶向下的合成;(iii)在第二缓冲器之上合成第一缓冲器,并在第一缓冲器中保留结果;以及(iv)重复步骤(i)和(ii),直到所有的层都已经合成为止。如其所述,当可变α层之上的任何一组层的影响在100%(即完全不透明)的预定阈值之内时,所有可变α层和该阈值组之下的组可被忽略为无影响的,并且合成能够停止。
注意,上述进一步的执行将不正确地描绘图像,因为可变α层的渐近相容不正确地考虑了来自较低组的层的影响。例如,如果向下到(但不包括)第一可变α层的所有顶层的影响是80%,那么第一可变α层和所有较低层的影响应该是20%。第一可变α层与上述这些层的合成将扭曲影响的平衡,从而不正确但是较快地合成。同时这对于最终的图像渲染是不需要的,这对于图像结构的预览阶段是足够的,其中不需要所有层的准确细节。
预定阈值一般取决于合成结果的所需精度和待执行的操作数目。这诸如可以在颜色通道内的最低有效位,对于8位颜色给出了255/256(99.6%)的影响。可以选择其它阈值。
图61(a)表示出对像素流内的许多层的自顶向下的合成执行的概述。如图所示,许多层6101-6107被示出具有不同的类型。一种类型是可包括恒定α成分的恒定颜色级。这些是级6101,6102,6104和6106。另一种类型的级是可变的颜色级但具有恒定的α。这样的一个实例是在像素流之上出现的线性混合。再者,因为α值是恒定的,所以其被认为是单个的可变颜色,并且这样的实例是级6103和6105。最后一种级(它的实例是级6107)是包括可变颜色和可变α的级。鉴于其性质,此级被概述为可变α级,并进行操作,以便在像素跨距的渲染中改变此级之下的所有级的影响。
图61(a)的规则是,利用自顶向下的合成,可变α级之上的所有级(每个具有恒定的α)都可自顶向下的合成,以便提供单个的颜色级,此颜色级根据原始的来源级,可以是可变的颜色级。鉴于代表级6101-6106的自顶向下的合成的新颜色级6108,示出了此概述。将级6108放到前一个可变α级6107之上。
图61(a)如此显示,具有恒定α成分的任何数目的级可以进行自顶向下的合成,以便提供恒定α的单个级(例如6108),此单个级然后在具有可变α的级之上进行合成。
图61(b)表示出此规则是如何应用于结合许多层的合成堆栈的,其中可变颜色层的组6110,6112和6114每个都被可变α层6111和6113分开。在这样的布置中,具有可变颜色恒定α的层的每一组可进行自顶向下的合成,以便产生恒定α的相应单层,这些层是作为新层6115,6116和6117示出的。然后,这些每个新层可与它们相应的插入可变α层6111和6113在自底向上的合成中进行合成,以便提供像素流的准确合成。最显著的是,通过将合成操作分成尽可能多的自顶向下的合成,而使合成操作的数目在像素流上最小。关于这一点,由于任何可变α级的操作,因此这使得像素流中的每个像素的合成为为必要的。如此,自顶向下的合成与其次的自底向上的合成的组合,提供了以前没有的最佳方式。
图62中示出了此原理的延伸,其中利用各个层6201-6212(包括恒定颜色、可变颜色和可变α层的组合)形成像素跨距的合成堆栈6200。根据变量,仅利用自顶向下的合成操作来组合合成堆栈6200,从而为像素流提供像素值。实质上,堆栈6200被分成几个部分,每个部分都用可变α层描绘。在这种布置中,对向上到第一可变α层(包括该层)的第一组(这组是层6201-6204)执行自顶向下的合成6213。将合成的结果保留在第一缓冲器6214中。然后,对向上到下一个可变α层(包括该层)的下一个组(这组是层6205-6207)执行第二个自顶向下的合成6215。将合成6215的结果储存在第二缓冲器6216中。然后,使包含在缓冲器中的合成结果与在第二缓冲器6216之上进行合成的第一缓冲器合成到一起,并且此合成的结果被写回到第一缓冲器内(在图62中的6217示出)。然后,下一组层6208-6211再与储存在第二缓冲器6219中的合成值进行自顶向下的合成6218。再者,使第一缓冲器6217在第二缓冲器6219之上进行合成,以便给出储存在第一缓冲器中的结果6220。最后,在图62的实例中,仅包括恒定颜色层6212的最后这组层然后进行自顶向下的合成6221。在这种情形下,由于这组层仅包含一个恒定颜色,因此合成操作有效地是空的,并将层6212的值复制到第二缓冲器6222内。再者,缓冲器与保留在第一缓冲器中的最后结果6223一起合成。
从图62的描述中意识到,对自顶向下合成的依赖并不一定确保,最后的合成结果对于像素的特定跨距来说是完全正确的。然而,本发明人已经确定,可以为合成操作建立所需的精度级,以便能够产生最后的合成结果,从而确定准确度的水平。这暗示非常快速的合成是必要的,可能的话以图像质量为代价。这样的实例是,诸如由图形专家实施的预览图形的生成过程。其它执行可以是合成过程能够在具有可变处理容量的许多不同平台上进行。具体地说,当规定合成时间的要求时(例如在实时操作中),合成堆栈的复杂性可用来触发特定类型的合成(例如,图61(a)-准确但较慢,或者图62-较快但可能不太准确),以便满足系统的要求。
又一种方法在图64中示出,并且由于无需自底向上的合成而对以前描述的布置是一个改进。自顶向下合成的专门使用使自顶向下合成的益处得到大大开发,即当不透明度足以接近100%时就早早地从过程中退出。与图9和62的方法相比,这种替代方法的成本是,需要一个额外的工作缓冲器(此处称作“工作缓冲器2”)。这个新的工作缓冲器与工作缓冲器1(例如78)具有相同的元素,但是每个元素是rgbo而不是rgb(r=红色,g=绿色,b=蓝色以及o=不透明)。
在操作中,合成堆栈利用可变的不透明层分成几个部分。工作缓冲器0(例如73)和工作缓冲器1与以前的执行一样,在最上部分使用。然后,工作缓冲器1在第一可变的不透明层之上进行合成,并将结果储存在工作缓冲器2中。然后,工作缓冲器0和1以与施加到最顶部分相同的方式,施加到下一个最低部分上,只是在结束时(a)工作缓冲器1之上的工作缓冲器2被储存在工作缓冲器2中,以及(b)下一个可变的不透明层之上的工作缓冲器2被储存在工作缓冲器2中。
参照图64的合成方法6400,步骤6401合成来自合成堆栈的固定颜色,从而形成工作缓冲器0中的固定颜色。步骤6402将两种可变颜色合成为工作缓冲器1。步骤6403合成工作缓冲器1之上的工作缓冲器0,并将结果储存在工作缓冲器2中。这些步骤实质上与前述方法对应。在步骤6404,工作缓冲器1在第一可变的不透明层之上进行合成,并将结果储存在工作缓冲器2中。步骤6405以前述的方式进行操作,以便合成下两种固定颜色,只是它们的影响局部保留在工作缓冲器0内。然后,步骤6406合成工作缓冲器0之上的工作缓冲器2,并将结果储存在工作缓冲器2内。步骤6407合成工作缓冲器2,该缓冲器是下一个可变不透明层之上的可变不透明颜色,并将结果储存在工作缓冲器2中。步骤6408-6410有效地重复步骤6401-6403。步骤6411重复工作缓冲器1之上的工作缓冲器2,并将结果再次保留在工作缓冲器2中。步骤6412通过处理下一个可变不透明层之上的工作缓冲器2,而完成合成过程,将最后结果保留在工作缓冲器2中。
如此,此方法表现出能够针对可变的不透明层,同时保持合成堆栈自顶向下的遍历。当累积不透明度达到预定的阈值时,如上所述,就实现从方法6400中早早退出。在计算累积不透明度时,将可变不透明层的不透明度影响作为0来安全地采集。或者是,可假设,每个可变不透明层的不透明度影响是诸如通过检索具有最小不透明度的可变不透明层内的像素而获得的最小值。此原理的进一步延伸是,跟踪遍历整个堆栈的整个合成的不透明度影响作为矢量(例如基于每个像素),以便像素的累积不透明度基于个体达到预定的阈值,借此导致早早地退出。
7.9.自顶向下的优点上述自顶向下的合成技术比自底向上的技术优越。自顶向下的技术在将两层合成到一起所要求的计算量方面更有效。参照第7.6和7.7部分中表示的公式1和2,能够看出这一点。
自顶向下的合成还具有显著的优点,即,一确定后序的合成操作对输出不具有可视效果,就使合成过程终止。这种“早早地终止”在实践中是经常发生的,并导致性能增大。
8.像素的生成图56的像素生成模块611涉及到产生单个Z-级的像素值流。
为了产生输出像素,合成模块612将Z-级颜色值合并。合成模块612所合并的源颜色值由某一形式的填充描述明确限定或必须由其产生。固定颜色填充的Z-级明确限定出准备用于合成的源颜色值。复杂填充类型的Z-级,例如梯度(线性或径向的)和位形填充,要求源颜色值以取决于将要生成的像素的光栅空间位置的方式产生。确定复杂填充的Z-级的源颜色值的这个过程,被称作像素的生成,是由像素生成模块611执行的。
图39概括出像素生成模块611的处理流程。作为输入,模块611在步骤393配有光栅空间中的起点和终点部位,以及包含所需填充描述的复杂Z-级引用。根据在步骤394和395确定的Z-级的填充类型,比较器将产生以下任一因素的颜色值流-步骤396中的线性梯度;-步骤397中的径向梯度;以及-步骤398中的位图填充。
将所生成的颜色值储存在合成缓冲器或填充缓冲器中,以便准备用合成模块612进行合成。现在给出每种填充类型的颜色生成细节。
8.1.线性梯度像素生成Z-级可具有线性梯度填充。在本领域,线性梯度填充经常被称作线性混合。线性梯度填充包括用颜色值遮蔽表面,所述颜色值取决于被遮蔽的点与特定虚线的垂直距离。
可利用梯度查寻表来描述线性梯度。梯度查寻表规定一些索引值范围之上的梯度的颜色值。梯度查寻表是作为一个或多个梯度查寻表条目的有序组实现的。每个梯度查寻表条目包括索引值和相应的颜色值。梯度查寻表条目按从最低到最高的索引值来排序。
参照图25,该图表示出梯度查寻表260。可看到,梯度查寻表260的索引值范围从0-255(包括0和255)。梯度查寻表260包括两个梯度查寻表条目261和262。第一个梯度查寻表条目261规定63索引值处的白色值。第二个梯度查寻表条目262规定191索引值处的黑色值。
对于两个梯度查寻表条目之间的索引值,可利用两个周围梯度查寻表条目的颜色值的线性插值,计算相应的颜色值。对于小于所有梯度查寻表条目的最小索引值的索引值,或者对于大于所有梯度查寻表条目的最大索引值的索引值,通过直接利用具有最接近索引的梯度查寻表条目的颜色值,可确定相应的颜色值。
例如,在图25中,分别利用条目的白色和黑色值的线性插值,来确定对应于两个查寻表条目261和262之间的索引值的颜色值。继续该实例,对于第一查寻表条目261的索引值之下的索引值(即索引值50),相关的颜色值是最近查寻表条目的颜色值(因此是白色值)。反之,对于最后查寻表条目262的索引值之上的索引值(即索引值255),相关的颜色值是最近查寻表条目的颜色值(因此是黑色值)。
当用梯度填充产生光栅像素的颜色值时,必需计算对应于像素位置的梯度查寻表内的索引。为了执行这一点,将像素的光栅空间坐标部位变换成梯度空间。为了将梯度空间映射到查寻表索引范围内,限定梯度空间的表面是有用的。梯度空间表面上的每个点映射到特定的梯度查寻表索引中。利用索引值和梯度查寻表,可确定光栅像素的颜色值。
对于线性梯度,梯度空间表面以仅取决于梯度空间表面内一个点的水平位置的方式,将该点映射到索引值中。这意味着,对于线性梯度,无需计算梯度空间中的此位置的任何垂直分量。为了改变光栅空间中的线性梯度的外观,需要修正诸如梯度的位置、比例换算和旋转之类的参数。为了达到这样的效果,可利用梯度到光栅空间的变换将线性梯度空间表面变换成光栅空间。
图25还表示出集中在梯度空间原点的宽度32768的正方形梯度空间表面263的实例。利用上述的线性梯度技术,表示出此梯度空间表面上的颜色值,由此,颜色值仅取决于水平梯度空间的位置。图25表示出映射到光栅空间器件264以便输出的此梯度空间表面263。可看到,此映射包括梯度空间表面的一些旋转和比例换算。
通过递增地跟踪梯度查寻表内的索引,可渲染线性梯度填充。这样的技术包括预先计算取决于梯度到光栅空间的变换的三个参数。参照图32,给出包括梯度查寻表和梯度到光栅空间的变换的线性梯度描述,在计算任何输出像素颜色值之前,可在步骤311计算-光栅空间水平方向上的每个像素阶的梯度空间水平位置变化 -光栅空间垂直方向上的每个像素阶的梯度空间水平位置变化 以及-对应于光栅空间原点的梯度空间位置uo。
这些预先计算值取决于梯度到光栅空间的变换,并且在修正变换时仅需要重新计算。
图27表示出这些梯度跟踪参数的图形表现形式。在图27中,可看到光栅空间X-Y269的光栅输出设备的显示。限定在梯度空间U-V270中的梯度被光栅化成光栅器件空间269。光栅器件的光栅扫描线267将包含始于扫描线内的起点像素268的梯度填充的像素流。对于正向水平光栅空间方向上的单个光栅像素阶,表示出梯度空间水平位置的相应变化 271。对于正垂直光栅空间方向上的单个光栅像素阶,表示出梯度空间水平位置的相应变化 273。在图中,还表示出对应于垂直梯度空间位置的相似参数272,274。这些值的计算并不是线性梯度所要求的。
由此继续进行,从而产生一个或多个邻接像素的线性梯度像素颜色值,所述像素形成将要输出到填充生成缓冲器中的像素流。给出待生成的像素流中的最左侧光栅像素的光栅空间坐标位置(xstart,ystart),必需在图32中的步骤312首先将梯度空间水平位置初始化。在图27中,在268表示出待生成的像素流中的最左侧光栅像素的实例。可利用以下公式计算初始值uu=uo+xstart×∂u∂x+ystart×∂u∂y.]]>因此,通过直接利用此值,可确定梯度查寻表内的实际索引。利用这样的索引值,如以上在步骤313中所述的,确定来自梯度查寻表的相应颜色值。
在生成像素的颜色值之后,如果在用线性梯度产生的像素流中还有更多的像素颜色值,那么如在步骤310中所确定的,梯度空间水平位置值可以按照以下的循环关系在步骤315中递增。
un=un-1+∂u∂x.]]>此过程进行重复,直到像素流中的所有需要的像素产生为止。随后,如果有多个利用相同线性梯度渲染的像素流(如在步骤314中所确定的),那么可如下重复同一过程首先在步骤312重新计算新像素流的起点像素的初始梯度空间水平位置u,以便渲染,然后,在步骤313重复像素流的每个像素的像素颜色值的产生过程。
8.2.径向梯度像素的生成Z-级可具有径向梯度填充。径向梯度填充还称作径向混合。径向梯度填充被认为是利用颜色值遮蔽表面,所述颜色值取决于待遮蔽的点与径向梯度的特定中心点之间的距离。径向梯度像素的生成过程类似于如前所述的线性梯度像素的生成过程。
与线性梯度一样,径向梯度可利用作为有序的一个或多个梯度查寻表条目组来执行的梯度查寻表进行描述。径向梯度也采用梯度空间表面。再者,梯度空间表面上的每个点映射到特定的梯度查寻表索引。再者,可以线性内插两个梯度查寻表条目的颜色值,以获得没有明确规定在查寻表中的索引的颜色。
对于径向梯度,梯度空间表面以取决于一个点与梯度空间表面中心点之间的距离的方式,将该点映射到索引值中。为了改变光栅空间中的径向梯度的外观,需要修正诸如径向梯度的中心点和比例换算之类的参数。为了达到这样的效果,可利用梯度到光栅空间的变换将径向梯度空间表面变换成光栅空间。
以传统方式渲染径向梯度在计算上是昂贵的。一般,必需将每个像素的坐标变换成梯度空间,然后计算梯度空间点与梯度空间中心之间的距离,最后查阅对应的颜色值。然而,当用径向梯度产生光栅像素的邻接序列时,通过利用计算梯度查寻表索引的增量方法,可改善性能。
参照图42,在计算任何输出像素颜色值之前,给出包括梯度查寻表和梯度到光栅空间的变换的径向梯度描述,可在步骤414计算(i)光栅空间水平方向上的每个像素阶的梯度空间水平位置变化, (ii)光栅空间水平方向上的每个像素阶的梯度空间垂直位置变化 (iii)光栅空间垂直方向上的每个像素阶的梯度空间水平位置变化 (iv)光栅空间垂直方向上的每个像素阶的梯度空间垂直位置变化 (v)对应于光栅空间原点的梯度空间位置(uo,vo)。
这些预先计算值取决于梯度到光栅空间的变换,并且在修正变换时仅需要重新计算。利用这些预先计算值对梯度查寻表索引平方(索引2)进行递增跟踪。在光栅扫描渲染的具体执行中,索引等于从径向梯度的中心点到正在渲染的像素位置的距离。
图27示出了梯度跟踪参数的图形表现形式。应该注意,虽然该图描绘出线性梯度填充,但是其内容同样可应用于径向梯度的生成。在图27中,可看到光栅空间X-Y 269的光栅输出设备。限定在梯度空间U-V270中的梯度被光栅化为光栅器件空间269。光栅器件的光栅扫描线267将包含始于扫描线内的起点像素268的梯度填充的像素流。对于正向水平光栅空间方向上的单个光栅像素阶,表示出梯度空间水平位置的相应变化 271,和梯度空间垂直位置的相应变化 272。对于正垂直光栅空间方向上的单个光栅像素阶,表示出梯度空间水平位置的相应变化 273,和梯度空间垂直位置的相应变化 274。
然后继续进行,以产生一个或多个邻接像素的像素颜色值,所述像素形成将要输出到填充生成缓冲器中的像素流。给出起始像素的光栅空间坐标位置(xstart,ystart),首先进行相应初始梯度空间位置(ustart,vstart)的计算。在图27中,在268表示出此起始光栅像素的实例。可利用以下公式计算相应的初始空间梯度位置ustart=uo+xstart×∂u∂x+ystart×∂u∂y]]>vstart=vo+xstart×∂v∂x+ystart×∂v∂y]]>由这些计算,在图42的步骤415中确定用来保持梯度查寻表内的索引的初始跟踪值。更具体地说,如下计算初始梯度查寻表索引的平方(index2,索引2),和此索引值平方的初始增量值 index2=ustart2+vstart2]]>∂(index2)∂x=2×(ustart×∂u∂x+vstart×∂v∂x)+(∂u∂x)2+(∂v∂x)2]]>一旦计算出索引2值,就可以开出其平方根,以便利用如其所述的梯度查寻表在步骤416中查阅相应的颜色值。
在产生像素的颜色值之后,如果在用径向梯度(如在步骤417中所确定的)产生的像素流中还有更多的像素颜色值,那么就按照以下的循环关系在步骤418中使索引2和 递增。
index2n=index2n-1+∂(index2n-1)∂x]]>∂(index2n)∂x=∂(index2n-1)∂x+2×{(∂u∂x)2+(∂v∂x)2}]]>应该注意,2×{(∂u∂x)2+(∂v∂x)2}]]>值是恒定的,并且可以预先计算。
此过程重复进行,直到当前像素流中的所有需要的像素产生为止。随后,如果利用相同的径向梯度有进一步的像素流需要生成(如在步骤419中所确定的),那么通过返回到步骤415并重新计算新像素流的起点像素的初始索引跟踪值,可重复同一过程。总之,一旦初始跟踪值已经计算,此技术就通过实施每个像素恰恰两个加法和一个方根,而使径向梯度沿像素流渲染。
按照“Reciprocation,Square Root,inverse Square Root,andSome Elementary Functions Using Small Multipliers”M.D.Ercegovacet,al,IEEE Transactions on Computers,Vol.49,No.7,July 2000中描述的方法,利用单个的65K条目查寻表,或者更有效地以及为了具有相同的精度,利用两个256条目查寻表,可快速进行平方根计算。
所描述的方法按光栅扫描顺序从左上方到右下方地渲染径向梯度像素。也就是说,其以从显示器的顶部到显示器的底部的方式来渲染扫描线,并且其从左向右地渲染扫描线内的像素。适当修正的相同技术同样可应用于操作的其它光栅扫描顺序中。关于这一点,将光栅扫描顺序规定为二维空间的任何一维扫描。优选的是,光栅扫描顺序是从左上方到右下方。
应该观察到,所描述的径向梯度生成方法适合其它应用。通常,所描述的方法适合用一组二维输入值生成任意组结果值,其中输入值序列都位于直线上,并且每个结果是用功能输入所描述的矢量大小的函数。更具体地说,所描述的方法适合计算一离散组位置处的径向功能值,其中这个离散组部位是光栅扫描顺序的离散组。径向功能可以被规定为映射到结果值(或值组)上的两个变量的任何函数,而结果值是输入与2D空间内的特定位置之间距离的函数。
8.3.位像像素的生成Z-级可具有位像填充。这一点意味着,Z-级填充可基于包括多行像素数据的数字图像,所述像素数据在给定的颜色空间内限定出点样品。位像的像素数据可以在任何帧之前进行更新。这样的技术容易产生类似于电影录像的运动位像填充效果。渲染位像填充包括与渲染梯度填充类似的方法。
为了将光栅空间像素映射到位图像素值上,合适的是,将位图空间表面规定为包含位像的表面。将位图空间表面的宽度和高度规定为像素中位像的宽度和高度。位图空间表面的原点对应于位像的左上方的像素。以梯度空间表面能够变换成光栅空间的相同方式,将位图空间表面变换成光栅空间。这使得位图发生平移、比例换算、旋转和扭斜。
对于位像填充,光栅空间中的每个像素位置映射到一些颜色值上。映射到位像内的点上的光栅空间像素位置可采用相应的像素颜色值(如由位像数据所规定的)。利用各种方式,可以将映射到位像之外的点上的光栅空间像素位置限定为映射到像素颜色值上。例如,可以将映射到位像之外的点上的光栅空间像素位置限定为映射到距离它们最近的位像像素上。另一个实例是,以产生倾斜位像效果的方式,将光栅空间像素位置映射到位图像素上,由此使位像横贯光栅空间进行无限重复。
参照图4,在计算任何输出像素颜色值之前,给出包括位像像素数据和光栅空间变换位图的位像描述,在步骤44适合计算(i)光栅空间水平方向上的每个像素阶的位图空间水平位置变化 (ii)光栅空间水平方向上的每个像素阶的位图空间垂直位置变化 (iii)光栅空间垂直方向上的每个像素阶的位图空间水平位置变化 (iv)光栅空间垂直方向上的每个像素阶的位图空间垂直位置变化 (v)对应于光栅空间原点的位图空间位置(uo,vo)。
这些预先计算值取决于位图到光栅空间的变换,并且在修正变换时仅需要计算。利用这些预先计算值对位像数据(地址)中的当前像素的地址进行递增跟踪。
然后,可以继续进行,以产生一个或多个邻接像素的像素颜色值,所述像素形成将要输出到填充生成缓冲器中的像素流。给出起始像素的光栅空间坐标部位(xstart,ystart),生成步骤包括首先计算相应初始位图空间位置(ustart,vstart)。这可利用以下公式来计算ustart=uo+xstart×∂u∂x+ystart×∂u∂y]]>vstart=vo+xstart×∂v∂x+ystart×∂v∂y]]>由这些计算,在步骤45确定位像数据内的初始地址(address)。对于具有始于地址位图库(bitmapbase)的扫描顺序数据的位像(其中位像数据是具有行幅字节(rowstride)的每个像素具有bpp字节),可如下计算位像数据内的初始地址address=bitmapbase+vstart×rowstride+ustart×bpp一旦计算出地址值,就可以在步骤46将此地址的像素颜色值用作当前输出光栅像素的输出像素颜色值。在产生像素的颜色值之后,如果在用位像生成的当前像素流(如在步骤47所确定的)中有更多的像素颜色值,那么就按照以下循环关系在步骤48是地址(address)值递增addressn=addressn-1+∂v∂x×rowstride+∂u∂x×bpp]]>应该注意,地址(address)增加的值可以作为常数预先计算。此过程重复进行,直到当前像素流中的所有像素产生为止。随后,如果利用相同的位像(如在步骤49确定的)有进一步的像素需要生成,那么通过在步骤45重新计算下一个像素流的起点像素的初始索引地址,可重复同一过程。总之,此模块通过实施每个像素恰恰两个加法(addition),而使位像沿输出像素流渲染。
9.像素的提取图56的像素提取模块执行光栅化过程中的最后步骤,并输出完成的像素。这些像素能够直接被输出到显示器件上,或者储存到帧缓冲器存储器内,以便随后输出到显示器件上。像素输出的目标是系统设计的选择。一些系统可利用仅仅一个像素输出目标,而其它系统可以根据输出目标设计其运行时间。
在输出像素的精度小于提供给像素提取模块618的颜色值的精度的系统中,像素提取模块618还可执行任选的半调色步骤。例如,在像素提取模块618接收颜色信息的系统中,可执行半调色,其中颜色信息是这样的每个通道具有8位(RGB 8:8:8),但输出像素是每个通道具有5位(RGB 5:5:5)。
9.1.输入数据像素提取模块618接受作为输入数据的“跨距”。跨距是具有相同颜色、按显示器件扫描顺序排列的一系列邻接像素。跨距的长度与一个像素一样小,象像素全显示那样多。每个跨距作为两个值(跨距颜色及其在像素中的长度)被输入到像素提取模块618中。
9.2.输出到帧缓冲器在这种操作模式中,像素提取模块618将像素输出到帧缓冲器存储器中。现在参照图37的流程图来描述这种模式的操作。在步骤370中处理开始。在步骤371中,将帧缓冲器位置变量X和Y都初始化为0,其显示出帧缓冲器顶部左侧的输出位置。在步骤378中,像素提取模块618接受待显示的下一个跨距。在步骤377中,变量N和C分别被指派给跨距的颜色和长度。在步骤376中,像素提取模块618将帧缓冲器中的位置(X,Y)处的像素颜色设定为颜色C。在步骤375中,帧缓冲器位置X的变量递增。在图中379,使帧缓冲器的变量X与帧缓冲器的宽度进行比较。如果X已经达到或超过帧缓冲器的宽度,那么处理就移到步骤374,否则处理继续到步骤369。在步骤369中,跨距长度计数变量N递减。在步骤380中,跨距长度计数变量N与0相比较。如果是0,那么处理就移到步骤378,否则处理移到步骤376。
在图37的步骤374中,将帧缓冲器变量X设定为0,使帧缓冲器变量Y递增。在步骤373中,使帧缓冲器变量Y与帧缓冲器高度进行比较。如果Y大于或等于此高度,那么处理就在步骤372终止,否则处理继续到步骤369。
9.3.直接输出到显示器上在这种操作模式中,像素提取模块618将像素直接输出到显示器件上。因为跨距信息到达像素提取模块618上可能与像素在显示器件上显示的速率不同步,所以像素提取模块618在将跨距输出到显示器件上之前,利用FIFO(第一输出中的第一)缓冲器排列跨距。FIFO缓冲器提供输入跨距定时与输出像素定时之间的弹性测定,以便提供对定时差异的容许。
现在参照图38(a)和38(b)所示的流程图来描述这种模式的操作。用图38(a)的步骤388-389描述将跨距接受到FIFO缓冲器内的过程,而用图38(b)的步骤382-383描述将跨距从FIFO缓冲器输出的过程。这两个步骤的定时与FIFO缓冲器非常不同步。
如图38(a)所示,在步骤388中,接受跨距(像素流)的过程开始。在步骤392中,跨距被像素提取模块618接受。在步骤391中,测试FIFO缓冲器的充满度。如果其是满的,那么处理就移到步骤390,否则处理就继续到步骤389。在步骤390中,处理等待FIFO缓冲器达到充满状况。在步骤389中,将在步骤392接受的跨距储存到FIFO缓冲器内。
如图38(b)所示,在步骤382中,输出像素的过程开始。在步骤387中,从FIFO读取跨距。在步骤386中,将跨距的长度和颜色分别储存到变量N和C中。在步骤385中,进行测试,以确定,是否到输出下一个像素的时间。如果时间还没到,那么处理就重复当前的步骤。如果输出下一个像素的时间到了,那么处理就移到步骤384。在步骤384中,将颜色C的像素输出到显示器上。在步骤381中,变量N递减。在步骤383中,使变量N与0相比较。如果等于0,那么处理就移到步骤387,否则处理就继续到步骤385。
9.4.半调色图29表示出像素提取模块618使用的半调色技术。此技术是各种误差扩散。图29(a)表示出已有的误差扩散技术,该技术将像素的量化误差扩散到相邻的五个像素(包括下一个扫描线上的四个像素)中。图29(b)表示出像素提取模块618的误差扩散技术,该技术将像素的量化误差仅扩散到与当前像素在同一个扫描线上的一个相邻像素中。图29(c)表示出像素提取模块618的误差扩散系统2900的系统方框图。系统2900是简单的一级负反馈控制系统。将由当前像素向下引到5位精度的误差添加到下一个像素中,从而提供负反馈。利用如图29(c)所示那样耦合的量化器2901和加法器系统2900,将系统2900构造成硬件。或者是,利用图30所示的方法将误差扩散系统构造成软件。为了使解释简化起见,仅针对一个颜色通道来描述误差扩散算式。在实际系统中,以相同的方式处理所有三个颜色通道。
图30提供了半调色算式的流程描述。在步骤292中,半调色过程开始。在步骤283中,将变量设定到它们的初始值,并在步骤290读取8位精度的像素强度。在步骤289中,在步骤290读取的像素强度具有添加到其中的误差变量。将结果储存到所需的变量中。然后是步骤288,在该步骤中,将所需的变量向下量化到5位精度,并储存到实际变量中。利用逻辑漂移右三位,来实现从8位向下量化到5位的目的。在步骤287中,输出量化的颜色值(实际值)。其次,在步骤286中,将实际的输出颜色(实际值)重新表达为8位值。通过将实际左漂移的三位添加到实际逻辑右漂移的二位中,可实现这一点。将所生成的值储存到变量ActEcho中。在步骤285中,通过从Desired中减去ActEcho,来计算量化误差。将结果储存到变量误差中。在步骤284中,进行测试,以便看看是否已经到达最后的像素。如果到达,那么处理就终止于步骤293。在步骤291中,变量X递增。
10.执行上述的TCIE系统699可以硬件或软件或者二者的组合方式来执行。在硬件实现中,图56的模块可集成到一个或多个ASIC器件上,并结合到目标器件(例如移动电话机)内。在软件实现中,可以将这样的软件构造成能够在一般的目的上操作,但是在用于有限的计算系统时,经常发现一般有限容量的处理器。混合型实现允许以软件实现和渲染(机)器610的显示目录编译器608,或者其一部分由硬件实现,这样一般提供了较大的数据(图像)输入多功能性和较快的渲染速率。而且,即使是为在瘦客户机上使用而开发的系统699,这样并不阻碍相同的成像和渲染方法用于具有显著计算资源(例如桌上型计算机、机顶盒等)的设备。
利用系统6000,来实践上述的瘦客户机成像法,该系统在图60中示出,其中所述过程完全是作为软件(例如在系统6000内执行的应用程序)实现的。具体地说,图56的方法步骤由计算器件6001执行的软件中的指令指挥着。这些指令可以作为一个或多个编码模块形成,每个模块用于实施一个或多个具体任务。软件还可分成两个单独部分,其中第一部分实施具体的成像和渲染方法,第二部分管理第一部分与用户之间的用户界面。软件可储存在计算机可读的介质(诸如包括下述的存储器件)中。软件从计算机可读介质装载到计算机中,然后由计算机来执行。具有这样软件或记录在其上的计算机程序的计算机可读介质是计算机程序产品。计算机成像产品在计算机中的应用,很好地实现了瘦客户机成像的有益装置。
系统6000包括利用通信链路6021互相连接的计算装置6001和网络6020。装置6001诸如可以是蜂窝电话机,在这种情况下,网络6020是用户电话网络(例如蜂窝网络)。当这种6001诸如是复印机或打印机时,网络6020可以是互联网或另一网络系统例如局域网(LAN)或宽域网(WAN)。计算装置6001包括用户输入界面6002,该界面可结合有键盘、触摸板和点击装置例如鼠标或跟踪球。计算装置6001结合有功能硬件6012例如根据正在执行的以上实例的蜂窝电话收发器电子器件和复印机。计算装置6001利用功能界面6008与网络6020通信,并且一般用于实施装置6001的主要功能。
计算模块6001一般包括至少一个处理器单元6005,和作为易失性和非易失性存储器的存储单元6006和6010。易失性存储器6006可以用半导体随机存取存储器(RAM)形成,而非易失性存储器可以用半导体只读存储器(ROM)、硬盘驱动器或光学存储平台形成。例如,存储器6006可以作为图56的存储器609来操作。模块6001还包括多个输入/输出(I/O)界面(此界面包括耦合到显示器6014上的图像输出缓冲器6007),以及用于用户界面6002的I/O界面6013。计算装置6001的模块6002-6014一般经互连总线6004、以相关技术领域中的技术人员公知的计算装置6001的传统操作模式进行通信。
一般,瘦客户机成像的应用程序驻留在非易失性存储器6010上,并且在执行中由处理器6005读取和控制。从网络6020取得的程序和任何数据的中间存储都可以利用易失性存储器6006来完成,也可能与诸如包括硬盘驱动器的非易失性存储器一起完成。在以下情况下,可以将应用程序提供给编码在非易失性存储器6010中的用户,或者由用户经界面6008从网络6020来读取。另外,软件还可以从其它计算机可读介质装载到计算装置系统6001内。术语“计算机可读介质”如本文所用,是指参与向计算机提供指令和/或数据以便执行和/或处理的任何存储或传输介质。存储介质的实例包括软盘、磁带、CD-ROM、硬盘驱动器、ROM或集成电路、磁光盘或计算机可读卡例如PCMCIA卡等。而无论这样的装置是在计算装置6001的内部还是外部。传输介质的实例包括与另一计算机或网络装置连接的无线电或红外信道以及网络,还有包括电子邮件传输和记录在Websites等上的信息的互联网或Intranets。
对于移动蜂窝电话机的实例,这可用来播放基于图形的动画游戏,从而网络6020向装置6001传输一个待渲染游戏的每个帧的显示目录,此目录然后由显示目录编译器608按照用户输入(例如个人设定或实时游戏播放输入)来操纵,将其结果传送到渲染(机)器610上,渲染(机)器610将输出像素图像传送到缓冲器6007上,然后又传送到显示器6014上。比较器608和渲染器610可以用由处理器6005呼叫和执行的相应软件模块来形成。
工业实用性以上所述的这些布置可用于计算机和数据处理产业,特别是用于这样的情形中即,图像的再现是必要的,尤其是当图像生成和渲染的计算资源有限时。
以上仅仅描述了本发明的一些实施例,并且在不脱离本发明的范围和精髓的情况下可以对其进行修改和/或改变,但是这些实施例仅仅是为了图示说明,并不具有限定作用。
(仅用于澳大利亚)在本说明书的上下文中,词汇“包括”的意思是,“主要包括但不是必要唯一的”或“具有”或“包括”但不是“仅包括”。词汇“包括”的变型例如“包括”和“包括”具有相应的变化含义。
权利要求
1.一种方法,在扫描线渲染器中针对位于与图形目标图像的扫描线相交的两个相继x-顺序边缘之间的像素跨距渲染所述扫描线,对于每一所述跨距,该方法的特征在于,按深度顺序保持渲染过程中存在的一深度亚组,所述深度亚组是在所述跨距上的按深度顺序保持的那些深度,在相应的深度不再激活的情况下所述深度亚组被去除该相应的深度。
2.根据权利要求1所述的方法,其中所述深度亚组是按每个跨距更新的。
3.根据权利要求1所述的方法,其中所述深度亚组是利用内容可寻址存储器来保持的。
4.根据权利要求3所述的方法,其中所述内容可寻址存储器是至少通过深度来寻址的,并且引用与所述跨距中激活的图形目标相关的填充信息。
5.根据权利要求4所述的方法,其中所述深度亚组的所述深度顺序是利用映射按照以下步骤来保持的使所述深度亚组的所述深度与相应的第二深度相关,所述第二深度指示出深度在所述跨距上的相对排序;使用所述映射从每个所述第二深度映射到所述深度亚组中的每个相关深度;以递增的X顺序一个跨距一个跨距地重新使用所述深度亚组和所述映射;以及在将深度添加到所述深度亚组中以及从所述深度亚组除去深度的过程中,保持所述深度亚组和所述映射的有序状态。
6.根据权利要求5所述的方法,其中当将深度添加到所述深度亚组中时,所述保持步骤包括以下步骤将所述深度亚组中的每个深度标记为在所述添加的深度之上或之下,由此产生一组标记;以与储存在所述内容可寻址存储器中的所述深度亚组相同的顺序,将所述标记组排序;以由所述映射确定的相关第二深度的顺序,将所述标记组重新排序;以及将所述映射重新排序,以便反映按相关第二深度储存在内容可寻址存储器中的所述深度包括所述添加的深度的新排序,所述对映射重新排序的步骤采用所述重新排序后的标记组。
7.根据权利要求4所述的方法,还包括将所述深度亚组划分成潜在地影响当前跨距的光栅数据输出的那些深度,和目前没有影响的那些深度,所述深度亚组按所述深度顺序保持,其中所述深度的排序单独作用于所述有影响的划分部分和所述无影响的划分部分,所述方法包括对所述跨距中每个所述深度形成组合索引,每个所述组合索引具有指示出所述划分部分中的相应一个的最高有效部分,和指示出所述单独作用的深度排序的最低有效部分;将所述组合索引排序,以便提供所述划分和所述深度的排序,所述组合索引的所述排序是借助于映射获得的;使所述深度亚组中的每个所述深度的所述组合索引与相应的另一深度相关,所述另一深度指示出有影响的所述划分部分,以及所述跨距上每个划分部分的深度的相对排序;使用所述映射,从每个所述另一深度映射到所述深度亚组中每个深度的所述相关组合索引;按递增的X顺序一个跨距一个跨距地重复使用所述深度亚组以及所述映射;以及在所述深度亚组中深度的影响状态的添加和除去变化过程中,所述深度亚组和所述映射保持有序状态。
8.根据权利要求7所述的方法,其中当深度添加到所述深度亚组中时,所述方法还包括将所述加入的深度标记为有影响的或无影响的,由此为加入的深度提供所述组合索引;就所述相应的组合索引而言,将所述深度亚组中的每个深度标记为在所述加入的深度之上或之下,借此产生一组标记,所述这组标记以与所述深度亚组相同的顺序进行排序,并储存在所述内容可寻址存储器中;以由所述映射确定的每个相应所述组合索引的顺序,将所述这组标记重新排序;以及将所述映射重新排序,以便反映按相关的另一深度储存在内容可寻址存储器中的所述深度包括所述加入的深度的新排序,所述对映射的重新排序取决于所述重新排序的这组标记。
9.根据权利要求7所述的方法,其中当所述深度亚组中的深度从有影响变为无影响时,所述方法还包括以下步骤标记所述有影响划分部分中的在变化的深度之下的所述深度亚组中每个深度,类似地标记所述无影响划分部分中在变化的深度之上的所述深度亚组中每个深度,由此产生一组标记,所述这组标记以与所述深度亚组储存在所述内容可寻址存储器中的相同顺序进行排序;以由所述映射确定的所述组合索引的顺序,将所述这组标记重新排序;以及将所述映射重新排序,以便反映按相关的另一深度储存在内容可寻址存储器中的所述深度的新排序,包括所述变化深度的影响状态的变化,所述对映射重新排序的步骤使用所述重新排序的这组标记。
10.根据权利要求1所述的方法,其中所述渲染步骤确定所述跨距的光栅数据输出,并且每个深度与相应的填充相关,所述方法还包括以下步骤利用所述深度亚组和与所述深度亚组中每个深度相关的所述填充,产生一个填充亚组,其中所述深度亚组的所述深度顺序提供了所述填充亚组的深度排序。
11.根据权利要求1所述的方法,其中所述方法提供了光栅图像处理器的输入,所述输入是树形的图形目标,所述树按局部深度排序,每个所述图形目标与一个或多个填充相关,每个所述图形目标中的每个填充与局部深度相关,从而填充的局部深度局限于其图形目标,每个图形目标与一个局部深度相关,并且每个所述图形目标的局部深度局限于相应的母图形目标,所述方法包括以下步骤通过在树的深度第一遍历中遍历所述图形目标的所述树,确定与对应的所述图形目标相关的每个深度;以及按局部深度顺序遍历与每个所述图形目标相关的填充;并且当深度与填充在所述遍历中相遇时,将连续深度指配给填充。
12.根据权利要求3所述的方法,其中所述内容可寻址存储器形成在硬件中。
13根据权利要求3所述的方法,其中所述内容可寻址存储器由软件实现。
14.一种计算机可读的介质,具有记录在其上的程序,并适于使计算机装置在扫描线渲染器中针对位于与图形目标图像的扫描线相交的两个相继x-顺序边缘之间的像素跨距渲染所述扫描线,该程序的特征在于,对于每一所述跨距,按深度顺序保持渲染过程中存在的一深度亚组,所述深度亚组是在所述跨距上的按深度顺序保持的那些深度,在相应的深度不再激活的情况下所述深度亚组被去除该相应的深度。
15.一种计算装置,用于在扫描线渲染器中针对位于与图形目标图像的扫描线相交的两个相继x-顺序边缘之间的像素跨距渲染所述扫描线,该计算装置的特征在于,对于每一所述跨距,按深度顺序保持渲染过程中存在的一深度亚组,所述深度亚组是在所述跨距上的按深度顺序保持的那些深度,在相应的深度不再激活的情况下所述深度亚组被去除该相应的深度。
16.一种扫描线渲染像素跨距的方法,基本上如本文参照任一实施例所述的,所述实施例在附图中示出。
17.一种计算机可读介质,所述介质具有记录在其上的计算机程序,并且被构造成能够实施权利要求1-13或16任一项所述的方法。
18.一种被构造成能够实施权利要求1-13或16任一项所述方法的装置。
全文摘要
一种成像机器系统(699)利用具有有限计算资源的装置中再现图形目标图像。其中之一改进是使动画序列的一个帧与连续帧之间达到暂时一致。尤其是一些在横贯几个连续帧保持“静态”的图形目标边缘。其实例包括用来绘制图像背景细节的那些边缘。另外在图形目标图像的扫描线渲染过程中进行抗锯齿,其中一次针对有限数目的扫描线,产生子像素分解覆盖位掩模(A缓冲29-34)。优选一次仅针对一像素产生A缓冲。还涉及在扫描线渲染器中针对像素跨距渲染图形目标图像的扫描线,由此保持渲染时存在的深度亚组,该深度亚组存在于跨距上、按深度顺序(590)保持并接受深度去除(相应的深度不再是激活的)。还使将要以扫描线方式渲染的图像层的合成堆栈(6101-6107)得以简化。
文档编号G06T15/10GK1795468SQ200480014677
公开日2006年6月28日 申请日期2004年6月25日 优先权日2003年6月26日
发明者蒂莫西·梅瑞克·龙, 斯高特·巴拉德雷, 斯蒂芬·爱德华·埃克贝, 本杰明·利弗 申请人:佳能株式会社
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1