2

我在 OpenGL 中对此进行了标记,因为我认为它与该空间相关(尽管命名不同)。

我正在尝试让类似 Photoshop 的混合在使用 OpenGL(ES2?)的 Flash 11 中工作。我在使用 lighten 时遇到了特殊问题,我认为应该是:

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
4

2 回答 2

3

请注意,您也在乘以 alpha。

因此,您输出的是(ra, ga, ba, aa)而不是(ra, ga, ba, aa),如果与黑色背景混合,这将导致图像更暗

您可以尝试这样做:

// premultiply
mul ft2, ft1.xyzw, ft1.wwww
mov ft2.w, ft1.w

// premultiplied values
max oc, ft0, ft2
于 2011-10-04T16:29:48.300 回答
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常量设置为包含 smth like 0,0,0,0.001

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

于 2013-01-19T10:43:30.767 回答