15 1月

抗锯齿 Antialiasing(一)

抗锯齿,也译为抗锯齿或边缘柔化、消除混叠、抗图像折叠有损等。它是一种消除显示器输出的画面中图物边缘出现凹凸锯齿的技术。

这个技术是为了在保证低分辨的情况下,把图形的边缘变得更平滑,过渡更自然。

其实我最先遇到这个技术还是在小时候玩游戏的时候遇到的。尤其是那些大型三维游戏。那时候家里穷,买不起牛逼的显卡,但是又想玩,所以只能把游戏的分辨率调到最低,然后在显示选项里面把抗锯齿给关了,然后忍受的满屏的狗牙还玩的乐此不疲。最佩服自己的还是在一台只有两兆显存的电脑上,把生化危机3给通关了,全程帧速率不足10帧,就像在玩幻灯片一样,有个好处是你有足够的反映时间,里面那个追击者很难追上你,很怀念小时候的时光啊。

言归正转,以下三张图,最左边是没有抗锯齿,右边两张图是经过抗锯齿的,我们可以看到右边两张图是经过虚化处理。看起来边缘的过渡更平滑。

antitri

我先来介绍实现抗锯齿最简单的一个方法。

我们知道光线追踪是根据点采样产生的,我们每采样一个点,就在那个点上射出一根光线,之前我们介绍的是我们从每个像素的中心点作为一个光线的起点射出,虽然点在空间中是可以无限小的点,但是他在空间中也必须代表一块有限大小的面积。我们上一章一个中心点就代表这整个像素的结果,如果它射出去遇到红色的球,那么一整块像素就是红色的,但是这么做是很不精确的,尤其是在你像素点很大的情况下。

aniti1 anti2

上面两张图左图是理想状态下,右图是根据实际像素所采样的结果,图a的A像素,我们看到他2/3的面积是被黑色的背景覆盖,而1/3的面积是被黄色所覆盖,但是图b的A像素的中心点是在背景中,所以沿着中心点射出,我们必定遇不到黄色的模型。所以是黑色。

现在我们想,如果让这个A像素显示一个1/3的黄色的话不是更能够代表这个像素的真实情况吗。就像下图。

anti

那我们就需要将一个像素在分割成更小的像素。

aniti1G

如上图,像素A又被分割成9个小像素,然后我们再从这9个像素射出9个光线,然后,我们将这9个像素射出返回的值求他们的一个平均值给到像素A。我们就能得到一个光滑的边缘了。

anti

然后,我们来改一下代码。
假设我们采样3*3,也就是将每个像素点再划分成9小格,横向3个,纵向3个,定义n=3,n*n=9,也就是说我们在每次循环再增加9次光线碰撞计算,

Done

resultanit

当然了,这是最最基础抗锯齿的算法,速度也是最慢的,但是不关怎么着,我们有了第一步的图像优化!

接下俩又是思考题,如果多个物体的抗锯齿,尤其是叠加在一起的物体怎么算?

multanit

留给大家思考,有问题欢迎联系我

发表评论

电子邮件地址不会被公开。