» 您尚未登录:请 登录 | 注册 | 标签 | 帮助 | 小黑屋 |


发新话题
打印

[其他] 请达人来回答,锯齿为什么总会产生?

RGB的颜色过渡问题,缺少中间值

CLAYMAN上有很多可以看

[ 本帖最后由 爱你一棒陲 于 2007-9-12 17:32 编辑 ]


TOP

什么是抗锯齿?

  我们知道,电脑画面是由一个一个小的象素所构成的。虽然这些象素非常的小,不过每一个象素都覆盖了这一画面上的某一个区域。我们可以将这些象素比作通向虚拟世界的一扇一扇窗户,而我们电脑的任务就是决定每一个象素的颜色以使得我们通过这些窗户能看到一幅最美的画面。不过渲染的速度也是一幅“实时”图片的所需要考虑的一个重要因素(我们称之为“实时”是因为我们在游戏中画面总是不断变化的),因此通常象素的色彩都通过对该象素内的某一点进行采样得到的颜色所决定的(即我们所谓的点采样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仍然是可能的!



TOP

发新话题
     
官方公众号及微博