我正在尝试使用着色器复制 CoreGraphics kCBBlendModeSoftLight 混合。(我已经实现了一些其他的 CG 混合模式)
问题是,虽然 Photoshop 的柔光混合有很多(不同的)描述,但我对 CoreGraphics 的版本很感兴趣。
有谁知道 CG 中用于确定混合结果的确切公式?
我正在尝试使用着色器复制 CoreGraphics kCBBlendModeSoftLight 混合。(我已经实现了一些其他的 CG 混合模式)
问题是,虽然 Photoshop 的柔光混合有很多(不同的)描述,但我对 CoreGraphics 的版本很感兴趣。
有谁知道 CG 中用于确定混合结果的确切公式?
对于 CG,它没有明确记录,但Core Image 的 CISoftLightBlendMode 过滤器的文档说:
PDF 规范中描述了用于创建此过滤器的公式,该规范可从 Adobe 开发人员中心在线获取。
这是您可以从中获取 PDF 参考的页面。给出的公式是(在伪代码中,由我从 PDF 中的数学语法转录,同时希望我没有弄乱它的任何部分):
D(float x) =
x ≤ 0.25
? ((16.0 × x - 12.0) × x + 4.0) × x
: sqrt(x)
softlight(__color backdrop, __color source) =
source ≤ 0.5
? backdrop - (1.0 - 2.0 × source) × backdrop × (1.0 - backdrop)
: backdrop + (2.0 × source - 1.0) × (D(backdrop) - backdrop)
(对于 GLSL,您将使用vec4
而不是 CIKL 的__color
。)
该部分的介绍指出,其定义使用特定符号的混合模式是“可分离的”,这意味着该公式将分别应用于组件。柔光混合模式是这些混合模式之一,因此您不需要计算亮度值或类似的东西。