2012-05-23 38 views
2

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

我确实找到了关于如何进行线性光线混合的信息,但它只适用于两个图层均处于100%不透明状态时。

这里是着色器代码,将做到线性光模式,它提供了相同的结果,如Photoshop图层时都在100%不透明度:

#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但我仍然有问题。

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

+0

您能否更新以下问题:1)Linear Light混合的公式是什么? 2)你期待什么结果? 3)在这种情况下你没有得到你所期望的(即定义'不起作用')? 4)你的OpenGL代码? – Tim

+0

代码片段应该回答你所有的问题。对于那些没有Photoshop的人来说,截图真的有帮助吗? – Dex

+0

我认为这是一个OpenGL的问题,我没有看到任何OGL代码。我以为你试图模仿某种类型的Photoshop功能,但也许我误解了你。 – Tim

回答

4

您应该阅读PDF spec以了解如何使用混合模式,当您的alpha为100%以外时。具体请参见第7.2节“基本合成计算”。第414页上的公式应该解释您需要什么:

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