类似Photoshop的问题“减轻”片段着色器

时间:2011-09-16 17:07:21

标签: actionscript-3 flash adobe molehill agal

我在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

2 个答案:

答案 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, fc0max ft1, ft1, fc0是必要的,以避免被零alpha值分割。您可以将fc0常量设置为包含类似0,0,0,0.001的smth。

另请注意,我们使用第二层(ft1)的alpha作为结果alpha。我不知道这是否正确。