我在OpenGL中对此进行标记,因为我认为它与该空间相关(尽管命名不同)。
我正在尝试使用类似Photoshop的混合在使用OpenGL(ES2?)的Flash 11中工作。我有轻微的特殊问题,我认为应该是:
outputColor.rgb = max(base.rgb,blend.rgb);
我相信我遇到了问题,因为我的图层具有透明度。然而,即使我预先加倍我的图层,我仍然有问题(图像太暗了)。
我在这里错过了一步吗? (这是AGAL,Adobe的gl汇编)
[Shader.Fragment]
tex ft0, v0, fs0 <2d,nearest,nomip,clamp>
tex ft1, v0, fs1 <2d,nearest,nomip,clamp>
// premultiply
mul ft2, ft1.xyzw, ft1.wwww
// premultiplied values
max oc, ft0, ft2
答案 0 :(得分:3)
注意,你也是自己乘以alpha。
所以不输入(r.a,g.a,b.a,a),而是输出(r.a,g.a,b.a,a.a),如果与黑色背景混合,将导致更暗的图像
您可以尝试这样做:
// premultiply
mul ft2, ft1.xyzw, ft1.wwww
mov ft2.w, ft1.w
// premultiplied values
max oc, ft0, ft2
答案 1 :(得分:0)
正如crazyjul所提到的,你必须从alpha预乘的那些中恢复原始颜色值。我相信以下代码应该有效:
tex ft0, v0, fs0 <2d, nearest, nomip, clamp>
tex ft1, v0, fs1 <2d, nearest, nomip, clamp>
max ft0, ft0, fc0
div ft0.xyz, ft0.xyz, ft0.www // obtain original color 1
max ft1, ft1, fc0
div ft0.xyz, ft0.xyz, ft0.www // obtain original color 2
max ft1.xyz, ft0.xyz, ft1.xyz // lighten
mul ft1.xyz, ft1.xyz, ft1.www // pre-multiply output color with the second alpha
mov oc, ft1
行max ft0, ft0, fc0
和max ft1, ft1, fc0
是必要的,以避免被零alpha值分割。您可以将fc0
常量设置为包含类似0,0,0,0.001
的smth。
另请注意,我们使用第二层(ft1
)的alpha作为结果alpha。我不知道这是否正确。