我遇到的所有抗锯齿线条绘制算法都简单地说,像素的“强度”需要是有多少线条穿过它的函数。这在恒定背景(即白色)上效果很好,但我希望能够在任意复杂的背景上绘制,这意味着用透明度和 alpha 将线条与背景混合来代替强度。
这样做必然会根据背景改变线条的颜色,因为对于 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;
}
编辑:对于子孙后代来说,混合绿色和蓝色可以使您的线 strip 有蓝色调。
最佳答案
很高兴您发现了代码中的错误。
另一个需要注意的问题是 Gamma 校正。必须在线性颜色空间中应用抗锯齿才能看起来正确,但大多数情况下,为了节省一些处理步骤,它会在 Gamma 校正颜色空间中应用。效果比您的示例微妙得多。
关于c++ - 绘制抗锯齿线而不会因背景而改变颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10679204/