【问题标题】:Problems with photoshop-like "lighten" fragment shader类似 Photoshop 的“变亮”片段着色器的问题
【发布时间】:2023-03-30 18:24:02
【问题描述】:

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

【问题讨论】:

    标签: actionscript-3 flash adobe molehill agal


    【解决方案1】:

    注意,你也在乘以 alpha。

    因此,您输出的是 (r.a, g.a, b.a, a.a ),而不是 ( r.a, g.a, b.a, a ),如果与黑色背景混合会导致图像更暗

    您可以尝试这样做:

    // premultiply
    mul ft2, ft1.xyzw, ft1.wwww
    mov ft2.w, ft1.w
    
    // premultiplied values
    max oc, ft0, ft2
    

    【讨论】:

    • 是的,我忘了提到我也尝试过移动它,甚至将其设置为 0 - 但是,仍然不正确。我认为它可能必须处理具有预乘值的原始图像......
    • 你可能是对的,Flash 对其图像进行预乘,尝试将它们解乘,使再乘最大化。你用的是什么opengl混合状态?
    • src_alpha:one_minus_src_alpha。是的,这是把它搞砸的预乘值。看起来我将不得不对我所有的纹理进行帧缓冲或手动取消它们。感谢您的帮助!
    • 如果要输出预乘颜色,不要忘记将渲染状态设置为 one:one_minus_source_alpha。如果不是,则混合方程将为a*Cs+(1-a)*Cd,其中Cs = a*Ct 从而给出a²*Ct + (1-a)*Cd(Ct = 纹理颜色,Cs = 像素着色器中的颜色输出,Cd 后缓冲区中的颜色)
    【解决方案2】:

    正如 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 之类的东西。

    还请注意,我们使用第二层的 alpha (ft1) 作为生成的 alpha。不知道对不对。

    【讨论】:

      猜你喜欢
      • 2017-07-10
      • 2012-08-23
      • 1970-01-01
      • 2016-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-12
      • 1970-01-01
      相关资源
      最近更新 更多