绘制抗锯齿线条而不会因背景而变色?

时间:2012-05-21 03:27:47

标签: c++ graphics

我遇到的所有抗锯齿线绘制算法都只是说像素的“强度”需要是线的多少通过它的函数。这在恒定背景(即白色)上工作正常,但我希望能够在任意复杂度的背景上绘制,这意味着用透明度替换强度并将线与背景进行alpha混合。

这样做必然会根据背景的颜色改变线条的颜色,因为对于1px线条,它很少通过单个像素,从而使其完全不透明。我很好奇是否有一种技术可以在保持原始颜色外观的同时绘制这些混合线条。

这是我在彩色背景上渲染尝试的一个例子。你会注意到垂直/水平线是用真实颜色绘制的特殊情况,反锯齿的对角线对它们有蓝色。

enter image description here

是否有正确的方法将抗锯齿线条混合到背景中,同时保持正确线条颜色的外观?

编辑:以及实际绘制点的代码:

// Plot pixel at (x,y) with color at transparency alpha [0,1]
static inline void plot(pixel_t *pixels, uint16_t stride, const pixel_t &color, uint16_t x, uint16_t y, uint8_t alpha) {
    pixel_t pix = pixels[y*stride+x];
    pixels[y*stride+x].r = (uint16_t)color.r * alpha/255 + pix.r * (255 - alpha) / 255;
    pixels[y*stride+x].g = (uint16_t)color.g * alpha/255 + pix.g * (255 - alpha) / 255;
    pixels[y*stride+x].b = (uint16_t)color.b * alpha/255 + pix.g * (255 - alpha) / 255;
} 

编辑:对于后代,混合绿色和蓝色可以使您的线条呈现蓝色色调。

1 个答案:

答案 0 :(得分:2)

我很高兴您发现了代码中的错误。

需要注意的另一个问题是伽马校正。必须在线性颜色空间中应用消除锯齿才能看起来正确,但大多数情况下,为了保存一些处理步骤,它会应用于经过伽马校正的色彩空间。效果比你的例子更微妙。