用于线性灯光模式的Alpha混合层

时间:2012-05-23 03:37:33

标签: opengl graphics shader

我正在重新创建一些Photoshop混合,我正在尝试使用线性光模式。在Photoshop中,你有一个100%不透明度的背景图层,然后是一个50%不透明度的顶层,设置为线性光作为混合模式。

我确实找到了有关如何进行线性光混合的信息,但它只适用于两个图层都是100%不透明度的情况。

以下是将执行线性光模式的着色器代码,当图层的100%不透明度时,它会提供与Photoshop相同的结果:

#define BlendLinearDodgef           BlendAddf
#define BlendLinearBurnf            BlendSubstractf

#define BlendAddf(base, blend)      min(base + blend, 1.0)
#define BlendSubstractf(base, blend)    max(base + blend - 1.0, 0.0)


#define BlendLinearLightf(base, blend)  (blend < 0.5 ? BlendLinearBurnf(base, (2.0 * blend)) : BlendLinearDodgef(base, (2.0 * (blend - 0.5))))

我看过http://en.wikipedia.org/wiki/Alpha_compositing,但仍然有问题。

如何让混合模式适用于半透明层?

1 个答案:

答案 0 :(得分:4)

当您的alpha不是100%时,您应该阅读PDF spec以了解如何使用混合模式。特别是,请参见第7.2节“基本合成计算”。第414页的公式应该解释您的需求:

Cr= (1-as/ar) * Cb + (as/ar) * [(1-ab) * Cs + ab * B(Cb,Cs)]