基于Zigzag块扫描的光栅化算法设计与实现
基本光栅图形学算法

SEI
18
高级语言程序设计 计算机图形学 2010秋季 程序设计基础 • 2007春季
C++ 填充
步骤 求交
逐点比较法 Y-X扫描线 X
扫描线算法
求扫描线与多边形各边交点 排序 按 x 递增顺序对交点排序 交点匹配 1-2,3-4,5-6等 填充 填充每对交点间在多边形区域 内部的象素。 内部的象素。
17
逐点比较法 Y-X扫描线 X 扫描线种子
SEI
高级语言程序设计 计算机图形学 2010秋季 程序设计基础 • 2007春季
C++ 填充
扫描线算法
原理
逐点比较法 Y-X扫描线 X
对任一条扫描线, 对任一条扫描线,确 定该扫描线与多边形 边的交点位置,自左 边的交点位置, 向右存储, 向右存储,并对每对 内部交点间的帧缓存 填写指定颜色
SEI
15
高级语言程序设计 计算机图形学 2010秋季 程序设计基础 • 2007春季
C++ 填充
3.3 多边形区域填充
区域填充是光栅系统的一大亮点,优于向量 区域填充是光栅系统的一大亮点 优于向量 系统 区域填充利于物体的真实感建模
SEI
16
高级语言程序设计 计算机图形学 2010秋季 程序设计基础 • 2007春季
SEI
21
高级语言程序设计 计算机图形学 2010秋季 程序设计基础 • 2007春季
C++ 填充
扫描线算法
每条扫描线具有一个链表, 每条扫描线具有一个链表,包含与其相交边的信息
struct E { double ymax; double x_Intersection; double dx; E * pointer ; }
直线光栅化 算法

直线光栅化算法1. 概述直线光栅化算法是计算机图形学中常用的一种算法,用于将抽象的直线表示转化为具体的像素点绘制。
通过对直线的各个点进行逐一计算,可以将直线在屏幕上精确地表示出来。
本文将介绍直线光栅化算法的基本原理、具体实现过程以及一些常见优化方法。
2. 直线光栅化算法的原理直线光栅化算法的基本原理是利用数学公式计算直线上各个像素点的坐标,并将其绘制在屏幕上。
直线的坐标由两个点确定,即起点和终点。
下面是直线光栅化算法的基本步骤:2.1 计算斜率与步长首先,根据给定的起点和终点,需要计算直线的斜率和步长。
直线的斜率可以通过以下公式计算:斜率 = (终点的纵坐标 - 起点的纵坐标) / (终点的横坐标 - 起点的横坐标)步长指的是在横坐标上每前进一个单位,纵坐标需要前进多少单位。
步长的计算可以根据直线斜率的正负进行分类讨论。
2.2 根据步长逐点绘制直线在计算了直线的斜率和步长之后,可以按照以下步骤绘制直线:1.初始化当前点的坐标为起点的坐标;2.根据步长的正负,依次对当前点的横坐标和纵坐标进行加减操作,以逐点向终点绘制;3.在每个点的位置上绘制像素。
3. 直线光栅化算法的实现3.1 Bresenham算法Bresenham算法是直线光栅化算法的一种经典实现方式。
它的基本思想是通过递推方式,根据当前点的坐标和斜率来选择下一个像素点的位置。
下面是Bresenham算法的具体实现步骤:1.初始化起点的坐标和终点的坐标;2.计算直线的斜率和步长;3.计算像素点的位置,并绘制像素;4.根据当前点位置和斜率的大小关系,更新下一个像素点的坐标。
Bresenham算法的优点是计算简单,适用于直线斜率大致在0到1之间的情况。
3.2 DDA算法DDA算法是另一种常用的直线光栅化算法,它的基本思想是通过逐点增量的方式来计算直线上的像素点坐标。
下面是DDA算法的具体实现步骤:1.初始化起点的坐标和终点的坐标;2.计算直线的斜率和步长;3.根据步长逐点增量,计算下一个像素点的坐标;4.绘制像素点。
基本图形的光栅化算法

基本图形的光栅化算法如何在指定的输出设备上根据坐标描述构造基本⼆维⼏何图形(点、直线、圆、椭圆、多边形域、字符串及其相关属性等)。
图形⽣成的概念图形的⽣成:是在指定的输出设备上,根据坐标描述构造⼆维⼏何图形。
图形的扫描转换:在光栅显⽰器等数字设备上确定⼀个最佳逼近于图形的象素集的过程。
直线段的扫描转换直线的绘制要求(1)直线要直;(2)直线的端点要准确,⽆定向性⽆断裂;(3)直线的亮度、⾊泽要均匀;(4)画线的速度要快;(5)具有不同的⾊泽、亮度、线型等。
解决的问题:给定直线两端点P0(x0,y0)和P1(x1,y1),画出该直线。
逐点⽐较法:数值微分法(DDA法):增量算法直观、易实现不利于⽤硬件实现x(i+1) = x(i) + 1y(i+1) = y(i) + k中点Bresenhan算法:算法原理:根据直线的斜率确定或选择变量在x或y⽅向上每次递增⼀个单位,⽽另⼀⽅向的增量为1或0,它取决于实际直线与相邻象素点的距离,这⼀距离称为误差项。
中点Bresenham算法——算法步骤输⼊直线的两端点P0(x0,y0)和P1(x1,y1)。
计算初始值△x、△y、D=△x-2△y、x=x0、y=y0。
绘制点(x,y)。
判断D的符号。
若D<0,则(x,y)更新为(x+1,y+1),D更新为D+2△x-2△y;否则(x,y)更新为(x+1,y), D更新为D-2△y。
当直线没有画完时,重复上⼀步骤,否则结束。
改进的Bresenhan算法——算法步骤1.输⼊直线的两端点P0(x0,y0)和P1(x1,y1)。
2.计算初始值△x、△y、e=-△x、x=x0、y=y0。
3.绘制点(x,y)。
4.e更新为e+2△y,判断e的符号。
若e>0,则(x,y)更新为(x+1,y+1),同时将e更新为e-2△x;否则(x,y)更新为(x+1,y)。
5.当直线没有画完时,重复步骤3和4。
否则结束。
圆的扫描转换解决的问题:绘出圆⼼在原点,半径为整数R的圆x2+y2=R2。
光栅图形学算法

光栅图形学算法光栅图形学算法基础其二(裁剪算法)光栅图形学算法的研究内容直线段的扫描转换算法多边形的扫描转换与区域填充算法直线裁剪算法反走样算法消隐算法一、裁剪简述使用计算机处理图形信息时,计算机内部存储的图形往往比较大,而屏幕显示的只是图形的一部分。
因此需要确定图形哪些部分落在显示区之内,哪些落在显示区之外。
这个选择的过程就称为裁剪。
常见的裁剪方式有点的裁剪、以及直线段的裁剪。
1、点的裁剪最简单的裁剪方法是把各种图形扫描转换为点之后,再判断点是否在窗口内。
对于任意一点P(x,y),若满足下列两对不等式:则点P在矩形窗口内;否则,点P在矩形窗口之外。
判断图形中每个点是否在窗口内,太费时,一般不可取。
2、直线段的裁剪直线段裁剪算法复杂图形裁剪的基础。
?直线段和剪裁窗口的可能关系:完全落在窗口内完全落在窗口外与窗口边界相交 ?要裁剪一条直线段,首先要判断:(1)它是否完全落在裁剪窗口内??(2)它是否完全在窗口外?(3)如果不满足以上两个条件,则计算它与一个或多个裁剪边界的交点。
常用的裁剪算法有三种,即Cohen-Sutherland、中点分割法和 Liang-Barsky 裁剪算法。
1) Cohen - Sutherland算法此算法又称编码裁剪算法,算法的基本思想是对每条直线段分三种情况处理:若点p1和p2完全在裁剪窗口内。
“简取”之?若点p1(x1,y1)和p2(x2,y2)均在窗口外,且满足下列四个条件之一:如果直线段既不满足“简取”的条件,也不满足“简弃”的条件?需要对直线段按交点进行分段,分段后判断直线是“简取”还是“简弃”。
每条线段的端点都赋以四位二进制码D3D2D1D0,编码规则如下:若XXleft,则D0=1,否则D0=0若XXright,则D1=1,否则D1=0若yybottom,则 D2=1,否则 D2=0若yytop,则 D3=1,否则 D3=0 窗口及其延长线所构成了9个区域。
计算机图形学第二讲光栅图形学ppt课件

中点画线法
构造判别式:
d=F(M)=F(xp+1,yp+0.5)
P2
=a(xp+1)+b(yp+0.5)+c
Q
当d<0,M在直线(Q点)下 方,取右上方P2;
P=(xp,yp) P1
当d>0,M在直线(Q点)上
方,取右方P1;
当d=0,选P1或P2均可, 约定取P1;
能否采用增量算法呢?
中点画线法
Bresenham算法
Bresenham画线算法
在直线生成的算法中Bresenham算法 是最有效的算法之一。令 k=Δy/Δx, 就0≤k≤1的情况来说明Bresenham算法。 由DDA算法可知:
yi+1=yi+k (1) 由于k不一定是整数,由此式求出的yi也 不一定是整数,因此要用坐标为(xi,yir) 的象素来表示直线上的点,其中yir表示 最靠近yi的整数。
x y int(y+0.5)
00
0
Line: P0(0, 0)-- P1(5, 2)
1 0.4 0
3
2 0.8 1
2
3 1.2 1
4 1.6
2
1
5 2.0
2
0 12 3 4 5
数值微分(DDA)法
• 缺点: 在此算法中,y、k必须是float,且每一 步都必须对y进行舍入取整,不利于硬件实现。
• 原理:
更新为(x+1,y+1),同时将e更新为e-2△x;否则 (x,y)更新为(x+1,y)。 5.当直线没有画完时,重复步骤3和4。否则结束。
Bresenham画线算法
BresenhamLine(x0,y0,x1,y1,color) {
光栅的原理及应用方法图解

光栅的原理及应用方法图解1. 光栅的原理光栅是一种具有周期性结构的光学元件,由一系列平行且等间距的透明槽或凹槽组成。
光栅的原理基于衍射现象,通过改变入射光的传播方向和干涉效应来实现光的分光和光谱分析。
1.1 衍射原理光栅的衍射原理是基于赖奥的法尔久衍射理论,即光在通过光栅时会发生衍射现象。
当光线通过光栅的时候,会出现多个次级波源,这些次级波源会发生干涉,使得光的传播方向发生改变。
由于光栅的周期性结构,干涉的结果会产生一系列有序的主峰和次级峰,形成衍射图样。
1.2 光栅的构造光栅通常由一系列平行的凹槽或透明槽组成,这些凹槽或透明槽之间具有固定的间距。
光栅的刻线密度决定了它的分光能力,刻线越密集,分光能力越强。
1.3 光栅方程光栅方程描述了光栅的衍射现象,它可以用来计算光通过光栅后的衍射角度和波长之间的关系。
光栅方程通常写作:nλ = d(sinθ + sinϕ)其中,n是衍射级次,λ是入射光的波长,d是光栅的间距,θ是入射角,ϕ是衍射角。
2. 光栅的应用方法光栅具有广泛的应用,特别是在光谱分析、波长选择和光学成像等领域。
以下列举了光栅的一些常见应用方法。
2.1 光谱分析光栅可以将入射光按照不同的波长进行分离,从而实现光谱的分析。
通过调节光栅的刻线密度,可以选择不同的波长范围进行分离,从而得到光的光谱信息。
光谱分析在物质分析、天文学研究等领域具有重要的应用价值。
2.2 光学成像光栅可以用于光学成像,在光学显微镜、光学望远镜等领域发挥重要作用。
通过调整光栅的参数,可以实现对特定波长的光进行成像,从而得到清晰的图像。
光栅在光学成像设备中的应用可以提高分辨率和减小像差。
2.3 波长选择光栅也可以用作波长选择器,通过选择特定的衍射级次,可以将特定波长的光分离出来。
这种波长选择器广泛应用于激光器、光通信等领域,可以实现光信号的调制和多路复用。
2.4 光栅衍射实验光栅也常用于光学教学实验中。
通过光栅的衍射现象,可以观察到明显的衍射图样,让学生直观地感受到光的波动性。
基本光栅图形算法
if Pi>0 则yi+1=yi+1; 否则yi+1=yi;
3、画点(xi+1, yi+1); 4、求下一个误差Pi+1;
if Pi>0 则Pi+1=Pi+2dy-2dx; 否则Pi+1=Pi+2dy;
5、i=i+1; if i<dx+1则转4;否则end
xi1
yi
1,r
xi 1
yi,r
yi,r
1
(xi1 ) 0 (xi1 ) 0
偏差的递推关系
误差
( xi1 ) yi1 yi,r 0.5
因为 yi1 yi m
有 (xi1 ) yi1 yi,r 0.5
yi m yi,r 0.5
yi ( yi1,r
yi
2、
基本光栅图形算法
数学表示的若干方法
1)数学方程 2)点集 3)边界表示 4)关系表示
常用的图形对象
线段 圆 多边形 字符等
一、直线
在光栅显示器的荧光屏上生成一个对象,实质上是往 帧缓存寄存器的相应单元中填入数据。
线段 理想的是无数多的零面积的点构成。 而在实际显示中,在光栅扫描显示器上,线段是
Fk
= tg-tg=
Yk X A YA X k XAXk
偏差计算
可以简化为
Fk Yk X A YA X k
根据 Fk 计算出偏差,然后确定下一步的走向。 初始: X 0 0; Y0 0; 则 F0 =0;
第一步:如果选择X方向,则 X1 X 0 1 1; Y1 0; F1 Y1X A YA X1 0 *7 1*5 5
光栅化——精选推荐
光栅化什么叫光栅化处理?就是变成位图(光栅图),Rasterize。
光栅化是将⼀个图元转变为⼀个⼆维图像的过程。
⼆维图像上每个点都包含了颜⾊、深度和纹理数据。
将该点和相关信息叫做⼀个⽚元(fragment)。
光栅图像 栅是格栅,就是纵横成排的⼩格.⼩格⼩到极⾄,就是点了.⼀个图像⼈可以看⼀眼就明⽩了.但是计算机要记录下来就要把这个图像分成⼀个个⼩格也就是点阵.点格栅分得越细,图像也就记录得越有细节.光栅图也叫做位图、点阵图、像素图,简单的说,就是最⼩单位由像素像素构成的图,只有点的 光栅图信息.缩放时会失真。
每个像素有⾃⼰的颜⾊,类似电脑⾥的图⽚都是像素图,你把它放很⼤就会看到点变成⼩⾊块了。
这种格式的图适合存储图形不规则,⽽且颜⾊丰富没有规律的图,⽐如照相,扫描。
BMP,GIF,JPG等等.格式的⽂件.重现时,看图软件就根据⽂件⾥的点阵绘到屏幕上.或都打印出来.描述,⽮ 与光栅图相对的是,⽮量图⽮量图也叫做向量图,记录的是点、线、⾯的位置和颜⾊信息的描述量图没有直接是点的信息,还有线,⾯,基本图形等信息,但只是描述.重现时看图软件就解读这些描述重绘出来.这样,图形放⼤不会失真,适合存储像标志、线路图、设计图等,这种格式的优势是放⼤不失真、占空间⼩等优点,⽐如很多flash动画就是⽮量绘图。
CAD,PRO_E等的⽂件 地图⽤⽮量图来表⽰⽐光栅图优势更⼤,因为地图需要缩放来查看详细的区域,另外,在修改地图时,只需要对原有的⽮量信息进⾏编辑即可,⽽光栅图就需要重新绘制了,只是⽮量图在显⽰器上显⽰时,是需要实时运算转换成像素图的,因为显⽰器本⾝是像素结构的。
什么是光栅?光栅——制作⽴体图像时所⽤的⼀种光学材料。
通俗地讲,若⼲个形状⼤⼩⼀样、光学性能⼀致的透镜在⼀平⾯上按垂直⽅向顺序排列,就形成光栅条,若⼲条光栅条按⽔平⽅向依次排列,就形成光栅板,通常称为光栅。
⽴体图像就是利⽤光栅材料的特性,将不同视⾓的同⼀拍摄对象的若⼲幅图像或同⼀视⾓的若⼲幅不同的图像的画⾯细节按⼀定顺序错位排列显⽰在⼀幅图像画⾯上,通过光栅的隔离和透射或反射,将不同⾓度的图像细节印射在⼈们的双眼,形成⽴体或变换的果。
3、图形光栅化1
在光栅显示器上显示任何一种图形,实际上都 在光栅显示器上显示任何一种图形, 是一些具有一种或多种颜色的象素的集合。 是一些具有一种或多种颜色的象素的集合。 对图形的扫描转换一般分为两个步骤: 对图形的扫描转换一般分为两个步骤:先确定 扫描转换一般分为两个步骤 有关象素,再用图形的颜色或其它属性, 有关象素,再用图形的颜色或其它属性,对象素进 行某种写操作。 行某种写操作。 图形光栅化时,还有窗口内图形显示的裁剪 裁剪和 图形光栅化时,还有窗口内图形显示的裁剪和 反走样的技术。 反走样的技术。 的技术
P2 Q P1
中点画线法
• 若d≥0 -> M在直线上方 -> 取P1; M在直线上方 此时再下一个象素的判别式为 d1=F(xp+2, yp+0.5)=a(xp+2)+b(yp+0.5)+c =d+a; = a(xp+1)+b(yp+0.5)+c +a =d+a; 增量为a 增量为a • 若d<0 -> M在直线下方 -> 取P2; M在直线下方 此时再下一个象素的判别式为 d2= F(xp+2, yp+1.5)=a(xp+2)+b(yp+1.5)+c = a(xp+1)+b(yp+0.5)+c +a +b =d+a+b ; 增量为a 增量为a+b
。 。
(X i , Yi)
。
栅格交点表示象素点位置
(X i+1 ,Yi + k)
。
(X i , Int(Yi +0.5))
数值微分(DDA)算法 数值微分(DDA)算法
4.5mooc光栅扫描算法小结
4.5mooc光栅扫描算法小结光栅扫描算法小结1、直线段的扫描转换算法这是一维图形的显示基础(1)DDA算法主要利用了直线的斜截式方程(y=kx+b),在这个算法里引进了增量的思想,结果把一个乘法和加法变成一个加法(2)中点法是采用的直线的一般式方程,也采用了增量的思想,比DDA算法的优点是采用了整数加法(3)Bresenham算法也采用了增量和整数算法,优点是这个算法还能用于其它二次曲线2、多边形的扫描转换和区域填充如何把边界表示的多边形转换成由像素逐点描述的多边形这是二维图形显示的基础有四个步骤:求交、排序、配对、填色。
这里引进了一个新的思想—图形的连贯性。
手段就是利用增量算法和特殊的数据结构(多边形y表、边y表、活化多边形表、活化边表),2个指针数组和2个指针链表3、直线和多边形裁剪关于裁剪算法主要讲了两个经典算法:cohen-Sutherland算法、梁-barsky算法cohen-Sutherland算法的核心思想是编码。
把屏幕(窗口,场景空间)分成9个部分,用4位编码来描述这9个区域,通过4位编码的“与”、“或”运算来判断直线段是否在窗口内或外梁算法主要的思想:(1)直线方程用参数方程表示(2)把被裁剪的直线段看成是一条有方向的线段,把窗口的四条边分成两类:入边和出边这也是中国人的算法第一次出现在了所有图形学教科书都必须提的一个算法。
这就叫原始创新!4、走样、反走样因为用离散量表示连续量,有限的表示无限的自然会导致一些失真,这种现象称为走样反走样主要有三种方法:提高分辨率区域采样加权区域采样。
提高分辨率无非是把分辨率增加,这样可以提高反走样的效果;但这个方法是有物理上的限制的—分辨率不能无限增加区域采样算法是在关键的直线段、关键的区域上绘制的时候并非非黑即白,可以把关键部位变得模糊一点,有颜色的过渡区域,这样会产生一种好的视觉效果加权区域是不但要考虑区域采样,而且要考虑不同区域的权重,用积分、滤波等技巧来做5、消隐在绘制场景时消除被遮挡的不可见的线或面,称作消除隐藏线和隐藏面,简称为消隐消隐算法按消隐空间分类:(1)物体空间以场景中的物体为处理单元(2)图像空间以屏幕窗口内的每个像素为处理单元首先介绍了经典的z-buffer算法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于Zigzag块扫描的光栅化算法设计与实现作者:聂瞾田泽马城城来源:《科技风》2016年第07期摘要:光栅化是图形处理器的关键单元,实现几何图元到片段的转换,其功能、性能决定了图形处理器的优劣。
传统的光栅化方法大多采用线扫描方式,利用线填充算法在水平或竖直方向填充像素,计算过程复杂、资源占用量大,不适用于对硬件资源与芯片面积有极大限制的嵌入式图形处理器设计。
文中在分析Zigzag扫描原理的基础上,提出一种基于Ziazag块扫描的光栅化算法,该算法计算过程简练、资源消耗少。
通过算法仿真平台的验证,功能正确、性能较传统线扫描算法提升30%以上、资源占用大大降低,满足图形处理器设计要求。
关键词:光栅化;块扫描;Zigzag扫描中图分类号:TP301 文献标识码:A在图形应用快速发展的背景下,复杂的3D图形应用需求与日俱增。
图形处理器(Graphic Processing Unit,GPU)作为显示系统的核心,以硬件加速的形式实现了3D图形绘制,其功能、性能直接决定了图形绘制的质量和速度,在计算机系统中的作用日益提高。
光栅化作为图形处理器的关键单元,是将几何图元转换为片段的重要过程,决定图形绘制的效率和效果,是影响图形处理器功能、性能的重要因素。
传统光栅化单元大多采用线扫描实现,如:Bresenham算法、DDA算法等,此类算法实现需占用大量运算资源和较多的存储资源[ 1 ]。
然而,嵌入式图形处理器设计对硬件资源与芯片面积都有着极大的限制要求。
基于块扫描的光栅化方法应运而生,块扫描光栅化将几何图元分割成以块为单元的集合,以块为单位进行像素处理,充分利用了图形数据的局部性原理,大大提高了像素生成和处理效率。
Zigzag是一种应用广泛的块扫描算法,本文在分析Zigzag扫描算法基础上,提出一种基于Zigzag块扫描的光栅化算法,结合Zigzag扫描原理,自下向上“Z”型扫描图元,利用块顶点的边界函数判断当前块与图元的关系,完成竖直方向上的Zigzag块光栅化。
在实现中,利用边函数的线性变换规律,通过的加、减等简单运算快速迭代计算块顶点的边界函数值,减低计算复杂度,大大提高了光栅化效率。
1 ZigZag块扫描分析Zigzag是一种全面、高效的图元扫描算法,计算原理明晰,实现简单,广泛应用于现代图形处理器光栅化单元中[ 2 ]。
Zigzag块扫描以像素块为单位进行扫描,在y轴方向上从低到高以“Z”字型向上扫描。
如图1所示。
Zigzag扫描首先从底部的起始块出发,水平扫描当前行,直到遇到第1个完全在三角形外的像素块,然后Y坐标增加一个像素块高度,反向扫描当前像素块行,依此方式反复扫描,直到扫描线的Y轴坐标大于等于终止位置的Y轴坐标,且扫描状态由发现与三角形相交的像素块过渡到发现完全在三角形外的像素块为止[ 3 ]。
在扫描过程中,当前块与三角形关系确定了扫描的进行方式。
具体而言,在水平方向扫描时,如果当前块与三角形有重叠,则向正方向继续扫描,如果当前块与三角形没有重叠则需要结合当前行扫描状态决定是否向上移一行继续扫描;如果遇到第一个完全在外的块且本行已有重叠块的情况下,说明该行已扫描完成应该向上移一行继续反方向扫描;如果在没有重叠块的情况下遇到完全在外的块,则说明正方向上没有重叠快,应该向本行的负方向扫描。
竖直方向仅检测当前扫描行与终止位置的Y轴坐标的关系,若大于则扫描结束,若不大于则进行该行水平方向扫描。
2 基于Zigzag块扫描的光栅化算法设计与实现基于ZigZag块的光栅化扫描算法包含4个处理环节,分别为图元预处理、Zigzag扫描、块与图元位置关系判断和片段生成。
图元预处理主要进行对几何图元顶点的存储;Zigzag扫描完成控制参数计算、扫描控制、块参数生成;块与图元位置关系判断完成块与图元位置关系的计算,决定Zigzag扫描路径,生成有效块数据;片段生成负责生成片段并对其属性进行插值。
其中,图元预处理和片段生成属于上下文操作,由算法仿真平台负责管理。
文本主要讨论Zigzag扫描和位置关系判断两大部分。
2.1 Zigzag块扫描设计与实现Zigzag块扫描实现对覆盖图元的块的遍历,利用沿竖直方向的“Z”型扫描完成块的遍历。
算法包括预处理信息计算和扫描控制2个步骤:1)预处理计算:包括竖直方向起始、终止点计算,扫描起始点确定和初始水平扫描方向计算4部分。
在预处理过程中,计算三角形顶点中y值最大值与最小值,则竖直方向起始值为y值最小值,终止点为y值最大值;扫描起始点为y值最小的顶点的坐标;初始水平扫描方向与扫描起始点指向三角形中间顶点的方向一致。
2)扫描控制:负责进行竖直和水平方向扫描的条件判断,依靠当前块与三角形的位置关系,如果水平方向没有遇到完全在外的块,则应继续水平方向扫描,若遇到则说明当前行扫描完毕应向上移动一行。
根据对Zigzag块扫描的分析,采用模块化设计思路,建立预处理计算模块和扫描控制模块。
预处理计算模块根据三角形顶点的坐标信息,找出顶点中y值的最小值与最大值,计算竖直扫描起始和终止坐标,同时确定扫描起始点位置和初始扫描方向。
扫描控制模块由控制信息管理、块数据生成和块与图元关系判断三部分组成。
控制信息管理负责边函数的计算和递推值的存储,控制边函数信息的管理;块数据生成完成以当前顶点为左下角的块数据生成,递推计算块其余3个顶点的边函数便于位置关系的判断;块与图元位置关系判断根据块4个顶点的12个边函数综合判断确定块与图元的关系,如果块与图元由重叠则需要下发像素块并更新当前顶点,如果没有重叠则需要上移扫描行同时更新当前顶点。
2.2 块与图元位置关系判断块与图元位置关系判断采用边函数技术,通过块的4个顶点数据生成12个边函数值,利用区域分类确定三种块与图元位置关系,块完全在图元内、块部分在图元内和块在图元外。
边函数是20世纪80年代出现的一种在2D平面内判断点与直线关系的函数,它利用给定的直线将空间划分为3个区域,直线之上,直线之下和直线内[ 4,5 ]。
假定直线从点(x0,y0)到点(x1,y1),法线方向为n=(a,b),则边函数e(x,y)为公式(1),其中a=y0-y1;b= x1-x0;c= x0y1-x1y0。
e(x,y)=ax+by+c公式(1)若边函数小于0,说明点在法线正区域,既就是点在直线上;若边函数大于0,说明点在法线负区域,既就是点在直线下;若边函数为0,说明点在线内包括在线的延长线上。
相似的,可以利用三角形3边的边函数值确定点与三角形的位置关系,判断条件如下:1)如果3个边界函数中至少存在一个小于0的值,则点在三角形外;2)除去A的情况,则点要么在三角形内要么在三角形边上,均认为点在三角形内。
更进一步,由于块与三角形的位置关系有完全在内、部分在内和完全在外。
因此,我们可以利用块的4个顶点的边函数综合计算得到块与三角形的位置关系,判断条件如下:1)如果块的4个顶点均在三角形内部,则当前块与三角形关系为完全在内;2)如果块的4个顶点均在三角形外部,则块在三角形外;3)除去1与2的情况,剩余所有块均为部分在内,部分在外。
根据以上的分析,设计实现中块与图元位置关系判断的流程如图2所示:在判断位置关系时,需要先对4个顶点的边界函数值符号进行判断,如果符号同号说明4个顶点要么均在三角形内要么全部在外,此时需要进一步判断。
反之,可以确定块与三角形位置为相交关系即块部分在三角形内部分在外。
对于同号可以分为2种情况,同在内部和同在外部,如果4个顶点均在三角形内部那么块一定在三角形内部,反之,则需要进一步判断。
3 算法验证为了验证块扫描光栅化算法的正确性,在算法仿真平台上绘制一个逆时针方向的红色三角形,如图3所示。
此外,为了进一步验证在各个方向和不同起始位置的条件,绘制一个通过旋转而成的由6个三角形组成的图案。
通过与Windows平台的比较,利用块扫描光栅化算法的绘制结果与Windows结果基本一致,在不同起始位置和方向上,也与Windows平台值,证明块扫描光栅化算法的正确性,达到了预想的效果[ 6 ]。
另一方面,在算法仿真平台上,对基于块扫描和线扫描的三角形图元光栅化算法的性能进行了评估和对比,对于测试中的红色三角形来说,线扫描算法平均需要196.37毫秒,而基于块的扫描平均需要148.31毫秒,对该三角形来说,块扫描技术相对线扫描少使用约48毫秒,效率提升32.4%。
由于光栅化单元中三角形参数建立和属性初始化还需要占用一定的时钟时间,会对最终的光栅化性能产生影响,另外不同形状和大小的三角形,由于边界运算和内部像素填充的不同,块扫描算法带来的性能提升存在差异。
4 总结本文通过对已有图元光栅化算法的研究,着重对Zigzag扫描和边界函数进行深入讨论,提出一种基于块扫描的光栅化算法。
该算法利用Zizag原理“Z”型扫描图元,完成自下向上的光栅化。
同时,根据块顶点边界函数方法判断块与图元的位置关系,利用块的4个顶点与三角形关系,推导得出块与三角形的位置关系。
在设计与实现中,利用边函数的局部性,通过简单的加、减操作快速迭代计算临近点的边函数值,进一步加快判断扫描的速度。
在算法仿真平台上的验证,表明块扫描光栅化算法能够快速准确地完成图元的光栅化,满足图元光栅化的正确性和实时性要求。
参考文献:[1] 韩俊刚,蒋林,杜慧敏等.一种基于图形加速器和着色器的体系结构[J].计算机辅助设计与图形学报,2010.[2] Tomas A M,Eric haines,Naty Hoffman. Real-Time Rendering[M].2 Ed.夏文宇,胡艳祥译.北京:清华大学出版社,2000.[3] 谭显强.基于FPGA的3D图形处理器IP核的设计与实现[D].南京:南京航空航天大学.2010.[4] 沈陈华.平面上点与多边形包含关系Q算法[J].扬州大学学报,1992,2(4),24.[5] 张全伙,张剑达.计算机图形学[M].北京:机械工业出版社,2003.[6] 王润科,张彦丽.判断点与多边形位置关系的算法综述[J].甘肃联合大学学报:自然科学版,2006,20(6).作者简介:聂瞾(1991-),男,陕西华县人,硕士研究生,研究方向:计算机科学与技术。
导师简介:田泽,博士,研究员,中国航空工业首席技术专家,研究方向:SoC设计、嵌入式系统设计等。