4

我遇到的所有抗锯齿线条绘制算法都简单地说,像素的“强度”需要成为线条穿过它的数量的函数。这在恒定背景(即白色)上效果很好,但我希望能够在任意复杂的背景上绘制,这意味着用透明度替换强度,并将线条与背景混合。

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

这是我在彩色背景上进行渲染尝试的示例。您会注意到垂直/水平线是使用真实颜色绘制的特殊情况,并且抗锯齿对角线具有蓝色色调。

在此处输入图像描述

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

编辑:和实际绘制点的代码:

// 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;
} 

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

4

1 回答 1

2

I'm glad you spotted the bug in your code.

Another problem to watch out for is gamma correction. Anti-aliasing must be applied in a linear color space to look correct, but most of the time to save some processing steps it is applied in a gamma-corrected color space instead. The effects are much more subtle than your example.

于 2012-05-21T03:58:06.517 回答