Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 绘制抗锯齿线而不因背景而改变颜色?_C++_Graphics - Fatal编程技术网

C++ 绘制抗锯齿线而不因背景而改变颜色?

C++ 绘制抗锯齿线而不因背景而改变颜色?,c++,graphics,C++,Graphics,我遇到的所有抗锯齿线条绘制算法都简单地说,像素的“强度”需要是线条通过多少的函数。这在恒定背景(即白色)上效果很好,但我希望能够在任意复杂的背景上绘制,这意味着用透明度替换强度,并将线条与背景进行alpha混合 这样做必然会根据背景改变线条的颜色,因为对于1px线条,它很少完全通过单个像素,从而使其完全不透明度。我很好奇是否有一种技术可以在保持原色外观的同时绘制这些混合线 下面是我在彩色背景上尝试渲染的一个示例。您将注意到,垂直/水平线是作为实际颜色的特例绘制的,抗锯齿对角线带有蓝色色调 是否

我遇到的所有抗锯齿线条绘制算法都简单地说,像素的“强度”需要是线条通过多少的函数。这在恒定背景(即白色)上效果很好,但我希望能够在任意复杂的背景上绘制,这意味着用透明度替换强度,并将线条与背景进行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;
} 

编辑:对于下一代,混合绿色和蓝色可以给你的线条增添蓝色。

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


另一个需要注意的问题是伽马校正。消除混叠必须在线性颜色空间中应用才能看起来正确,但大多数情况下,为了节省一些处理步骤,消除混叠会在gamma校正的颜色空间中应用。效果比你的例子要微妙得多。

我认为你的阿尔法合成不正确。我在一个图像编辑程序中用不同的alpha值在你的背景上画了那个绿色,但我无法重现那个蓝色。@Pubby:我使用的是吴的算法的定点版本(根据Abrash的黑皮书),我刚刚添加了一个片段,它实际上将我的像素与背景混合在一起。此外,我应该添加我试图绘制的颜色线是(0128,0)RGB。您的GPU内置AA算法-可能有几个。为什么不直接使用它们?@DeadMG:因为我想自己写,我刚刚发现了我的错误:在结尾处混合了绿色和蓝色。FMLI会注意这一点,伽马校正发生在这段代码之后,所以一切都应该很好。