基于OpenGL的反走样算法的分析与应用
2016-11-12于晓明孔耀美
于晓明,孔耀美
(陕西科技大学 电气与信息工程学院,陕西 西安 710021)
基于OpenGL的反走样算法的分析与应用
于晓明,孔耀美
(陕西科技大学 电气与信息工程学院,陕西 西安 710021)
计算机图形光栅化的过程中不可避免出现走样的现象。为了减轻图像的走样现象,需要在光栅化之后对图像进行反走样处理。当前各种反走样算法不足在于图形的阶梯状锯齿较为明显。通过分析几种反走样算法的原理,比较不同反走样算法的优缺点,结合当前的图形处理器,探讨利用OpenGL图形库在VC++环境下基于混合反走样技术,对不同的图元进行反走样的操作,相对避免了现有方法所具有的局限性,具有非常快的速度和非常出色的视觉质量,有效解决走样问题。
反走样算法;真实度;OpenGL
在计算机图形学中,一个很重要的问题就是图形的真实感问题。由于计算机是以离散的点生成图形的,则生成的图形必然与真实的景物存在差异。
针对图形图像走样问题通常采用硬件技术和软件技术两种方法处理。硬件技术采用增加显示设备分辨率实现图形反走样,成本高,环境要求严格。国内外软件反走样技术有反锯齿Wu算法[1]、纹理映射中Mip-maping算法[2]、Bresenham算法[3]、DDA算法[4]、Wu&Rokne双步算法[5]、Kuzmin单点生成算法[6]等。Bresenham算法是比较流行的直线光栅化算法,该算法具有效率高、易于硬件实现的优点,不足在于图形的阶梯状锯齿较为明显,给人的感觉不舒服。
本文分析比较了直线距离加权反走样算法、区域采样算法、加权区域反走样算法以及离散区域反走样算法,结合当前的图形处理器,探讨利用OpenGL图形库在VC++环境下基于混合反走样技术,相对的避免了上述方法所具有的局限性,具有非常快的速度和非常出色的视觉质量,有效解决走样问题。
1 走样产生的原因
线段和多边形的边线经过光栅化处理后看起来呈锯齿状。在理想状态下表示的线段是连续的对象,当把连续的线段表示成具有有限分辨率的采样对象时,出现的这种误差称之为走样现象。用直线方程及坐标进行表示可以清楚地看到两者的坐标点之间的差异。
假设要绘制的理想的直线方程为:y=0.375*x+ 0.625 x∈[0,9]
那么像素直线方程为:
int对括号值四舍五入后取整数,得的坐标值如表1所示。
表1 理想直线与像素直线的坐标对比
图1 走样产生原因的图解分析
图1展示了理想直线与像素表示的直线的对比情况。这一段直线在直角坐标系中绘制出来能够更明显地表现出走样产生的原因,其中阴影部分为显示直线的像素点。
2 反走样算法
反走样(anti-aliasing)是用于减轻各种走样现象的技术。对于光栅扫描器来说走样现象不可避免,只能减轻。
2.1反走样算法
反走样技术可以分为两类:一类是硬件技术,通过提高显示器的分辨率来实现;另一类是软件技术,通过改进软件算法来实现。
软件技术的实质是利用人眼视觉原理,使用加权参数调节像素的灰度级别,以产生模糊的边界,从而达到减弱阶梯效应的视觉效果。加权参数可以选择距离、面积和体积等。根据加权参数的不同,反走样算法可以被分为直线距离加权反走样、区域采样算法、加权区域反走样算法以及离散区域反走样算法。
2.1.1直线距离加权反走样
直线距离加权反走样算法的原理是根据像素和理想直线的距离对像素的灰度级别进行调节。两个灰度不同的像素来表示理想直线上的一个点,达到在视觉上消除阶梯的效果。实际应用中,用两个像素宽度表示的反走样直线,在视觉效果上宽度会有所减小,看起来像是一个像素宽度的直线[7]。
以一条简单的直线A(x0,y0),B(x1,y1)为例,它的斜率为k。图2中AB所表示的直线为理想直线,而P1至P6是直线所经过的像素点。
图2 光栅化绘制直线结果(未反走样)
根据Bresenham算法原理,由于斜率0≤k≤1,所以沿x方向移位,那么直线扫描以后P4,P2,P3被点亮,造成阶梯走样。
接下来就要通过直线距离加权反走样的算法对其光栅化的结果进行反走样的处理。直线距离加权反走样是以理想直线上的点与当前上下两像素点之间的距离为权值,用该权值乘以直线的灰度值,作为上下两像素各自的灰度值,用两个像素点来表示直线上的一点。这样,距离理想直线远的像素点灰度值较大,反之则较小。以此达到减轻边缘锯齿的目的[8]。
由此,根据该算法,可以对图2进行反走样处理,得到的结果如图3所示。由图3可知上下两个像素以不同的灰度级别共同显示,像素点离直线越近,其灰度值越小,像素越暗;反之像素越亮。二者的灰度级别之和等于1。
2.1.2区域采样算法
区域采样算法是将每个像素看作一个具有一定面积的小区域,将直线段看作是具有一定宽度的狭长矩形。当矩形(即直线段)与像素相交时,求出两者相交区域的面积,然后根据相交区域面积的大小确定该像素的亮度值[9]。
图3 直线距离加权反走样效果图
所以区域采样算法首先要计算相交区域的面积,在像素格上画一条直线宽度为1,斜率为m的直线,那么像素格与直线(0≤m≤1)的相交情况如图4所示,其中D为三角形在y方向上的边长。
图4 像素格与直线相交区域面积
直线与像素格的相交区域是一个介于0和1之间的实数。用这个实数乘以像素的亮度值,就可以得到该像素实际显示的亮度值。图5是通过区域采样反走样后的直线的着色图。
图5 区域采样算法反走样效果图
2.1.3加权区域反走样算法
(1)算法分析。为了使靠近理想直线的像素分配到更大的亮度值,可以采用圆锥形滤波器。
建立一个底圆半径为一个像素单位,高为1的圆锥,并使底圆中心位于当前像素中心。当直线经过该像素时,该像素的亮度值等于在相交区域上对滤波器进行积分的积分值。相交区域即为直线条与圆锥底面的相交区域。那么在几何上这个积分的结果相当于垂直于直线两边沿的平面,与圆锥相割所得的三维物体的体积[10]。
当直线经过该像素时,该像素的亮度F是两者在相交区域A上对滤波器(函数w)进行积分的积分值。
(2)算法特点。加权区域反走样的算法特点是接近理想直线的像素将被分配更多的灰度值。并且相邻两个像素的滤波器相交,有利于缩小直线条上的像素的灰度差。
2.1.4离散区域反走样算法
离散区域反走样算法的基本原理是,将屏幕的一个物理像素均分成n个子像素。对于每个物理像素,计算其子像素的中心点落在直线段内的个数m。则该像素的权值I为m/n。
在下图6中可以看到每个物理像素被虚线分成了9个子像素,黑点为每个子像素的中心点,当一条宽为1的直线经过左下角的这个像素时,有5个子像素的中心点落在了直线范围内,则上述公式中,I=5/9。
图6 离散区域加权反走样原理
对于彩色图像的情况,反走样图形的光强还需要考虑背景色。
2.2反走样算法分析
以上介绍了图形学中的4种反走样算法,都支持对点和直线的平滑处理。它们通过不同的方法对图形边缘进行反走样处理。
直线距离加权反走样算法是以直线与像素的距离进行像素的亮度分配。算法简单易懂但是精确度不高。
区域采样算法是以直线占像素点的面积为权值,对像素点进行亮度分配。这种算法实现的反走样图形更加的细腻逼真。
离散区域反走样算法与区域反走样算法原理相同,只是在面积的计算方面进行简化。计算量少,但是在渲染效果方面要差一些。
加权区域反走样算法是对像素切割滤波器的立体区域进行积分,有利于缩小相邻像素的灰度差,反走样效果好。但是计算量大,花费时间长。综上所述,从反走样效果和计算量的角度考虑,在同等条件下,区域采样算法是比较优良的算法。
3 OpenGL中的反走样
3.1OpenGL中反走样的原理
为了消除图元之间的锯齿状边缘,OpenGL使用混合功能来混合片段的颜色,也就是把像素的目标颜色与周围像素的颜色进行混合。
首先,必须启用混合功能,并且设置混合函数:
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
在混合函数glBlendFunc()中,函数参数的设置决定了源混合因子S和目标混合因子D的设置方式,Cd(Rd,Gd,Bd,Ad)、Cs(Rs,Gs,Bs,As)、Cf分别为混合颜色中的目标颜色、源颜色和混合颜色。当混合被启用时,源颜色和目标颜色的组合方式是由混合方程控制的。默认情况下为:Cf=(Cs×S)+(Cd×D)[11]。
混合因子的设置就是通过函数 glBlend-Func(GLenum S,Glenum D)设置的[12]。
下面用一个常用的混合函数来举例说明:
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MIUS_SRC_ALPHA)
如果颜色缓冲区已经有一个红色(1.0f,0.0f,0.0f,0.0f),这是目标颜色Cd。如果在这上面用一种alpha值为0.6的蓝色(0.0f,0.0f,1.0f,0.6f)(源颜色Cs)画了一些图形。应用上面这个函数,就可以像下面这样计算得到最终的颜色。
S=(As,As,As,As)=(0.6,0.6,0.6,0.6)
D=((1-As),(1-As),(1-As),(1-As))=(0.4,0.4,0.4,0.4)
Cf=(Cs×S)+(Cd×D)=((1.0f,0.0f,0.0f,0.0f)×(0.6,0.6,0.6,0.6))+((0.0f,0.0f,1.0f,0.6f)×(0.4,0.4,0.4,0.4))
在启用混合功能并且设置了混合函数以后,可以选择调用glEnable()函数对点、直线、和多边形进行抗锯齿处理[13]:
glEnable(GL_POINT_SMOOTH);//对点进行平滑处理
glEnable(GL_LINE_SMOOTH);//对直线进行平滑处理
glEnable(GL_POLYGON_SMOOTH);//对多边形边缘进行平滑处理
接下来对混合的速度或者质量进行选择,用函数glHint(Glenum target,Glenum mode),它可以对点、线、多边形的采样质量进行偏重质量或者速度的选择。
3.2OpenGL反走样示例
接下来可以通过绘制一个简单的点、线、多边形来验证OpenGL中反走样的效果,反走样的代码片段如下所示:
glEnable(GL_BLEND);//开启混合
glEnable(GL_POINT_SMOOTH);//点反走样
glEnable(GL_LINE_SMOOTH);//线段反走样
glEnable(GL_POLYGON_SMOOTH);//多边形反走样
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glHint(GL_LINE_SMOOTH_HINT,GL_NICST);//点和多边形同理
glPushMatrix();//绘制图像部分代码
glLineWidth(2);
glTranslatef(350.0,200.0,0.0);
glRotatef(5.0,0.0,0.0,1.0);
glBegin(GL_POLYGON);
glVertex2f(0.0,0.0);
glVertex2f(0.0,200.0);
glVertex2f(200.0,200.0);
glVertex2f(200.0,0.0);
glEnd();
glPopMatrix();
glLoadIdentity();
运行结果如图7所示。运行后没有反走样和经过反走样的图像的部分放大对比图如图8所示。
由图8可以看出,经过反走样以后,通过不同灰度值来表示图形的边界能够在视觉上达到更加平滑的效果,以达到图像真实化细腻化的目的。
图7 图形反走样运行效果图
图8 未反走样与反走样放大对比图
OpenGL的混合反走样原理是基于区域采样算法的。OpenGL语句对算法进行了封装,成为一种与平台无关的图形API。它的优点是具有高度可移植性,并且具有非常快的速度和非常出色的视觉质量。然而区域采样算法是有一定缺点的,首先像素的亮度与相交区域的面积成正比,而与相交区域落在像素内的位置无关。这在某种程度上仍然会导致阶梯现象。其次直线条上沿理想直线方向的相邻两个像素有时会有较大的亮度差,特别是直线是一条接近水平或者接近垂直的直线时,这种现象会比较突出。所以选择更精确的算法可以使OpenGL语句具有更好的渲染效果。
4 结语
反走样技术是实现计算机图形真实化的一项关键的技术。本文主要研究了计算机图形学中几种反走样算法的原理,并且在VC++环境下,通过OpenGL语句实现图形的反走样,对系统地掌握反走样算法原理以及OpenGL反走样技术具有一定的意义。
[1]WU X L.An efficient antialiasing technique[J].Computer Graphics,1991,25(4):143-152.
[2]LUO X A,WANG R M.Computer graphics[M].Guangzhou:Sun Yat-sen University Press,1996,61-81.
[3]BRESENHAM J E.A linear algorithm for incremental digital display of circular arcs[J].Communications of the ACM,1977,20(2):100-106.
[4]李震霄,何援军.任意宽度直线的绘制与反走样[J].武汉大学学报(工学版),2006,39(4):130-133.
[5]SHEN H,ZHANG X,HU S J.A double-step circle drawing algorithm[J].Journal of Shengyang University of Technology,2002,24(6):514-516.
[6]KUZMIN Y P.An efficient circle-drawing algorithm[J].Computer Graphics Forum,1990,9(4):333-336.
[7]马培华.直线反走样生成和裁剪的算法改进研究[D].南宁:广西大学,2012.
[8]骆朝亮.一种支持多线宽直线反走样算法[J].计算机技术与发展,2010,20(9):102-105.
[9]孔令德.基于面积加权反走样算法的研究[J].工程图学学报,2009(4):49-54.
[10]沈强,张波,陈淑珍.计算机图形学反走样技术及实现[J].武汉大学学报(自然科学版),1997(1):114-119.
[11]DAVE SHREINER.OpenGL编程指南[M].北京:机械工业出版社,2010.
[12]RICHARD S W,BENJAMIN L,NICHOLAS H.OpenGL超级宝典[M].4版.北京:人民邮电出版社,2010.
[13]赵方,张军和,彭亚雄.基于OpenGL纹理映射反走样技术的研究[J].人工智能及识别技术,2011,7(17):4160-4161.
Analysis andApplication ofAnti-aliasingAlgorithms Based on OpenGL
YU Xiaoming,KONG Yaomei
(College of Electrical and Information Engineering,Shaanxi University of Science&Technology,Xi’an 710021,Shaanxi,China)
Aliasing phenomenon is unavoidable during the process of computer graphics rasterization.In order to increase the quality of displayed image,it is necessary to anti-alias after the rasterization.Currently,the disadvantage of existing anti-aliasing technology is mainly the graphics ladder serrate problem.This paper analyzes several kinds of anti-aliasing algorithms,compares them by all advantages and disadvantages and combines algorithms with current graphics processor to explore the use of OpenGL in VC++environment based on mixed anti-aliasing technology.This paper also operates anti-aliasing process among different primitives,which relatively avoids the limitation of existing method,guarantees extreme speed and high visual quality and for most,solves the aliasing problem effectively.
anti-aliasing algorithms;true extent;OpenGL
TP391.41
A
1672-2914(2016)02-0060-05
2015-12-06
咸阳市科技局科研项目(513134)。
于晓明(1965—),女,陕西白水县人,陕西科技大学电气与信息工程学院副教授,工学博士,研究方向为计算机应用。