Actionscript 3 类似photoshop的问题;“减轻”;片段着色器

Actionscript 3 类似photoshop的问题;“减轻”;片段着色器,actionscript-3,flash,adobe,molehill,agal,Actionscript 3,Flash,Adobe,Molehill,Agal,我在OpenGL中对此进行标记,因为我认为它与该空间相关(尽管名称不同) 我正试图让photoshop一样的混合在使用OpenGL(ES2?)的Flash11中工作。我对Lighte有一些特别的问题,我认为应该是: outputColor.rgb=max(base.rgb,blend.rgb) 我相信我有问题,因为我的图层有透明度。然而,即使我预先增加我的层,我仍然有问题(图像仍然太暗) 我在这里漏了一步吗?(这是阿加尔,Adobe的gl组件) [Shader.Fragment] 特克斯ft0,

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

我正试图让photoshop一样的混合在使用OpenGL(ES2?)的Flash11中工作。我对Lighte有一些特别的问题,我认为应该是:

outputColor.rgb=max(base.rgb,blend.rgb)

我相信我有问题,因为我的图层有透明度。然而,即使我预先增加我的层,我仍然有问题(图像仍然太暗)

我在这里漏了一步吗?(这是阿加尔,Adobe的gl组件)

[Shader.Fragment]
特克斯ft0,v0,fs0
特克斯ft1,v0,fs1
//预乘
mul ft2,ft1.xyzw,ft1.WW
//预乘值
最大oc,ft0,ft2

请注意,您也在将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

正如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
tex ft0,v0,fs0
特克斯ft1,v0,fs1
最大ft0,ft0,fc0
div ft0.xyz,ft0.xyz,ft0.www//获取原色1
最大ft1,ft1,fc0
div ft0.xyz,ft0.xyz,ft0.www//获取原色2
最大ft1.xyz,ft0.xyz,ft1.xyz//
mul ft1.xyz,ft1.xyz,ft1.www//
mov oc,ft1
max ft0,ft0,fc0
max ft1,ft1,fc0
是避免被零alpha值分割所必需的。您可以将
fc0
常数设置为包含smth,如
0,0,0.001


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

是的,我忘了提到我也尝试过将其移动,甚至将其设置为0,但仍然是不正确的。我认为它可能需要处理具有预乘值的原始图像…你可能是对的,闪存预乘其图像,尝试解复用,最大化剩余倍数。您使用的opengl混合状态是什么?src_alpha:1减去src_alpha。是的,是预乘的值把它搞砸了。看起来我要么对所有纹理进行帧缓冲,要么手动将其解压。谢谢你的帮助!如果要输出预乘颜色,请不要忘记将renderstate设置为1:1_减去_source_alpha。如果不是,混合方程将是
a*Cs+(1-a)*Cd
,其中
Cs=a*Ct
,从而给出
a²*Ct+(1-a)*Cd
(Ct=纹理颜色,Cs=像素着色器中的颜色输出,后缓冲区中的Cd颜色)
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