我们知道,电脑画面是由一个一个小的象素所构成的。虽然这些象素非常的小,不过每一个象素都覆盖了这一画面上的某一个区域。我们可以将这些象素比作通向虚拟世界的一扇一扇窗户,而我们电脑的任务就是决定每一个象素的颜色以使得我们通过这些窗户能看到一幅最美的画面。不过渲染的速度也是一幅“实时”图片的所需要考虑的一个重要因素(我们称之为“实时”是因为我们在游戏中画面总是不断变化的),因此通常象素的色彩都通过对该象素内的某一点进行采样得到的颜色所决定的(即我们所谓的点采样point sampling)。不幸的是,为了提高速度而采取的这种做法可能使得所采样的单个点的色彩不能体现出整个象素所覆盖区域的色彩状况。当这种情况出现在物体的边缘的时候就非常明显了。
有一些象素“跨”在物体的边缘,该象素内部的色彩是有一定比例的,而且在外部的显示我们也希望体现出这一比例。物体的边缘两边却会呈现出不同的颜色(否则我们就不称之为边缘了)。点采样技术将会使得整个象素呈现出边缘两边的某一种颜色。而这样对物体边缘的着色无论是着上前景色或是背景色中的哪一种色,由于象素间色彩的突然跳变,都自然而然的会呈现出锯齿状。这种情况就是我们所说的锯齿(aliasing)了。这是由于这一个象素的面积正好覆盖在了边缘上,两边都有它的存在。一个更好的办法就是将前景色和背景色进行混合从而造出第三种颜色来填充色一象素。这种方法能有效的改进图像边缘的表现效果,换一种说法就是实现了“抗”锯齿的作用。
我们可以通过对象素所在的交叉点进行计算来达到这一目的,边界的效果体现了每个象素所能表现细节的一个方面。举个例子来说,一棵垂直生长树的边界可能其宽度只占有了一个象素,我们如何体现这棵树的边缘效果呢?我们所需要的是一个比较通用的方法来提升由象素所组成场景的效果,而要做到这一点,最直接的方法就是增加对每个象素所占有的小的场景采用的采样点数。这些独立的采样点通常被称为子采样(sub-samples),同时他们都是以象素为单位成组的产生的。对每个象素生成子采样的各个独立的采样点称为上采样过程(up-sampling),而所采用的子采样个数我们用“X”来表示(譬如2X,4X,6X等等)。通过平均运算子采样得到的颜色来对单个象素进行着色以使得该象素更加具有表现力的这一过程我们成为下采样过程(down-sampling)。虽然一般而言下采样过程中所运算的点数与上采样中生成的子采样点数相同,不过实际操作中这一点并非是一成不变的。NVIDIA的五点梅花排列采样法(Quincunx)抗锯齿在上采样时对每个象素只产生两个子采样点,而下采样的时候却对5个子采样点进行了运算(通过从临近象素那里去“借用”子采样点的方法来获得多出的3个子采样点)。
不同的抗锯齿方法
现今的两种不同的抗锯齿技术分别是超级采样Super-Sampling (SSaa)和多点采样 Multi-Sampling (MSaa)
超级采样简单的说就对每一个被采样的象素进行更细分的采样和计算。其方法和我们前面所介绍的类似。这一做法非常的占用资源因为说要计算的数据比起原来成倍的增加。可以理解为这种工作状态实际上相当于在进行更高分辨率的运算之后将画面用低分辨率来显示。
多点采样意识到了对同一物体材质内部进行重复的子采样将可能得到非常相近的色彩,所以对每一个象素进行精确的色彩运算简直就是浪费时间。它在对于像素进行抗锯齿处理之前首先对于像素的位置进行检测,看其是否位于材质的边缘,对处于材质内部的部分不进行平均处理的方法。故多点采样抗锯齿对每组上采样只会读一次材质,这也是为什么MSAA比SSAA要快的原因。而对于那些处在物体边缘的象素仍然要由前景色和背景色进行运算后得到新的颜色来进行填充,这些过渡的颜色成功的使得边缘看起来更加平滑。MSAA实际上并没有改善一个使用了透明材质的物体内部的画质,在后面的讨论中我们会看到这一点。
注意:在一个分组中混合使用MS和SS仍然是可能的!
子采样点的排列方式
似乎象素内部子采样的排列方式 并不重要,不过实际上这些采样点的排列方式与我们对物体边缘部分着色的效果是有关系的。我们以下面的4X(每个象素4个子采样点)抗锯齿正交排列为例进行说明:
在上面的图中每一个象素(红色的方块)被8个其他的象素所包围(黑色的方块)。每一个象素包含了4个子采样点。下面我们看看当一条近水平的红色分界线穿过这样一行象素的候的情况:
我们假设红线的上方都是黑色而下方都是呈白色。随着红色边缘的上升我们可以看到每个象素灰度的变化。在采样的前三个格子里,所有的4个子采样点都出于黑色区域,所有点采样得到的颜色全为黑色,所以平均运算后得到的色彩也是黑色。第4个象素有一个点出于白色区域中,所以其灰度为75%。以此类推,接下来的8个象素均为50%的灰度。而最后4个象素的子采样点色彩全为白色,故这几个象素也是全白的。
通过上面的例子我们就可以很好的理解子采样是怎样的通过中间过渡色彩来平滑边缘两个色彩之间的跳变,其中有3种可能用到的过渡色彩,我们可以定义为75:25, 50:50和 25:75。然而这一种采样的排列方式并没有优化的使用这3种颜色。而且可以看到其中25:75并没有用到!
下面我们看看另外一种4个子采样点的排列方式。可以看到这种排列将这4个子采样点做了一个1-in-2(以小网格作为计算单位)的角度变换。
这种变换使得采样点是逐个越过红色边界的,而不会出现像前面那种有两个子采样点一起越过边界的情况,下面这张图很清楚的体现了这种排列方式的效果。
很明显,我们看到这种排列方式将这3种过渡色充分的加以利用使得边界的平滑效果比前者要好很多。不过,问题并非就这么简单。在使用后面这种排列方式时,当边缘的倾斜角度与子采样点组的旋转角度相近的时候其效果又不如之前那么好。那么为什么我们说旋转的采样方式更好呢?
拿一个有1-in-2倾斜度的边缘来看,需要进行平滑处理的每一级跳变只有两个象素的长度,所以并没有足够的空间来填充这3种过渡色!这就是为什么正交的排列效果不好的原因了。它可能完成平滑斜面边界的任务却没有足够的空间去让他完成这一任务,但是它在要求能很好分布过渡色的近水平和近垂直的情况下表现又非常差。而旋转栅格排列方式由于采用了另外一种方式就显得更加有效。
之前,ATI和NVIDIA都使用了一些不够优化的子采样方式。ATI曾引入了2X&3X抗锯齿的功能将采样点列为垂直的队列来平滑近水平的边缘,不过垂直方向却无能为力,而即使是一个简单的倾斜排列也可以使二者都得到平滑处理。另一方面,NVIDIA抱着他们的4X正交模式不放,直到最后在6800家族中才引入了新的排列方式。很难想象是什么原因让他们采取这些做法。
技术分析
现在具体讲讲操作
在ps中作好的图,导入flash中.在flash老版本中锯齿现象是很明显的.因为当时的软件设计是拿modem进行分解化测速下载的.所以.基本上是5象素平衡就可以.这样当然图形的边缘会损失细节.
现在的flash中当我们导入图片时要控制锯齿的产生,就要记得3要素
1大小
2位置
3reload
大小指的是flash中不要进行图片的缩小处理,要处理,在图形软件中完成缩小尺寸后再导入
位置是整个图片在flash场景中的xy坐标.记得取整数
reload是说当图形出现锯齿后,前2种要素都不能打到好的效果时,在作图软件中,对图片进行1px的缩放.再重新导入.就会降低锯齿影响啦
哈哈哈
下面是小技巧:
导出时,记得吧图形质量设置为较高,比如85-90,但不建议100.不然人家看你的东西会很慢~
当发现图形有自己不可接受的锯齿又懒得进位图软件中处理的时候.可将图在flash尺寸加大1px再导出,呵呵,输出时就知道奥妙了
当导入的图形处理完毕后.在图形下方建立一层,层中在原位复制粘贴该图形.打散,填充.然后选flash工具中的扩散边缘.一般比原图形多阔1px就可以.这样.从视觉角度可以弥补锯齿的缺陷,以上操作如能掌握就可以基本处理了让人头疼的锯齿.
注:只要你用位图.,锯齿永远存在.关键是它是否影响到了你作品的效果