在"neutral"透明图层上绘制和混合



我目前正在开发一个手绘应用程序,我需要支持多种背景纹理。例如,类似纸张的纹理或图像。两个背景纹理上的绘图应具有相同的行为。

当使用一种或另一种纹理作为绘图的起点时,它效果很好,即将所有传入的笔触直接与背景纹理混合。

但是,我想采用不同的方法:将所有笔触绘制到最初透明的图层上,然后将该图层与所选背景混合。这样做的优点是绘图是独立的,并且与背景分开。例如,我可以将整个绘图与不同的背景混合,而不必直接将所有笔触与此背景混合。

问题是:根据透明层的颜色,混合图像(背景+"笔触层")的结果看起来完全不同。例如,对于rgba值,将透明图层设置为透明白色 (1,1,1,0) 比将图层设置为透明黑色 (0,0,0,0) 生成更亮的颜色。这是有道理的,因为我们必须将笔触与透明颜色混合。我基本上想要的是一个"中立">的透明度。此透明图层上的笔触应仅与背景图像交互,而不与透明图层交互。透明图层应仅用于存储绘制的描边。

我的问题:这在某种程度上可能吗?我找不到解决这个问题的方法。问题是透明层(只是具有透明颜色的纹理)必须具有颜色,并且传入的笔触必须与此颜色混合。有没有办法以某种方式避免这种情况?

我想出了怎么做:

为了混合两种透明颜色,可以使用波特-达夫算法。例如,此处对此进行了描述。 可以通过以下方式混合目标和源颜色:

inline float4 porter_duff_blending(float4 dest, float4 source) {
float alpha = source.a;
float inv_alpha = 1 - alpha;
float blend_alpha = alpha + inv_alpha * dest.a;
float4 blend_color  = (1.0 / blend_alpha) * ((alpha * source) + (inv_alpha * dest.a * dest));
blend_color.a = blend_alpha;
return blend_color;
};

这允许将绘图放在一个单独的透明层中,该透明层可以应用于不同的背景。

最新更新