专利名称:具有割截与支援框线模式的三角形描绘方法与装置的制作方法
技术领域:
本发明是关于一种描绘处理器(rasterizer),特别是关于加速转换由顶点所定义的影源(primitive)成为等效影像(equivalent image)的过程,其中,此等效影像是由能够被储存与处理成比特集合的像素图样所构成。
背景技术:
描绘显示(raster displays)一般用于电脑图形系统(computergraphics systems),这样的显示方式是将图形影像储存成由许多最小图像元素(即像素;pixels)所构成的点阵,这些最小图像元素被储存在显示缓冲区(display buffer)中,用以在屏幕上显示代表每一个像素的资料。上述的资料被用来具体指出每一个像素在屏幕上的显示属性,如像素的颜色及其亮度(intensity)。整个影像是由显示缓冲区中被读取,并且透过循序扫描像素资料的水平列(horizontal rows of pixel data)(或称“扫瞄线”(scan lines))的方式来显示于屏幕上。
描绘显示系统(raster display systems)通常是以多边形作为基础堆砌方块(或称“影源”,primitives)来绘出复杂的影像。三角形是一种最常用于多边线形绘图系统的基本影源,此是由于因为三角形为最简单的多边线形且其他比三角形复杂的多边线形都能够以复数个三角形来组成。将三角形与其他几何影源绘于屏幕上的过程即被通称为“描绘”(rasterization)。
在描绘中有一个重要部份是牵涉到决定哪些像素落在一个给定的三角形中,描绘系统一般是以许多方式由一点推进至另一点并同时决定是否“成像”(render)该点(亦即将该点成像至一个画面缓冲区(frame buffer)或像素映图(pixel map)中),其中,所绘入的每一像素皆为该给定的三角形的一部份。传统技术是以此种方式依次决定显示缓冲区中代表每一个像素的资料该如何来设定。目前已有许多的追踪(traverse)演算法被发展用来从一个像素推进另一个像素并据此使得三角形中所有的像素都能被涵盖。
描绘系统有时是采用三个边线函式来表示一个三角形,每一个边线函式皆为表现一条直线的线等式,其是被套用以细部划分一个二维平面,以将平面中的每一个点归类于下列的三个区域中三角形内的区域、三角形外的区域或是正好位于直线上的区域。这样的边线函式分类方式具有下列的性质三角形内的点具有大于0的值、三角形外的点具有小于0的值、以及正位于直线上的点为0值。如图1A所示,在描绘的应用上,二维平面是由图形屏幕所呈现,所有点都被以个别的像素来表示,并且把边线函式套用来细部划分此图形屏幕。
三角形是由三个边线的联集或由边线函式所区隔出来的特定的三个半平面所构成。同样地,更复杂的多边线形可以用超过三个边线的布林组合(Boolean combination)来定义。因为三角形在描绘时会涉及哪些像素需要被成像,通常决定的法则是以位于各边线上的像素来考量各像素是位于三角形内或是三角形外。
如图1B所示,每一个像素都具有一组相关的边线变数集合(e0,e1与e2),这些边线变数是像素与相关三边线间正负距离(signed distance)的比例项,每一个边线变数的值是以三个边线函式相对于像素的位置来评估得知。值得注意的是,光观察e0,e1与e2的正负号(sign)便能得知像素是否落于三角形之内。
在决定三角形内哪些点需要描述时,典型的描绘系统是依给定的像素与三边线函式来计算出边线变数(e0,e1与e2)的值,并利用增量值(Δeoutside,Δeinside等等)来得知相邻的像素。如此,描绘系统以现有的值加上增量值作为追踪演算法从一个点推进到另一个点来逐步地追踪出整个三角形。
参考图1A,一条直线可由(X,Y)与(X+dX,Y+dY)来说明,据此,这条线能够被用来将一个二维空间切割为三个区域所有位于内部、外部与线上的点。边线f(x,y)可被定义为f(x,y)=(x-X)dY-(y-Y)dX,此函式具有一个有用的性质,那就是函式值能够用来表示点(x,y)与由点(X,Y)以及点(X+dX,Y+dY)所定义出来的边线之间的相对位置f(x,y)>0,假设(x,y)为“内部”;f(x,y)=0,假设(x,y)为位于线上;以及f(x,y)<0,假设(x,y)为“外部”。
现有描绘系统一般使用这样的函式,因为它能够以f(x+,y)=f(x,y)+dY and f(x,y+1)=f(x,y)-dX的简单加法来增量运算。
目前已经有许多不同的追踪演算法使用在不同描绘系统的成像程序(rendering process)上,只要是任何确定能够函盖三角形中所有的像素的演算法都能够被拿来利用。例如,一些沿着三角形的一侧(side)以水平或垂直张成空间(span)来识别出位于其中所有像素的解法。虽然上述的沿着三角形的一侧作计算的方法适用于处理三角的边线,但是如果三角形被一近平面或是远平面所截,则其边界将无法明确地知道此时上述的方法会很难实作。此外,其他的方法是以一次一个像素来做测试,以最近取得的几个像素来做平行测试以加速整个描绘的程序。
一些传统描绘处理器(rasterizers)是采以张成空间为基础的像素产生法(span-based pixel generation),其中并利用了著名的Bresenham演算法为基础的边线与张成空间内插器(span interpolator)。描绘处理器的速度取决于内插器的速度,再者,描绘处理器需要复杂的设定程序。在大多数的情形下,这样的描绘处理器利用相应的硬件以内插许多相关的参数,如颜色、材质等等。要让这样的描绘处理器加速须要显著增加内插器的数量与复杂度,明显为一种不适用于商业产品的方法。在要支援剪辑的情况下,这种描绘处理器如果要有效来实做的话,其结构会过于复杂。
另一种方法是使用以内部点与外部点的定义为基础的区域描绘处理器(area rasterizers),利用检查角落像素的等式值(corner pixels’equation values)来定义内部边界(inner borders)与外部区块(outerblocks)。这种方法可以加速内部区块(inner blocks)的比特遮罩(bit-masks)的产生,但是边界区块不是需要一个一个像素来处理,便是需要一定数量专用的硬件来平行处理这些像素。
据此,一种能够在每个时脉周期内产生多张成空间,且兼顾低成本与高速度,同时具有简单制式结构的描绘处理器是有目前产业所追求的目标。
发明内容
本发明的目的在于,描述了一种低成本高速度的可程序化描绘处理器,此描绘处理器能够接受一组用来代表一个三角形、割截平面(clippingplans)以及一个剪裁区(scissoring box)的函数式(functional)来作为其输入,并且能在每个时脉周期产生多个张成空间来作为输出。本发明并提供一个载入器(loader)将上述的由一般形式所表示的输入转换成为一个由一组边线产生器能够接受的一特定格式所表示的展式。由此种可被边线产生器所接受的受限定输入格式,本发明能将上述的边线产生器有效地实作。
本发明一种描绘的方法,其特征在于,该描绘的方法包含决定一线段与一边界区的交会点,该线段是以一函数式f(x,y)=a·x+b·y+c来表示;以及执行一Bresenham步法,该Bresenham步法是沿着该线段的一部份来执行,该部份是落于边界区之中,并且该部份具有(a)一初始x座标x0与(b)另外一个或多个的x值递增的x座标;其中该决定步骤与执行步骤包含使用一加法器,并且其中该决定步骤与执行步骤不包含使用一乘法器或除法器。
其中上述的加法器包含一短加法器来反复由b减去a与由c减去a。
其中上述的初始x座标x0=floor(-c/a)并且一个或多个其他的x座标以至少Δx=floor(-b/a)来递增,其中该加法器包含一短加法器,该短加法器是用以反复由c减去a来计算x0与反复由b减去a来计算Δx。
本发明一种描绘的方法,其特征在于,该描绘的方法包含接收(a)一用来表示一第一函数式的第一系数集合与(b)一边界区偏移;以及计算用来表示一第二函数式f(x,y)=a·x+b·y+c的一第二系数集合a、b与c,其中,该第二函数式是落在a<0与b≥0所表示的象限之中;其中该计算步骤包含对一中间值调整比例,此调整比例的动作包含该中间值的循环比特旋转,据此使得该中间值被表示于一第一比特长度中,而该中间值调整比例后的版本则被表示于一第二比特长度中,其中该第二比特长度不超出该第一比特长度。
其中还进一步包含由一第一座标系统至一第二座标系统的转换步骤,其中,该第一函数式是根据该第一座标系统并且该第二函数式是根据该第二座标系统。
其中上述的第一座标系统是对应到一主要网格并且该第二座标系统是对应到一过度取样网格。
本发明一种以一视景埠来提供裁剪区的方法,其特征在于,该以视景埠来提供裁剪区的方法的步骤包含接收(a)一个由相对应于x轴与y轴的关系来表示的第一像素张成空间、(b)一个或多个由相对应于x轴与y轴的关系来表示一裁剪区的座标、与(c)一个由相对应于x轴与y轴的关系来表示的裁剪区旋转角度正切;以及计算一第二像素张成空间,该第二像素张成空间是以相对应于该裁剪区的关系来表示;其中,该裁剪区是用以指出一被旋转的割截矩形。
其中上述的旋转角度正切为0、1、1/2或1/3。
其中上述的计算步骤包含用来实作一除以3演算法的一硬件元件,该硬件元件包含一短加法器。
为进一步说明本发明的技术内容,以下结合实施例及附图详细说明如下,其中图1A是为根据本发明的一具体实施例所建构的一半平面示意图;图1B是为根据本发明的一具体实施例所建构的一个以三个半平面来定义的三角形示意图;图1C是为根据本发明的一具体实施例所建构的一个以一组半平面集合所定义的多边形示意图;图1D是为根据本发明的一具体实施例所建构的一开放半平面与一封闭半平面的示意图;图2是为根据本发明的一具体实施例所建构的象限的法线、右半平面与左半平面的示意图;图3是为根据本发明的一具体实施例所建构的框线三角形的示意图;图4是为根据本发明的一具体实施例所建构的在预备Bresenham设定时用来作为下移程序的方法流程示意图;图5是为根据本发明的一具体实施例所建构的Bresenham设定的方法流程示意图;图6是为根据本发明的一具体实施例所建构的Bresenham步法过程的方法流程示意图;图7是为根据本发明的一具体实施例所建构的张成空间产生器的功能方块示意图;图8是为根据本发明的一具体实施例所建构的载入器(不具平移器)的功能方块示意图;图9是为根据本发明的一具体实施例所建构的 与 值在被载入边线产生器的前的功能方块示意图;图10A是为根据本发明的一具体实施例所建构的边线产生器的功能方块示意图;图10B是为根据本发明的一具体实施例所建构的边线产生器在下移阶段的功能方块示意图;图10C是为根据本发明的一具体实施例所建构的边线产生器在Bresenham设定阶段的功能方块示意图;图11A是为根据本发明的一具体实施例所建构的裁剪区原点的功能方块示意图;以及图11B图是为根据本发明的一具体实施例所建构的裁剪区的功能方块示意图。
具体实施例方式
本发明在此所探讨的方向为一种具有割截与支援框线模式的三角形描绘的方法与装置。为了能彻底地了解本发明,将在下列的描述中提出详尽的结构。显然地,本发明的施行并未限定于照明装置的技艺者所熟悉的特殊细节。另一方面,众所周知的组成或制程步骤并未描述于细节中,以避免造成本发明不必要的限制。本发明的较佳实施例会详细描述如下,然而除了这些详细描述之外,本发明还可以广泛地施行在其他的实施例中,且本发明的范围不受限定,其以之后的专利范围为准。
以下所会用到的词汇先在此定义,如下列三角形(Triangle)三个半平面的交集,其中每一个半平面为“开放(open)”或者“封闭(closed)”;多边形(Polygon)一个三角形与半截平面的交集(如图1C所示),其中每一个半截平面为“开放”或者“封闭”;“开放”半平面(“Open”half-plane)一半面,其满足不等式(如图1D所示)a·x+b·y+c>0 (1);“封闭”半平面(“Closed”half-plane)一半面,其满足不等式(如图1D所示)a·x+b·y+c≥0 (2);半平面函数式(Half-plane functional)用来描述一半平面或一直线的函数式f(x,y)=a·x+b·y+c (3);“右”半平面(“Right”half-plane)一半平面,其描述的函数式为f(x,y)=a·x+b·y+c,where a<0∨a=0∧b<0(4);“左”半平面(“Left”half-plane)一半平面,其描述的函数式f(x,y)=a·x+b·y+c,where a>0∨a=0∧b>0 (5);剪裁区(Scissoring box)在用以绘出多边线型的视景埠中,用来标示视景埠的其中一部份的一个矩型;
边界区(bounding box)涵盖一个三角形与剪裁区的交集的最小矩形;延伸边界区(extended bounding box)一边界区,其水平大小为大于或等于边界区的二的次方值中最小的;w(The horizontal size of the bounding box)边界区的水平大小w=xmax-xmin(6);W延伸边界区的水平大小,可表示为W=2ceiling(log2w)(7);x位于边界区内以目前网格单位(grid unit)所表示的整数水平座标值(integer horizontal coordinate);y位于边界区内以目前网格单位(grid unit)所表示的整数垂直座标值(integer horizontal coordinate);xmin边界区的最小水平座标;ymin边界区的最小垂直座标;a,b,c半平面的函数式的整数系数; 根据边线函数式的特定格式所转换的边界区相对座标函数式的整数系数;左半平面的边线(“Edge”of a“left”half-plane)点的集合(xi,yi),其满足展式xi=minx∈Z{x:a·x+b·yi+c≥0}---(8)]]>其中a>0 and i=0,1,…,ymax-ymin,oryi=miny∈Z{y:a·xi+b·y+c≥0}---(9)]]>其中a=0 and b>0 and i=0,1,…,xmax-xmin;
“左”边线(“Left”edge)“左”半平面的边线;右半平面的边线(“Edge”of a“right”half-plane)点的集合(xi,yi),其满足展式xi=maxx∈Z{x:a·x+b·yi+c>0}---(10)]]>其中a<0 and i=0,1,…,ymax-ymin,oryi=maxy∈Z{y:a·xi+b·y+c>0}---(11)]]>其中a=0 and b<0 and i=0,1,…,xmax-xmin;“右”边线(“right”edge)“右”半平面的边线;半平面的“边线”(“Edge”of a half-plane)如果半平面为“右”半平面,则为“右”半平面“边线”,否则为“左”半平面“边线”;多边形的“边线”(“Edge”of a polygon)其中一个构成多边形的半平面的“边线”;框线(Wire-frame)以三角形的三边线为基础的三个平行四边形的分离部份。
框线“宽度”(“Width”of a wire-frame)一整数,其表示以现有网格单位描绘于一个较小的方向轴的框线宽度;d框线的宽度边线产生器(Edge Generator EG)用于产生一半平面的边线的状态机(state machine),其以数种函数式中的一种按照y座标的递增来产生一连串的x座标;载入器(loader)用来转换输入函数式成为便于边线产生器作业的形式的管线装置(pipelined device);排序器(sorter)用来计算出半平面与边线产生器所产生的边线的管线装置;张成空间缓冲区(span buffer)在影砖化(tiling)前用于张成空间的暂存储存体;影砖化(Tiling)制作影砖(tiles)的程序;影砖(Tile)对x与y轴对齐的一组8×8像素;影砖产生器(Tile Generator TG)用于从张成空间缓冲区的张成空间中产生影砖的状态机;下移(Moving Down)边线产生器的一个阶段,此阶段在每个时脉加入 值至函数式的值,直到函数式的值成为正值为止;短整数(SHORT)22比特的有正负号数资料型态;长整数(LONG)42比特的有正负号数资料型态;N比特数(BITN)N比特的无正负号数资料型态;以及NS比特数(BITNS)N比特的有正负号数资料型态。
三角形边线定义此外,三角形边线在此定义如下Fi(x,y)=ai·x+bi·y+ci=detxjxkxyiyky111,i=0,1,2---(12)]]>其中j=(i+1)mod 3,k=(i+2)mod 3 and[xi,yi],i=0,1,2上式是为以标准视窗(window)座标系统的主要网格单位来表示的三角形顶点。如果函数式被设定为″隐含(implicit)″割截函数式(clippingfunctionals)时,其必需被转换成这种格式。
端点(END POINTS)由一个右边线与一给定的张成空间yi,可得出xi如下xi=maxx∈Z{x:a·x+b·yi+c>0}---(13)]]>就a≠0而言,点xi为此张成空间中最后一个点。由一个左边线与一给定的张成空间yi,可得出xi如下xi=minx∈Z{x:a·x+b·yi+c≥0}---(14)]]>就a≠0而言,点xi为此张成空间中第一个点。
如果a=0,则边线(左或右)为水平,因此对函数式而言,张成空间的端点将会是x0=0与x0=W。
边线产生器的一般情形在一般情况下,就开放右平面与封闭左平面来考量,如图2所示,可细分如下
载入器102将一个一般情形的函数式转换成为一个特别情形的函数式,其对应一般情形与特别情形的描述如下
边线产生器的特别情形边线产生器103(参照图7)在一个对应于整数系数的离散空间中作业的情形。为简化边线产生器103的工作,边线产生器103是被设计用来绘出一封闭右半平面的边线,就a<0与b≥0可得知此边线的法线座落于第二象限。由a<0可得知f(x,y)=a·x+b·y+c=0⇒x=-ba·y-ca---(15)]]>由此可算出x0=floor(-ca)]]>Δx=floor(-ba)---(16)]]>边线产生器103在一个以相对于xmin的x座标来表示的垂直带状区(vertical stripe)[xmin,xmax]中工作时,其满足0≤x≤W,其中W=2m为延伸边界区的大小。如下述,当函数式将正负号(sign)由负转正并且f(0,y)≥0时,预设的除法开始执行以使得x0≥0,且根据上述的假设a<0 and b≥0,可知Δx≥0。
当边线产生器103开始作业时(例如在y=0时),函数式的值有可能为负数,在这情形下,x0的值可能为负数,因此不需要被计算,因为吾人只对x0的值刚好满足于0≤x0≤W的情形有兴趣。
随着以除法器执行除法过程来计算出x0=floor(-c/a)与Δx=floor(-b/a),便可完成下移程序。由于在函数式值的正负号由负转正时除法器便开始作业,因此可假设除法过程f(0,y)≥0是在此时开始,在计算x0与Δx时,除法器的作业是假设
a<0,b≥0 (17)并且是采用以简单加法器为基础的除法器,因为a<0,可将ci-(-ai)≡ci+aibi-(-ai)≡bi+ai(18)以c0=f(x,y),a0=a~·2m+1,b0=b~,]]>x00=Δx0=0 (19)为开始来考量,并且反复依据以下完整函数式一步一步描述出整数除法器ci+1=ci+ai,ci+ai≥00,ci+ai<0]]>x0i+1=x0i·2+1,ci+ai≥00,ci+ai<0]]>bi+1=bi+ai,bi+ai≥00,bi+ai<0,i=0,1,...m---(20)]]>Δxi+1=Δxi·2+1,bi+ai≥00,bi+ai<0]]>ai+1=ai2]]>●一般情形1右开放平面且a<0∧b≥0应注意的是为,在此所谓一般情形与特别情形的差异仅在于半平面是为开放的,因此需要寻找x0=maxx∈Z{x:a·x+b·y+c>0}---(21)]]>因为系数与变数皆为整数,所以x0=maxx∈Z{x:a·x+b·y+c-1≥0}---(22)]]>
并且x0=maxx∈Z{x:a·x+b·y+c~≥0},c~=c-1---(23)]]>使得本一般情形可转化为特殊情形。因此,在本一般情形下,载入器102(参照图7)是于边线产生器103开始前将c减去1。
●一般情形2右开放半平面并且a<0∧b<0与前述相同,本例需要寻找x0=maxx∈Z{x:a·x+b·y+c>0}---(24)]]>,替换x=W-x~,]]>可得知x0=W-minx~∈Z{x~:-a·x~+b·y+c+W·a>0}---(25)]]>并计算互补半平面中的最大值x0=W-maxx~∈Z{x~:-a·x~+b·y+c+W·a≤0}-1---(26)]]>在重写限制条件与集合适当项后,可得知x0=W-1-maxx~∈Z{x~:a·x~-b·y-c-W·a≥0}---(27)]]>最后推知x0=W-1-maxx~∈Z{x~:a~·x~+b~·y+c~≥0}---(28)]]>,其中a~=a,b~=-b,c~=-c-W·a---(29)]]>,据此可将本一般情形转化为特殊情形。
●一般情形3右开放半平面并且a=0∧b<0相对于前一般情形a<0∧b<0,可得知x0=W-1-maxx≈∈Z{x~:a~·x~+b~·y+c~≥0}---(30)]]>,其中a~=a,b~=-b,c~=-c-W·a---(31)]]>在本一般情形中a=0,亦即展式30并没有最大值。然而上述除法演算法16在分母为0的情形下仍为可靠的,在本一般情形可得出x~0=2·W-1⇒x0=W-1-x~0=-W---(32)]]>在完成除法演算法后,x值被表示为到达边界区的其他边,并且边线产生器103将绘出一条水平线。
●一般情形4左封闭半平面并且a>0∧b≤0如前述者,本例中必需寻找x0=minx∈Z{x:a·x+b·y+c≥0}---(33)]]>或是寻找x0=minx∈Z{x:-a·x+b·y-c≤0}---(34)]]>替换a=-a~,b=-b~,]]>并计算互补半平面中的最大值,可得出x0=maxx∈Z{x:a~·x+b~·y-c>0}+1---(35)]]>于系数与变数皆为整数,因此
x0=maxx∈Z{x:a~·x+b~·y-c-1≥0}+1---(36)]]>,使得x0=maxx∈Z{x:a~·x+b~·y+c~≥0}+1---(37)]]>,其以a~=-a,b~=-b,c~=-c-1---(38)]]>来转换成特殊情形。
●一般情形5左封闭半平面并且a>0∧b>0在此要寻找x0=minx∈Z{x:a·x+b·y+c≥0}---(39)]]>减去x=W-x~]]>可得出x0=W-maxx~∈Z{x~:-a·x~+b·y+c+W·a≥0}---(40)]]>,使得x0=W-maxx~∈Z{x~:a~·x~+b~·y+c~≥0}---(41)]]>,其以a~=-a,b~=b,c~=c+W·a---(42)]]>来转换成特殊情形。
●一般情形6左封闭半平面并且a=0∧b>0
在前一般情形以a>0∧b>0可得出x0=W-maxx~∈Z{x~:a~·x~+b~·y+c~≥0}---(43)]]>,其中a~=-a,b~=b,a~=c+W·a---(44)]]>。在本一般情形a=0使得等式(43)中没有最大值,然而上述除法演算法(16)在分母为0的情形下仍为可靠的,使得x0~=2·W-1⇒x0=W-1-x~0=0---(45)]]>在完成除法演算法后,x值被表示为到达边界区的其他边,并且边线产生器103将绘出一条水平线。
●一般情形7多边形的平面平行于割截平面并且a=0∧b=0本一般情形中,多边形的平面是与其中的一割截平面平行。在本一般情形中,c的正负号决定多边形的平面是否为可见的(visible)。如果c<0则整个边界区都为可见的,边线产生器103将正常运作,但所有张成空间将被标注为″边界区之外″,反的则所有的张成空间会被标注为“边界区之内”。
框线支援接下来的两个情形涉及到框线支援,图3为依据本发明的一具体实施例所举例说明的三角形的框线示意图。一个三角型的框线为三个平行四边形的分离部份,其中每一个平行四边形各代表三角形的一边线。在此是假设一框线是以一个像素的线宽所绘出,在下列条件下框线支援可稳定地运作(a)无过度取样(over sampling)(例如目前的工作网格的大小是如同一个像素的大小)以及(b)框线的宽度是为一单位的目前网格(如先前假设的情形者,则为一像素)。若是框线支援运作于任何模式(过度取样或超过一个单位的目前网格),则当这些模式能被实施时可视为额外的效益,且此效益的获得无需额外代价。
我们将框线模式限制为除了平截头体(frustum)外不包含任何割截函数式,亦即,框线化(wire-framed)的三角形包含(a)代表三角形边线的三个函数式以及(b)边界区。
框线化的三角形用于绘出的参数包含宽度(width)边线的宽度三角形边线在次方向(minor direction)所函盖的像素数目。张成空间产生器101(参照图7)是以一个像素宽度来正确地处理框线。
边线旗标(edge flag)边线绘出旗标(Draw-edge flag(每个边线一个比特))。三角形的每个边线都配有一个边线绘出旗标,用来表示该边线是否要被绘出。
延伸(extension)边界区的延伸(Bounding box extension)。如果一条边线的边线绘出旗标被设立,则边界区被延伸并向外增加框线线的一半宽度。
在此所谓框线者,其是为“紧(tight)”边界区与两封闭边线三角形的互斥集合(exclusive intersection)的交集,由于原始函数式已详细定义框线化三角形的每一个边线的中心线,用于框线的函数式在“次(minor)”方向(例如在函数式的系数中具有较小绝对值的座标方向)上会偏移(offset)半个框线宽度。
●一般情形8用于框线的右封闭半平面并且a<0∧b≥0本一般情形与特殊情形并没有差别,所以对于本一般情形并不用做更正x0=maxx∈Z{x:a·x+b·y+c≥0}---(46)]]>●一般情形9用于框线的右封闭半平面与a≤0∧b<0如前述者,本例必需寻找x0=maxx∈Z{x:a·x+b·y+c≥0}---(47)]]>减去x=W-x~]]>x0=W-minx~∈Z{x~:-a·x~+b·y+c+W·a≥0}---(48)]]>并且计算出在互补半平面(complimentary semi-plane)中的最大值x0=W-maxx~∈Z{x~:-a·x~+b·y+c+W·a<0}-1---(49)]]>。重写限制条件并且集合适当项,可得出x0=W-1-maxx~∈Z{x~:a·x~+b·y-c-W·a>0}---(50)]]>
最后x0=W-1-maxx~∈Z{x~:a~·x~+b~·y+c~≥0}---(51)]]>其是以a~=a,b~=-b,c~=-c-W·a-1---(52)]]>来再一次转换为特殊情形。
载入器边线产生器103是于前述特殊情形的假设的下运作,其允许本身硬件的特定转换并据以达到较佳的作业速度。载入器102是为一用以转换一般情形成为特殊情形的元件,其是用以将一个用来描述一个一般情形的输入函数式转化为特殊情形所预期的形式,并让边线产生器103正确并有效率地计算边线的值。
载入器102接受一函数式与一边界区的偏移来作为输入,并且根据用于边线产生器的特殊情形产生一组系数a、b、与c。
给定F(x,y)=a·x’+b·y’+c’X∈[xmin,xmax],[ymin,ymax] (53)由于函数式的系数是以网格来表示,并且x,y座标是以过度取样的网格来表示,因此本发明是以网格比率26+
来将c’值转换为过度取样网格,这种特别转换执行与否是取决于半平面的型态。就一个封闭半平面来说,此转换如下所述f(x,y)=a·x′+b·y′+c′≥0a·s·x+b·s·y+c′≥0,x′=s·x,y′=s·ya·x+b·y+c′s≥0⇒---(54)]]>a·x+b·y+c≥0,c=floor(c′s)]]>就一个开放半平面来说,此转换如下所述f(x,y)=a·x′+b·y′+c′>0a·s·x+b·s·y+c′>0,x′=s·x,y′=s·ya·x+b·y+c′s>0⇒---(55)]]>a·x+b·y+c>0,c=ceiling(c′s)]]>本发明更进阶的实作是用两个或以上的边线产生器来参与相同函数式的张成空间产生,在本发明的一种实施例中,是以k=1(另分别为2或4)个边线产生器103参与相同函数式的张成空间产生,让每个时脉周期能够产生2(另分别为4或8)个张成空间中的第一张成空间(thefirst span of the 2(respectively 4 or 8)spans)能根据2(另分别为2或4)对齐y座标。此过程叙述如下y~min=floor(ymink·2)·k·2,]]>并以减法x≈=x-xmin,y≈=y-y~min,c≈=c-a·xmin-b·y~min]]>来得到f(x≈,y≈)=a·x≈+b·y≈+c≈---(56)]]>。边界区的大小为(xmax-xmin)·(ymax-ymin)。在此得到m=ceiling(log2(xmax-xmin))(57)
W=2m(58)观察上述情形,考虑(23),(52),(38)与(42)结合一般展式可得出a~=-|a|---(59)]]>b≈=|b|---(60)]]>c~=c≈-1,a<0^b≥0-c≈-a·W,a≤0^b<0-c≈-1,a>0^b≤0c≈+a·W,a≥0^b>0---(61)]]>c值的数字是根据上述每一时脉周期所产生的张成空间的数字来产生,其中一边线产生器103每时脉周期产生2个张成空间。每一个边线产生器103的张成空间是以y来对齐,使得第一张成空间为偶数(例如yminmod 2=0)。并且第二张成空间为奇数(例如yminmod 2=1)。如果边界区的ymin为奇数,张成空间的产生是从ymin-1开始。为了要达到此目的,以下列式子来表示c00=c~-b≈·(yminmod2)]]>c10=c00+b≈---(62)]]>b~=2·b≈]]>在此种有超过一个以上的边线产生器103参与由函数式产生张成空间的过程的情形下,需要有超过一组以上用于张成空间的初始值。假设边线产生器103的数量为k(其中k=1,2或4),则初始值的集合给定为
cji=cj0+2·b≈·i,i=1,...,k,j=0,1]]>b~=k·b≈---(63)]]>,并且上述的初始值cji,b~anda~]]>会被载入至有参与以给定的函数式产生张成空间的过程的边线产生器103中。
下移在开始Bresenham追踪前,边线产生器103执行两个作业下移与Bresenham设定,其初始值为f(x~,y~)=a~·x~+b~·y~+c~,x~=0,y~=0---(64)]]>,且其具有伴随着给定的每一个 的计算目标x~0=floor(-b·~y~+c~a~),c~≥0---(65)]]>。此外,边线产生器103产生一 于边界区的内,因此如果x0在边界区的外,x0被减去0或W来使得x~=0,x~0<0x~0,x~0∈
W,x~0>W---(66)]]>。在转换为位于边界区的内的特殊情形后,可得到在边线上方的点为 与在边线的上与下方的点为 其中在边线上方的情形是参照于较大的y座标,而在边线下方的情形是参照较小的y座标。并且在这个给定的特殊情形的条件下,可以得知b≥0与a<0。
参阅图4,其是为根据本发明的一具体实施例所建构的在预备Bresenham设定时执行下移程序的方法示意图。下移程序以由k=0开始(200),如果函数值f(0,y~k)≥0]]>(201),下移程序完成(202)。若否(203),则下移程序是沿着边界区于x~=0]]>的边界上以每时脉周期递增1 的比例来加入至函数式(204),其中 并且函数式 的一个增值是与y值递增1来对应,直到 (201)(其中k>i),至此下移程序完成(202),此下移程序是以下列叠代的描述来表示y~0=0]]>f0=f(0,0)=a~·0+b~·0+c~=c~---(67)]]>fi=f(0,i)=b~·i+f0=b~·(i-1)+b~+f0=fi-1+b~]]>BRESENHAM设定下移程序之后所伴随的是Bresenham设定程序,Bresenham设定的目的在寻找两个值x0=maxx∈Z{x~:a~·x~+b~·y~k+c~≥0}---(68)]]>与Δx=floor(-b~a~)---(69)]]>。再者,因为b~·y~k+c~=f(0,y~k)---(70)]]>可得出x0=floor(f(0,y~k)-a~)---(71)]]>
。为了更有效率的硬件实作,上述的除法演算法(参照特殊情形)是修改如下c0=f(0,y~k),a0=a~·2m+1,b0=b~,x00=Δx0=0---(72)]]>,上式更用以配合下列步骤来描述叠代式(iterations)ci+1=2·ci+a0,ci+a0≥0ci,ci+a0<0]]>x0i+1=2·x0i+1,ci+a0≥00,ci+a0<0,i=1,2...,m+1---(73)]]>bi+1=2·bi+a0,bi+a0≥0bi,bi+a0<0]]>Δxi+1=2·Δxi+1,bi+a0≥00,bi+a0<0]]>数值e0=cm+1=f(0,y~k)mod|a|]]>与r0=bm+1=|b|mod|a|是用于Bresenham步法(Bresenham walk,详述于其后)来计算出Bresenham错误(error)。数值x0=floor(f(0,y~k)-a~)]]>为用于下移程序之后第一个张成空间的x值,而Δx=floor(-b~a~)]]>为张成空间至张成空间的x增值。图5是本发明的一具体实施例的流程示意图,其用来举例说明前述Bresenham设定程序的方法。
BRESENHAM步法(walk)Bresenham步法是伴随在下移与Bresenham设定程序之后的程序,在Bresenham设定后可得知a·~x~+b·~y~+c~=0---(74)]]>其中
e0=f(0,y~k)mod|a|]]>x0=floor(f(0,y~k)-a~)]]>r0=|b|mod|a| (75)Δx=floor(-b~a~)]]>并且a~·x~n+b~·y~n+k+c~=a~·x~n+b~·y~n+k+f(0,y~k)-b~·y~k=0⇔---(76)]]>a~·x~n+b~·y~n+f(0,y~k)=0---(77)]]>,在此需要寻找x~n=-b~a~·y~n-f(0,y~k)a~⇔]]>x~n=f(0,y~0)|a|+|b||a|·y~n⇔]]>x~0=x0+e0|a|+Δx·n+r0|a|·n⇔,n=1,2,...,h-yk---(78)]]>x~n=x~n-1+Δx+en-1+r0|a|⇒]]>x~n=x~n-1+Δx+0,en-1+r0<|a|1,en-1+r0≥|a|]]>en=en-1+r0-0,en-1+r0<|a||a|,en-1+r0≥|a|]]>。其中h表示边界区的高度,并且yk表示y座标在Bresenham设定点的值。为了简化硬件,错误值是在Bresenham步法开始时以|a|来递减,之后en便能用来与0相比较,这样的比较能让硬件实作更为简化。同时可求出
r1=r0-|a|e~0=e0+r0-|a|---(79)]]>据此,Bresenham步法能以下式更简化来描述x~n=x~n-1+Δx+0,e~n-1<01,e~n-1≥0,n=1,2,...,h-yk---(80)]]>e~n=e~n-1+r0,e~n-1<0r1,e~n-1≥0]]>参阅图6,其是为根据本发明的一具体实施例所建构的Bresenham步法程序的方法的流程示意图。
张成空间产生器结构(SPAN GNERATOR STRUCTURE)参阅图7,其是为根据本发明的一具体实例所建构的张成空间产生器101的功能方块示意图,此张成空间产生器101包含-一输入界面105-3个载入器102-12个边线产生器103-4个串叠的3输入排序器104-一输出界面106-一裁剪区模组107输入界面105打包输入函数式(input functionals)并交付给3个载入器102,由载入器102执行边线产生器103的初始化(initialization),边线产生器103产生″左″与″右″边线,所产生的边线接著被竞争排序器104(tournament Sorters)排序。排序器104的输出是经由输出介面106送到一个影砖产生器(Tile Generator;TG),影砖产生器是用来转换一组张成空间成为一连串的影砖,一个影砖是参照于一个被成像的矩型像素组(a rectangle set of pixels to berendered)。
进一步地,张成空间产生器101可解决以下问题1.张成空间产生器101可针对具有15个函数式的三角形提供张成空间。X与Y的割截是以裁剪区模组107来执行,因此保留了11个函数式,基于下述第3与第4项所描述的理由,有12个边线产生器103位于张成空间产生器101架构中。
2.张成空间产生器101每个时脉周期产生至少2个张成空间,相较于每个时脉周期展生一个张成空间,呈现出双倍的效能,但是需要多30%的成本。
3.以一组简化的函数式集合为例(例如少于7或8),张成空间产生器101能够在每个时脉周期产生超过两个张成空间。在这种情形下,可用两个边线产生器103来处理相同的函数式,且载入器102是根据个别边线产生器的初始值偏移(initial offsets)来设定至不同的张成空间。以类似的方式,在处理少于4个函数式的情况时,张成空间产生速率可达到每个时脉周期产生8个张成空间。
4.在大部份情形下,载入器102让张成空间产生器101能够具有最大效能,而其中的运作则涉及3个函数式。因此,张成空间产生器101是包含3个载入器102,其中每一个载入器102能够依续载入4个边线产生器103。
5.对于以网格旋转的非调整过度取样,张成空间产生器101是以一个已知的切线来割截数个半平面,此过程可以用一个另外的装置来完成。
资料格式的外部假设
内部资料格式
输入界面(INPUT INTERFACE)张成空间产生器101具有以下输入界面
域名(Field长度(比特) 描述name)L 1 此讯号在最前面的三个函数式被载入时开始M 1 模式0-标准,1-框线R 8 在目前网格单位的框线宽度F 4 函数式的数量。在框线模式的情形下,最高的三个比特(three LSB)是为用来绘出边线的遮罩(0代表不绘出,1代表绘出),并且最低比特(MSB)是为用来要求将边线区在方向以W/2来延伸A 22×3 用于11个函数式的系数a的值。如果指定的函数式不存在则为0B 22×3 用于11个函数式的系数b的值。如果指定的函数式不存在则为0C 42×3 用于11个函数式的系数c的值。如果指定的函数式不存在则为0X015 在裁剪区的左边线开始的x值X115 在裁剪区的右边线开始的x值Y 15 在裁剪区上方角落的y座标Y015 在裁剪区左方角落的y座标Y115 在裁剪区右方角落的y座标Y215 在裁剪区下方角落的y座标T 2 根据下述,裁剪区左边线的切线斜率00右边线为垂直01切线斜率为110切线斜率为211切线斜率为3XMIN 15 边界区左边线的x座标值XMAX 15 边界区右边线的x座标值YMIN 15 边界区上边线的y座标值YMAX 15 边界区下边线的y座标值框线在此是假设框线是由位于紧密结合的边界区与裁剪区的内的三个边线函数式所完成,意即割截平面并不支援于框线。除了载入器102应该要提供用于两个套叠三角形的修正用函数式,用于框线模式的张成空间并没有特殊不同的处。内部三角形是在目前网格中一组点的集合,其应该被排除在外部三角形的外。就一条边线f(x,y)=a·x+b·y+c而言,对于这两个三角形函数式的值为f1(x,y)=a·x+b·y+c+w/2-外边线f2(x,y)=a·x+b·y+c-w/2-内边线,在此w为框线边线的宽度。
载入器参阅图8,其是为根据本发明的一具体实施例所建构的载入器102(不含平移器(shifter))的功能方块示意图,载入器102包含以下的输入SHORT xMin,yMin,xMax,yMax,a,b;LONG c;SHORT nF;//函数式的数量与输出SHORT c0l,c0h,c1l,c1h,bl,bh,al,ah,m;BOOL dir,cor。
在初始化时,载入器102决定这些全域变数的值,也就是对多边形的所有函数式而言这些值都是相同的。为了达到这样的目的,载入器102运算以下边界区的参数SHORT w=xMax-xMin;m=ceiling(log2(w));SHORT W=1<<m;//2**mSHORT h=yMax-yMin;SHORT k=(nF>6)?1(nF>3);SHORTaT,bT;// 接下来载入器102对每个函数式运算nCase=(a<0 && b>=0)?1(a<=0 && b<0)?2(a>0 && b<=0)?4(a>=0 && b>0)?50;//but the“0”is redundantBOOL cor=(nCase>3)?10;BOOL dir=(nCase<2‖nCase>4)?01;LONG cT2=c-a*xMin-b*yMin;// switch(nCase){case 1
aT=a;bT=b;cT=cT2-1;// break;case 2aT=a;bT=-b;cT=-cT2-a*W;case 4aT=-a;bT=-b;cT=-cT2-a;case 5aT=-a;bT=-b;cT=cT2+a*W;}载入器102再接下来分别对两个连续张成空间来运算两个函数式的值,每个函数式是在具有k=1,2,4个边线产生器103的情形下运算。此外载入器102也对其他两个或六个连续张成空间的值做以下的运算c
=cT-bT*(yMin%2);c[1]=c
+bT;for(i=1;i<k;i++){c[i*2]=c[i*2-2]+2*bT;c[i*2+1]=c[i*2-1]+2*bT;}bT<<=k;参阅图9所示,其是为根据本发明的一具体实施例所建构的 与 的值在被载入边线产生器103前的转换(wrapping)示意图,其除法演算法已经在先前描述(参照特殊情形)。但是若直接照上面字面所描述者来执行,则 需要在除法前先被乘以2m来调整比例(scale),这样 会被放大到超出短范围。不过在除法的每个时脉周期中减法的有效长度仍在短范围中,因此相对于 值, 值在除法前被乘以2-m来调整比例,并且相对于被调整比例的 值是在每个时脉周期以2来相除,被调整比例的 是以2来相乘。当Δx=floor(-b~a~)]]>也需要被得知时,则 值也需要被预先调整比例。被调整比例的 比没被调整比例的值长,然而这样并不至于需要一个较长的加法器来执行下移程序。 的低比特组(least significant bits)被转换为高比特组(例如循环转动(cyclic rotation)而非数值运算平移(arithmetical shift)),使得 的值能够以没被调整比例的值的比特长度来表示。为避免由低比特组向高比特组的进位传送(carry propagation),在资料被载入边线产生器103前正负号比特会被转换为相反值。在 的情形下,此比特为0并且不会造成进位传送;若欲侦测是否出现 的情形,做法是为将此比特值与1相比较。 值也是以类似的方式来调整比例,其差别在没有被转换(wrapped)。
在除法过程的第一个时脉周期,边线产生器103会判断 或 两者中是否有任一个超出范围(boundaries),例如判断除法结果是否大于或等于W。为了这个目的,真正的比例值(scale factor)并不为m,而是m+1。在此除法是以上述方式来进行,但是如果结果并不比W小,则x0或是在第一Bresenham步法后所得的结果两者的一会大过边界区限制。
载入器102是循序地载入边线产生器103,由每一个三角形的前三个函数式开始,以第一个函数式载入至第一个边线产生器103的方式依此类推。如果只有三个函数式时,载入器102在接下来的连续时脉周期中会将其他3组张成空间的函数式值载入其他边线产生器中。
考虑到输入界面与在连续时脉周期中载入数个边线产生器103,用于载入器102的虚拟码(pseudo-code)如下template<int N>void Loader<N>(//具有管线作业的,在每个时脉周期被执行//输入界面bool L,//在载入的第一个时脉周期L=1bool M,//M=1在框线模式BIT 2 os,//过度取样网格至像素网格关系//0-4x,1-2x,2-1xBIT 8R,//框线线宽BIT 4F,//函数式的数量,在框线模式的边线遮罩SHORTA,//第一系数SHORTB,//第二系数LONG C,//the free memberBIT 21 XMIN,//边界区的左边线BIT 21 YMIN,//边界区的上边线BIT 21 XMAX,//边界区的右边线BIT 21 YMAX,//边界区的下边线BIT 21 XFUN,//零函数式点的X座标BIT 21 YFUN //零函数式点的Y座标){BIT 3 toGo=(L)?4toGo-1;//计算载入的
//函数式数量BIT 3 nClk=(L)?0nClk+(toGo!=0);//计数载入//的时脉if(L){bool wf=M,BIT 8wW=R,BIT 15 xMIN=((XMIN>>5)BIT 4nFunct=F,BIT 2k=(wf)?2(nFunct<4)?4(nFunct<7)?21;BIT 21w=XMAX-XMIN;BIT 21h=YMAX-YMIN;BIT 4m=ceiling(log2(w));BIT 16W=1<<m;//2**mBIT 15 xMin=XMIN;BIT 15 yMin=YMIN;}BIT 3nCase=(A<0 && B>=0)?1(A<=0 && B<0)?2(A>0 && B<=0)?4
(A>=0 && B>0)?50;//赘余的,未用到BOOL cor=nCase>3;BOOL dir=nCase>=2 && nCase<5;SHORTaT=(A>=0)?-AA;// SHORTb 2T=(B<0)?-BB;// LONG cT2=C- // A*(xMin-XFUN)-B*((yMin & -(k<<1)-YFUN);//以Y来对齐张成空间cT2>>=(6+Os);//平移来取得LONG cT=((dir)?-cT2cT2)// +(nCase==1‖nCase==4)?-1(dir)?-A<<mA<<m;LONGc[8];LONGb[4];
c[7]=c[5]+(b2T<<1);//管线作业c[6]=c[4]+(b2T<<1);c[5]=c[3]+(b2T<<1);c[4]=c[2]+(b2T<<1);c[3]=c[1]+(b2T<<1);c[2]=c
+(b2T<<1);c
=cT-(yMin & 1)?b2T0;c[1]=c
+b2T;SHORT bT=b2T<<(1<<k);//<<2,4,8边线产生器参阅图10A,其是为根据本发明的一具体实施例所建构的边线产生器的功能方块示意图。边线产生器103包含4个24比特加法器与8个24比特暂存器。每一个加法器是以两个暂存器作为输入,暂存器是以多线传输(multiplexed)的方式输入SHORT reg[8];bool carry[4];SHORT add[4];
add
=reg
+reg[4]+carry
;add[1]=reg[1]+reg[5]+carry[1];add[2]=reg[2]+reg[4]+carry[2];add[3]=reg[3]+reg[7]+carry[3];for(i=0;i<8;i++)reg[i]=some_function(add[k],reg[k],…);暂存器的输出直接供应给加法器作为输入,用以将加法器的延迟减到最低,多工器的结构也能让上述的延迟现象降到最低,此外,本发明中后加法器(post-adder)的最大延迟不会超过3×1多工器。
除了一般函数式的实作外,多工器也被用来执行载入与拖延(stalling)的动作,其作法是将一组新的资料或一边线产生器103的前一个状态写回暂存器。
边线产生器103的基本函数式包含三个主要阶段下移、Bresenham设定与Bresenham步法,其共有七个中间状态(interim states),分别为载入(load)、拖延(stall)、下移的第一个时脉周期(first clock ofmoving down)、从下移到Bresenham设定的转换(transfer from movingdown to Bresenham setup)、由Bresenham设定到Bresenham步法的转换的两个不同时脉周期(two different clocks of transfer)与Bresenham的第一个时脉周期。
一个边线产生器具有下列输入SHORT c0l,c0h,c1l,c1h,bl,bh,al,ah,m;BOOL dir,cor,load,stall;当载入讯号被设定时,边线产生器103储存内部暂存器的输入值并重置(reset)其状态。当拖延讯号被设定时,边线产生器103暂存器维持目前时脉周期的内容。
边线产生器下移参阅图10B所示,其是为根据本发明的一具体实施例所建构的边线产生器在下移阶段的功能方块示意图。函数式的值开始时是以c~的值被载入,然后被累加于暂存器中。在此阶段,边线产生器103执行以下动作while(c<0){c=c+b;}应用于电路上,可得到
<pre listing-type="program-listing"><![CDATA[//在载入阶段SHORT mm=bitlength(SHORT)-logm-1;SHORT mask_b=1<<mm;SHORT mask_a=mask_b-1;SHORT mask_o=-1<<(mm-1);SHORT clock=0,repeat=1;;bool pl,ph,rl=0,rh=0;while(repeat){ pl=rl; ph=rh; if(clock==0) { clock=1;if(ch & mask_b) { repeat=0; continue; }rl=carry(cl+bl+ph);cl+=bl; }else { rl=carry(cl+bl+ph); cl+=bl+ph; if((ch & mask_a|mask_o)==-1 && rl) {repeat=0; continue; } rh=carry(ch+bh+pl); ch+=bh+pl; }}]]></pre>上述mask是用来作为0交错侦测的前置动作(preliminary zerocrossing detection),mask的使用可避免函数式的值被“backing-down”,因为没有被写回ch并且ch的低比特组(LSBs)保持原样。此外,mask能让0交错的侦测提前一个时脉周期执行。
设定参阅图10C,其是为根据本发明的一具体实施例所建构的一边线产生器103在Bresenham设定阶段的功能方块示意图。上述在“特别情形”下的除法演算法是实作如下<pre listing-type="program-listing"><![CDATA[//在下移之后setupch &=~(mask_a|mask_b);//设定while(m!=0) {BOOL c0l_c=carry(c0l+a); if(!c0l_c)c0l+=a; c0l<<=1; c0l|=carry(c0h<<1); c0h<<=1; c0h|=!c0l_c; BOOL c1l_c=carry(c1l+a); if(!c1l_c)c1l+=a; c1l<<=1; c1l|=carry(c1h<<1); c1h<<=1;c1h|=!c1l_c;BOOL bl_c=carry(bl+a);if(!c0l_c)c0l+=a;bl<<=1;bl|=carry(bh<<1);bh<<=1;bh|=!bl_c;m=m-1;}]]></pre>BRESENHAM步法在Bresenham设定的过程完成后,ch、cl、bh与bl这四个值便被产生,分别用来表示Bresenham错误、x0、正更正值与Δx。为了产生边线,还需要一个负更正值r1。此时,是由载入器102设定布林变数(Booleanvariables)dir与cor,以设定dir为1来表示边线产生器103从W减去x值,并且以设定cor为1来表示边线产生器103加1到x值中。若x值溢载,则一适当的旗标会根据上述的dir变数值而被设定出来。
<pre listing-type="program-listing"><![CDATA[//设定之后SHORT fm=(1<<m)-1 //反(negation)mask=W-1SHORT nm=(dir)?fm0 //如果dir==1则为否(negate)SHORT om=~fm;//将mask溢载来侦测x<0或x>=W#define er ch#define x0 cl#define r0 bh#define r1a#define dx blx0=(nm^x0)+cor; //x0=W-1-x0+corif(dir) dx=~dx;r1=a+b;//a为负数,所以r1=|b|-|a|//er=er+a;//之后在Bresenham的第一个时脉周期被执行// 在此时,根据边线产生器的一般结构,有些数值会被搬移至不同的暂存器//第一时脉周期SHORT clock=0;BOOL uf=false,ov=false;while(1){ if(x0 & om) if(dir)uf=true;//x0必需为负值else ov=true;//x0必需为>=Wif(uf‖ov) continue;//不更新暂存器if(clock==0) { clock=1; x0+=dx+dir; er+=r1; }else { x0+=dx+(er>=0)?1-dirdir; er+=(er>=0)?r1r0; }}]]></pre>除以3的除法器(DIVIDER-BY-3)除以3的除法器是用以将y乘上1/3来偏移,一个15比特的除以3的乘法器是如下述<pre listing-type="program-listing"><![CDATA[#define bit(a,n,m) ((a>>n)&((1<<(m-n+1))-1)) //在ANSI C的语法中并不正确,但是在此是可行的#define bitrev(a)(((a & 2)>>1)|((a & 1)<<1))#define simp(a,b,c,d)((~d & ~c & b|c & a|d & ~b & ~a) & 1) //单比特作业#define remh(a,b)simp(a,a>>1,b,b>>1)#define reml(a,b)simp(a>>1,a,b>>1,b)#define rems(a,b)((remh(a,b)<<1)|reml(a,b))#define sim1(a,b,c)((~c & b|c & ~b & ~a) & 1) //单比特作业#define sim2(a,b,c)((~c & a|c & b) & 1)//单比特作业#define remc(a,b)sim1(a,a>>1,b)#define remd(a,b)sim2(a,a>>1,b)#define reme(a,b)((remc(a,b)<<1)|remd(a,b))#define remf(a,b)bitrev(reme(bitrev(a),b))bit16 div(bit15a){bit15 c=a & 0x2aaa,d=a & 0x1555; c=(c & ~(d<<1))|(~(c>>1) & d); //许可比特1 a14=bit(a,14,14); a13=bit(a,13,13); a11=bit(a,11,11); a09=bit(a,9,9); a07=bit(a,7,7); a05=bit(a,5,5); a03=bit(a,3,3); a01=bit(a,1,1);bit2 part0[7]={ bit(c,0,1),//比特00,01 bit(c,2,3),//比特02,03 bit(c,4,5),//比特04,05 bit(c,6,7),//比特06,07 bit(c,8,9),//比特08,09 bit(c,10,11),//比特10,11 bit(c,12,13) //比特12,13 },bit2 part1[8]={ rems(part0[1],part0
), reme(part0[1],a01), rems(part0[3],part0[2]), reme(part0[3],a05), rems(part0[5],part0[4]), reme(part0[5],a09), remf(part0[6],a14), a13 & ~a14 },bit2 part2[8]={ rems(part1[2],part1
), rems(part1[2],part1[1]), rems(part1[2],part0[1]), reme(part1[2],a03), rems(part1[6],part1[4]), remh(part1[6],part1[5]), reml(part1[6],part0[5]), remc(part1[6],a11), },bit2 part3[8]={ rems(part2[4],part2
), remh(part2[4],part2[1]), reml(part2[4],part2[2]), remh(part2[4],part2[3]), reml(part2[4],part1[2]), remh(part2[4],part1[3]), reml(part2[4],part0[3]),remc(part2[4],a07) };bit14 m=bit(a,0,13)∧(((part3
&1)<<0)|((part3[1]&1)<<1)|((part3[2]&1)<<2)|((part3[3]&1)<<3)|((part3[4]&1)<<4)|((part3[5]&1)<<5)|((part3[6]&1)<<6)|((part3[7]&1)<<7)|((part2[4]&1)<<8)|((part2[5]&1)<<9)|((part2[6]&1)<<10)|((part2[7]&1)<<11)|((part1[6]&1)<<12)|((part1[7]&1)<<13)); return(m<<2)|part3
;//将提示集中}]]></pre>裁剪区与同步化参阅图十一A,其是为根据本发明的一具体实施例所建构的裁剪区的功能方块示意图。张成空间产生器101包含一裁剪区模组107,此裁剪区模组107由一视景埠(view-port)来提供裁剪,视景埠被用来以正切值(tangent)为0、1/2与1/3(往后叙述时也会分别参照到正切值为0、1、2与3)来旋转x轴与y轴。被旋转的裁剪区左上角的垂直座标y0为0,并且左下角的水平座标x1也为0。应注意者是为,裁剪区也可被应用于本发明中具有过度取样系统(over-sampling scheme)的具体实施例中。
裁剪区具有由四个点所指定的原始值,这些点的座标是由驱动程序所计算出来并且储存于暂存器中。其中,上方角落的y座标为y0=0。裁剪区装置所执行者是为作用于第一张成空间的初始裁剪区座标的计算工作,且之后在每个时脉周期中裁剪区装置会在目前张成空间计算出多达8个裁剪区座标。
参阅图11B,其是为根据本发明的一具体实施例所建构的裁剪区的功能方块示意图。此用以绘出裁剪区的装置会产生介于裁剪区两个边线间的张成空间,再以裁剪区的两个部份来一起产生边线,其中这些边线是使用到有关于x与y座标的开始值、角落的y座标与旋转角度的正切值。是如下述<pre listing-type="program-listing"><![CDATA[void ScissoringBox(SHORT x0,//开始时左边的xSHORT x1,//开始时右边的xSHORT y, //开始时的y(Ymin)SHORT y0,//左角落的y座标SHORT y1,//右角落的y座标SHORT y2,//结束时的y(Ymax)char t){//2比特正切表示式char cnt0=t,cnt1=t;while(y<y2){ bool m0=y>=y0; x0+=(t)?((m0)?t(cnt 0)?0-1)0; cnt0=(m0)?t(cnt0)?cnt0-1cnt0; bool m1=y<y1; x1+=(t)?((m1)?t(cnt1)?0-1)0; cnt1=(m1)?t(cnt1)?cnt1-1cnt1; }}]]></pre>
接着,x0,x1座标对在边线座标(edge coordinates)中被边线产生器103所排序。
排序器(SORTER)如图7所示,一排序器104是为一个具有4个输入的比较/多工硬件装置,其中3个输入与运作在相同的时脉周期的3个边线产生器103耦合,并且此3输入其中的一个更耦合运作于前一个时脉周期的排序器104的一个输出。在包含四组边线产生器103的一具体实施例中更包含四个排序器104,其中,每一个边线产生器103递交一个半平面(左或右)的方向作为x座标值的标注(tag),且排序器104分别比较不同类型的边线的x值。
<pre listing-type="program-listing"><![CDATA[typedef struct{ //边线产生器的输出 intx, //位置 bool uf,ov;//在边界区之下 bool dir; //左(0)或右(1) } edge_out;class temp_span{public intx0,x1; //左与右 bool uf0,ov0;//在边界区的下的左边bool uf1,ov1;//在边界区的下的右边temp_span() x0=0,x1=0, uf0=false,ov0=false, uf1=false,ov1=false {};temp_span(edge_out ed)temp_span(){ if(ed.dir){//如果边线为右边,则为最大的x x1=ed.X; uf1=ed.Uf; ov1=ed.Ov; } else{//如果边线为左边,则为最小的x x0=ed.X; uf0=ed.Uf; ov0=ed.Ov; }}; };temp_span sort_two(temp_spans 0,temp_spans 1) { temp_spanresult; bool x0m=s0.uf0‖s1.ov0‖//比较旗标与值 (!s1.uf0 && !s0.ov0 && s0.x0<s1.x0);// bool x1m=s0.ov1‖s1.uf1‖ (!s1.ov1 && !s0.uf1 && s0.x1>=s1.x1); result.x0=(x0m)?s1.x0s0.x0;//左边的最大值 result.uf0=(x0m)?s1.uf0s0.uf0; result.ov0=(x0m)?s1.ov0s0.ov0; result.x1=(x1m)?s1.x1s0.x1;//右边的最小值 result.uf1=(x1m)?s1.uf1s0.uf1; result.ov1=(x1m}?s1.ov1s0.ov1; returnresult; } temp_span sorter{temp_spans0,//前一排序器的输出 edge_out x1,//第一个边线产生器输出 edge_out x2,//第二个边线产生器输出 edge_out x3 //第三个边线产生器输出 ) { temp_spans1(x1),s2(x2),s3(x3); returnsort_two( sort_two(s0,s1), sort_two(s2,s3) ); }]]></pre>张成空间缓冲区界面(SPAN BUFFER INTERFACE)张成空间缓冲区界面(也就是显示在第七图的输出界面106)转换最后排序器的输出成为绝对值座标(请注意这些值是为由载入器102经由排序器104所得的边界区相关资料)并且将他们装进张成空间缓冲区。
在张成空间产生过程的中,被运算出来的值中包含最后排序器s3的输出、其他三个排序器s0、s1与s2被越过(bypassed)的输出、目前的y座标、边界区的参数xmin与xmax,以及对相同函数式计算张成空间的边线产生器的数量k=1,2,4。应注意者是为,在此排序器104为双倍,因为每个时脉周期中张成空间被产生的最低比例为两个,因此有两个张成空间在每个时脉周期被平行处理。
<pre listing-type="program-listing"><![CDATA[ bool wf;//框线模式wf==true bool update=true;//当新的三角形开始时SB应该要取得新的y SHORT xMax,xMin; SHORT y;//从目前的y计数器 SHORT w=xMax-xMin;//边界区的真正大小 typedef struct{ x0,x1;//数值-1 and-2为保留给 //uf与ov. }span; SHORT sb_cnt=0;//在SB列的计数器位置 span spare_buffer[16]; void WriteNextToSB( span sp,//要写入的张成空间 SHORT pos,//在SB列的位置bool next //下一列 );void move_sb_cnt(){ sb_cnt++; if(sb_cnt>=8){ Span_Buffer.Write(//see TG doc for description spare_buffer, y&(0xfffffff0‖wf<<3),//y被对齐 update, //有必要的话更新y wf, //框线 update); update=false; sb_cnt=0; } }void sb_interface( temp_spans[8],//前两个-从第一级的排数器 //下两个-从第二层,依此类推SHORT y, //从y计数器SHORT xmin,//从输入SHORT xmax,//从输入SHORT k //从输入) {int j;span sp[8];//暂时的张成空间//以下实际上是在排序器的输出被执行for(j=0;j<8;j++) { sp[j].x0= (s[j].ov0)?MAX_INT (s[j].uf0)?-1 (s[j].x0>w)?MAX_INTs[j].x0+xMin; sp[j].x1= (s[j].ov1)?MAX_INT (s[j].uf1)?-1 (s[j].x1>w)?MAX_INTs[j].x1+xMin; }if(update){sb_cnt=y&(wf)?0x70xf; for(j=0;j<16) spare_buffer[j].x0=spare_buffer[j].x1=0; } if(wf) { bool empty[4];// 用于内部三角形的全部4个张成空间的 // 空旗标 for(j=0;j<4;j++) { empty[j]= s[j+4].x0==MAX_INT‖s[j+4].x1==-1‖ s[j+4].x0>s[j+4].x1; spare_buffer[sb_cnt+j].x0=sp[j].x0; if(empty[j]){ spare_buffer[sb_cnt+j].x1=sp[j].x1; spare_buffer[sb_cnt+j+8].x0=MAX_INT; spare_buffer[sb_cnt+j+8].x1=-1; }else { spare_buffer[sb_cnt+j].x1=sp[j+4].x0; spare_buffer[sb_cnt+j+8].x0=sp[j+4].x1; spare_buffer[sb_cnt+j+8].x1=sp[j].x1; } move_sb_cnt(); } sb_cnt=(sb_cnt+4); return; } for(j=(k-1)*2;j<k*2;j++){ if(k==2 && j==4)//当k==2采用第 j==6; //一及第三排序器的输出 spare_buffer[sb_cnt]=sp[j]; move_sb_cnt(); } }]]></pre>显然地,依照上面实施例中的描述,本发明可能有许多的修正与差异。因此需要在其附加的权利要求项的范围内加以理解,除了上述详细的描述外,本发明还可以广泛地在其他的实施例中施行。上述仅为本发明的较佳实施例而已,并非用以限定本发明的申请专利范围;凡其它未脱离本发明所揭示的精神下所完成的等效改变或修饰,均应包含在下述申请专利范围内。
权利要求
1.一种描绘的方法,其特征在于,该描绘的方法包含决定一线段与一边界区的交会点,该线段是以一函数式f(x,y)=a·x+b·y+c来表示;以及执行一Bresenham步法,该Bresenham步法是沿着该线段的一部份来执行,该部份是落于边界区之中,并且该部份具有(a)一初始x座标x0与(b)另外一个或多个的x值递增的x座标;其中该决定步骤与执行步骤包含使用一加法器,并且其中该决定步骤与执行步骤不包含使用一乘法器或除法器。
2.如权利要求1所述的描绘的方法,其特征在于,其中上述的加法器包含一短加法器来反复由b减去a与由c减去a。
3.如权利要求1所述的描绘的方法,其特征在于,其中上述的初始x座标x0=floor(-c/a)并且一个或多个其他的x座标以至少Δx=floor(-b/a)来递增,其中该加法器包含一短加法器,该短加法器是用以反复由c减去a来计算x0与反复由b减去a来计算Δx。
4.一种描绘的方法,其特征在于,该描绘的方法包含接收(a)一用来表示一第一函数式的第一系数集合与(b)一边界区偏移;以及计算用来表示一第二函数式f(x,y)=a·x+b·y+c的一第二系数集合a、b与c,其中,该第二函数式是落在a<0与b≥0所表示的象限之中;其中该计算步骤包含对一中间值调整比例,此调整比例的动作包含该中间值的循环比特旋转,据此使得该中间值被表示于一第一比特长度中,而该中间值调整比例后的版本则被表示于一第二比特长度中,其中该第二比特长度不超出该第一比特长度。
5.如权利要求4所述的描绘的方法,其特征在于,其中还进一步包含由一第一座标系统至一第二座标系统的转换步骤,其中,该第一函数式是根据该第一座标系统并且该第二函数式是根据该第二座标系统。
6.如权利要求5所述的描绘的方法,其特征在于,其中上述的第一座标系统是对应到一主要网格并且该第二座标系统是对应到一过度取样网格。
7.一种以一视景埠来提供裁剪区的方法,其特征在于,该以视景埠来提供裁剪区的方法的步骤包含接收(a)一个由相对应于x轴与y轴的关系来表示的第一像素张成空间、(b)一个或多个由相对应于x轴与y轴的关系来表示一裁剪区的座标、与(c)一个由相对应于x轴与y轴的关系来表示的裁剪区旋转角度正切;以及计算一第二像素张成空间,该第二像素张成空间是以相对应于该裁剪区的关系来表示;其中,该裁剪区是用以指出一被旋转的割截矩形。
8.如权利要求7所述的以一视景埠来提供裁剪区的方法,其特征在于,其中上述的旋转角度正切为0、1、1/2或1/3。
9.如权利要求8所述的以一视景埠来提供裁剪区的方法,其特征在于,其中上述的计算步骤包含用来实作一除以3演算法的一硬件元件,该硬件元件包含一短加法器。
全文摘要
一种低成本高速度的可程序化描绘器,其接收一组用以表示一三角形、割截平面(clipping plane)与裁剪区(scissoring box)的函数式来作为输入,并且在每个时脉周期产生数个张成空间(span)来作为输出。本发明并提供一种载入器(Loader),其将上述的输入的形式从一般形式转换成被一组边线产生器(Edge Generator)所接受的一特殊形式,其中,上述的被边线产生器所接受的受限定输入格式可提供上述的边线产生器有效率的硬件实作。
文档编号G06T11/20GK1652157SQ20041008331
公开日2005年8月10日 申请日期2004年9月29日 优先权日2003年12月23日
发明者康士坦丁·艾尔洽, 柏瑞斯·柏克潘克, 提莫·佩塔西, 德瑞克·格兰丁 申请人:威盛电子股份有限公司