线性光模式下的Alpha混合图层

3
我正在重新制作一些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))))

我看了一下Alpha Compositing,但还是有些问题。

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


你能否更新问题,包括以下内容:1)线性光混合的公式是什么?2)你期望得到什么结果?3)在哪种情况下你没有得到期望的结果(即定义“不起作用”)?4)你的OpenGL代码是什么? - Tim
这段代码应该已经回答了你所有的问题。对于那些没有Photoshop的人,截图真的有帮助吗? - Dex
我原以为这是一个OpenGL问题,但我没有看到任何OGL代码。我假设你正在尝试模拟某种Photoshop功能,但也许我误解了你的意思。 - Tim
我正在使用着色器代码,并从OpenGL中调用它。我标记了OpenGL,因为许多OpenGL程序员使用着色器并且可能知道其背后的理论。 - Dex
1个回答

5
你需要阅读PDF规范,以了解如何在透明度不为100%时使用混合模式。特别是,请参阅第7.2节“基本合成计算”。第414页上的公式应该可以解释你需要什么:
Cr= (1-as/ar) * Cb + (as/ar) * [(1-ab) * Cs + ab * B(Cb,Cs)]

你能在这里添加解释吗?链接已失效。 - Raphael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接