计算机图形学——混淆与反混淆
为什么要反混淆
混淆:在光栅显示器上显示图形时,直线段或图形边界或多或少会呈锯齿状。原因是图形信号是连续的,而在光栅显示系统中,用来表示图形的却是一个个离散的象素。这种用离散量表示连续量引起的失真现象称之为混淆。
用于减少或消除这种效果的技术称为反混淆。
反混淆方法
反混淆的方法大致有以下三种:
- 提高分辨率
- 非加权区域采样
- 加权区域采样
其中,第一种提高分辨率的方法是最简单的反混淆的方法。但是,由于分辨率的提升,帧缓存容量则增加到原来的4倍,而扫描转换同样大小的图元却要花4倍时间。因此,这种方法需要耗费大量的资源和时间,不实际。
因此,主要将介绍后两种反混淆的方法。
非加权区域采样
方法简述
非加权区域采样的核心是:改变直线段模型。
步骤如下:
- 将直线段看作具有一定宽度的狭长矩形
- 当直线段与某象素有交时,求出两者相交区域的面积
- 根据相交区域的面积,确定该象素的亮度值
所以核心的问题是计算直线段与像素相交区域的面积。根据这个面积信息,就能够计算出像素的亮度了。因此,根据这个结论,可以做出以下结论:
-
直线段对一个像素亮度的贡献:
-
与两者相交区域的面积成正比
-
和像素中心点距直线段的距离成反比(像素中心点距直线段距离越远,相交区域的面积越小)
-
-
当直线段和某个像素不相交时,它对该像素的亮度无影响
-
相同面积的相交区域对像素的亮度贡献相同,而与这个相交区域落在像素内的位置无关
面积计算
假设一条直线段的斜率为 $k(0\le k\le 1)$,且所画直线为一个像素单位,则直线段与象素相交有三种情况。
a)情况中,所形成的区域是一个三角形。因此他的面积可以表示为: $$ S=\frac{1}{2}D\cdot Dk $$ b)情况中,所形成的区域是一个梯形。因此他的面积可以表示为: $$ S=\frac{1}{2}(D+D-k)=D-\frac{k}{2} $$ c)情况中,区域的面积可以通过正方形的面积减去两个三角形的面积。
上面的方法中介绍的都是面积的精确计算。这样的方法是精确的,但是他不能够快速的进行计算。因此,可以将一个像素再划分成多个格子,然后通过数格子的方式来简化面积的计算。
计算灰度值
在得到了面积之后,由于面积是0到1之间的一个数字,其可以直接作为系数乘最大灰度值,从而达到混淆的目的。
因此像素实际显示的灰度值的计算如下: $$ 实际的灰度值=S\cdot 像素灰度值_\max $$
总结
非加权区域采样通过计算直线与像素相交的面积大小,计算出像素对应的灰度,并显示。这样的方式尽管可以完成反混淆的工作,但是他也存在以下的缺点:
- 像素的亮度与相交区域的面积成正比,而与相交区域落在象素内的位置无关,这仍然会导致锯齿效应。
- 直线条上沿理想直线方向的相邻两个象素有时会有较大的灰度差。
加权区域采样
加权区域采样通过对非加权区域采样方法的改进,考虑相交区域对象素亮度的贡献依赖于该区域与象素中心的距离,来实现更好的反混淆的效果。
权函数
-
以象素A的中心为原点建立二维坐标系
-
$w(x,y)$ 反应了微面积元 $dA$ 对整个象素亮度的贡献大小 ,与 $d$ (微面积元与像素中心的距离)成反比。
-
位于 $(x,y)$ 处的微面积元 $dA$ 对像素的亮度的贡献为 $w(x,y)dA$ ,因此则有: $$ w(x,y)\propto \frac{1}{d}\ \int_Aw(x,y)dA=1 $$
-
相交区域 $A^\prime$ 对该象素的亮度贡献为: $$ \int_{A^\prime} w(x,y)dA $$
权函数可以选择高斯函数和恒等函数。如果权函数选择为恒等函数,则此时加权区域采样会退化为非加权区域采样。(因为无论面积与中心的距离是多少,他对亮度的贡献都是相等的)
步骤
加权区域采样的实现步骤为:
- 求直线段与象素的相交区域 $A^\prime$
- 计算 $\int_{A^\prime} w(x,y)dA$ 的值
- 上面所得到的值介于0、1之间,乘象素的最大灰度值,即设该象素的显示灰度。
亮度贡献的简单计算
上述的运算中,大量的计算都是用来求相交区域对像素亮度的贡献。和之前非加权的面积计算的简化计算类似的,加权区域采样也可以进行简单的计算,来避免积分运算。
- 将象素均匀分割成 $n$ 个子象素,则每个象素的面积为 $\frac{1}{n}$。
- 计算每个子象素对原象素的贡献,并保存在一张二维的加权表中。
- 求出所有中心落于直线段内的子象素。
- 计算所有这些子象素对原象素亮度贡献之和的值,并该值乘以象素的最大灰度值作为该象素的显示灰度值。
上图中展示的是 $n=3$ 的加权表。
通过这样的方式,就可以完成亮度贡献的计算了。