像素分辨率:wu像素

星空,还记得那个demo吗?它们都拥有一个星空和一些滚动的文字.在惯用的320*200的解析度下,这些星星看上去真的很糟糕.远处的星移动的非常的慢,蹒跚的从屏幕中央向外移动,吃力的从一个像素移到下一个像素.低的屏幕解析度使得低速移动的像素非常的难看.怎样克服解析度的限制呢?答案就是反走样(Antialiasing).

注意:在这里我们将把屏幕上的像素和我们将要绘制的wu像素区别开.我将使用\"像素\"代表屏幕上的像素.\"粒子\"将代表我们将使用\"像素\"绘制的wu像素.

\"m_fag2.gif这里有我很早以前用BASIC写的一个wu像素的demo.非常抱歉,实际上它非常的慢.现在一个用C写的Demo很快就完成了.
\"wupix1.gif在左边我们有一些我们将要绘制的粒子的位置.在右面是它们的反走样版本.\"wupix2.gif

在这里反走样粒子看上去没什么特别的.但是,当你使用它来绘制大量的缓慢移动的像素的时候,那效果相当令人满意.

属性

wu像素有一下属性:
.绘制的所有像素的亮度的总和等于原始的粒子的亮度.
.wu像素的中心亮度被定位在原始粒子的非整数位置.

方法

有多种方法可以绘制反走样粒子.你可以画一个正方形,粒子的单位尺寸,这是最简单的.你可以画一个粒子尺寸的圆,这略微有些难度而且看上去几乎和前者相同.你也可以画更大的粒子,在这种情况下圆的版本看上去更好.
无论用什么方法,绘制的所有像素的亮度将等于粒子覆盖的区域的亮度.

单位正方形

它们是最容易画的.对于粒子覆盖的每个像素,计算被粒子覆盖的区域.把它乘以粒子的亮度,然后绘制这个像素.你一个单位正方形最大可以覆盖4个像素.

在(wx,wy)绘制亮度为wb的wu像素的伪代码

Variables:
INTEGER: x, y \' wu像素的整数坐标
FLOAT: fx, fy \' 坐标的一部分
INTEGER: btl, btr, bbl, bbr \' 粒子覆盖的四个像素的亮度
\' (top left, top right, bottom left, bottom right)


x = int(wx) \' 计算左上角像素的坐标
y = int(wy) \'
fx = wx - x \'
fy = wy - y \'

btl = (1-fx) * (1-fy) * wb \' 乘以总的wu亮度来计算每四个像素的亮度
btr = (fx) * (1-fy) * wb \'
bbl = (1-fx) * (fy) * wb \'
bbr = (fx) * (fy) * wb \'

plot pixel with brightness btl at (x, y) \' 画像素
plot pixel with brightness btr at (x+1, y) \'
plot pixel with brightness bbl at (x, y+1) \'
plot pixel with brightness bbr at (x+1, y+1)


那给你一个这个方法背后的想法.我将把优化留给你.我能想得到的最好的方法是建立一个包含256个wu像素的查找表.占用1Kb.

其他形状和尺寸

你不必把自己限定在单位正方形上.机会所有的尺寸和形状都是可能的,尽管只有他相对的很大的时候区别它们的形状才有意义.最好的建立区域和尺寸的方法是把它们更大的绘制多次,然后再取样.

\"x_wu1.gif举个例子,一个三像素宽的圆形粒子.把这个粒子画的更大,然后再取样.把0到1之间的x和y的偏移量作一个查找表.\"x_wu2.gif
Tags:  数码相机像素 亚像素 有效像素 像素分辨率

延伸阅读

最新评论

发表评论