我正在尝试实现抗锯齿像素渲染。我的基本思路是渲染4个像素而不是1个像素,然后根据每个“真实”像素到“虚拟”像素的距离给予其一个权重:
void put_aa_pixel(double x, double y)
{
int x0 = int(x);
int x1 = x0 + 1;
int y0 = int(y);
int y1 = y0 + 1;
double weight_x1 = x - x0;
double weight_x0 = 1 - weight_x1;
double weight_y1 = y - y0;
double weight_y0 = 1 - weight_x1;
put_pixel(x0, y0, int((weight_x0 * weight_y0) * 255));
put_pixel(x1, y0, int((weight_x1 * weight_y0) * 255));
put_pixel(x0, y1, int((weight_x0 * weight_y1) * 255));
put_pixel(x1, y1, int((weight_x1 * weight_y1) * 255));
}
将x和y权重相乘可以得到虚拟像素在每个实际像素内部的重叠区域。我天真地以为这会给我带来完美的抗锯齿效果,但是我的测试程序中移动的像素仍然显示出令人不快的闪烁。它看起来比没有任何抗锯齿的简单像素要糟糕得多。
然而,当我从乘法转换为加法时,效果显得好多了:
put_pixel(x0, y0, int((weight_x0 + weight_y0) * 127.5));
put_pixel(x1, y0, int((weight_x1 + weight_y0) * 127.5));
put_pixel(x0, y1, int((weight_x0 + weight_y1) * 127.5));
put_pixel(x1, y1, int((weight_x1 + weight_y1) * 127.5));
添加权重似乎没有任何几何意义。那么为什么这样做会更好?第一个版本有什么问题吗?还有更好的方法吗?