Shader BlendMode Formulasshader的各种混合叠加模式算法.

    xiaoxiao2021-03-25  88

    【本文系外部转贴, 查看原文】 | 导语  shader的各种混合叠加模式算法.

    Equations used when blending drawn content with the screen or active Canvas.

    Color components are generally in the range of [0, 1] rather than [0, 255] for the purposes of these equations. Results are clamped to [0, 1] except when a Canvas is active that has a floating-point / HDR format.

    Description:

    dst - existing color in the screen. src - the color of the drawn object (the color output by the pixel shader, or the global color multiplied by the texture's color – if any, if no shader is used.) res - resulting color.

    Here are the BlendMode formulas for all 0.10.x versions:

    alpha

    "alphamultiply" alpha mode

    res.r = dst.r * (1 - src.a) + src.r * src.a res.g = dst.g * (1 - src.a) + src.g * src.a res.b = dst.b * (1 - src.a) + src.b * src.a res.a = dst.a * (1 - src.a) + src.a

    "premultiplied" alpha mode

    res.r = dst.r * (1 - src.a) + src.r res.g = dst.g * (1 - src.a) + src.g res.b = dst.b * (1 - src.a) + src.b res.a = dst.a * (1 - src.a) + src.a

    add

    "alphamultiply" alpha mode

    res.r = dst.r + (src.r * src.a) res.g = dst.g + (src.g * src.a) res.b = dst.b + (src.b * src.a) res.a = dst.a

    "premultiplied" alpha mode

    res.r = dst.r + src.r res.g = dst.g + src.g res.b = dst.b + src.b res.a = dst.a

    subtract

    "alphamultiply" alpha mode

    res.r = dst.r - (src.r * src.a) res.g = dst.g - (src.g * src.a) res.b = dst.b - (src.b * src.a) res.a = dst.a

    "premultiplied" alpha mode

    res.r = dst.r - src.r res.g = dst.g - src.g res.b = dst.b - src.b res.a = dst.a

    replace

    "alphamultiply" alpha mode

    res.r = src.r * src.a res.g = src.g * src.a res.b = src.b * src.a res.a = src.a

    "premultiplied" alpha mode

    res.r = src.r res.g = src.g res.b = src.b res.a = src.a

    multiply (both alpha modes)

    res.r = src.r * dst.r res.g = src.g * dst.g res.b = src.b * dst.b res.a = src.a * dst.a

    lighten

    "premultiplied" alpha mode

    res.r = max(src.r, dst.r) res.g = max(src.g, dst.g) res.b = max(src.b, dst.b) res.a = max(src.a, dst.a)

    darken

    "premultiplied" alpha mode

    res.r = min(src.r, dst.r) res.g = min(src.g, dst.g) res.b = min(src.b, dst.b) res.a = min(src.a, dst.a)

    screen

    Note: The math for this blend mode is not completely correct when using the "alphamultiply" alpha mode. Prefer the "premultiplied" variant (and be sure your content has its RGB multiplied by its alpha at some point before blending), when possible.

    "alphamultiply" alpha mode

    res.r = dst.r * (1 - src.r) + (src.r * src.a) res.g = dst.g * (1 - src.g) + (src.g * src.a) res.b = dst.b * (1 - src.b) + (src.b * src.a) res.a = dst.a * (1 - src.a) + src.a

    "premultiplied" alpha mode

    res.r = dst.r * (1 - src.r) + src.r res.g = dst.g * (1 - src.g) + src.g res.b = dst.b * (1 - src.b) + src.b res.a = dst.a * (1 - src.a) + src.a

    Older Versions

    alpha (0.9.0, 0.9.1, and 0.9.2)

    res.r = dst.r * (1 - src.a) + src.r * src.a res.g = dst.g * (1 - src.a) + src.g * src.a res.b = dst.b * (1 - src.a) + src.b * src.a res.a = dst.a * (1 - src.a) + src.a

    alpha (0.8.0 and older)

    res.r = dst.r * (1 - src.a) + src.r * src.a res.g = dst.g * (1 - src.a) + src.g * src.a res.b = dst.b * (1 - src.a) + src.b * src.a res.a = dst.a * (1 - src.a) + src.a * src.a

    premultiplied (0.9.2 and older)

    res.r = dst.r * (1 - src.a) + src.r res.g = dst.g * (1 - src.a) + src.g res.b = dst.b * (1 - src.a) + src.b res.a = dst.a * (1 - src.a) + src.a

    screen (0.9.2 and older)

    res.r = dst.r * (1 - src.r) + src.r res.g = dst.g * (1 - src.g) + src.g res.b = dst.b * (1 - src.b) + src.b res.a = dst.a * (1 - src.a) + src.a

    additive (0.9.2 and older)

    res.r = dst.r + (src.r * src.a) res.g = dst.g + (src.g * src.a) res.b = dst.b + (src.b * src.a) res.a = dst.a + (src.a * src.a)

    subtractive (0.9.2 and older)

    res.r = dst.r - src.r * src.a res.g = dst.g - src.g * src.a res.b = dst.b - src.b * src.a res.a = dst.a - src.a * src.a

    multiplicative (0.9.0, 0.9.1, and 0.9.2)

    res.r = src.r * dst.r res.g = src.g * dst.g res.b = src.b * dst.b res.a = src.a * dst.a

    multiplicative (0.8.0 and older)

    res.r = dst.r * (1 - src.a) + src.r * dst.r res.g = dst.g * (1 - src.a) + src.g * dst.g res.b = dst.b * (1 - src.a) + src.b * dst.b res.a = dst.a * (1 - src.a) + src.a * dst.a

    replace (0.9.2 and older)

    res.r = src.r res.g = src.g res.b = src.b res.a = src.a
    转载请注明原文地址: https://ju.6miu.com/read-24096.html

    最新回复(0)