通常,"正常"混合模式方程式如下所示:
D = Sa * S + D * (1.0 - Sa)
Run Code Online (Sandbox Code Playgroud)
其中D是目标颜色,Sa是源alpha,S是源颜色.
现在,这完全不透明的目的地工作正常,但我想知道你如何处理半透明和完全透明的目的地.
当在完全透明的目的地上混合源时,源像素(像素是颜色和alpha)将保持不变并且不像之前的等式那样混合,并且如果目标背景是完全不透明的,则应该应用上面的等式,但是我找不到一个很好的方法来处理目标alpha在0和1之间的情况.
例如,如果在透明背景上混合白色像素和50%alpha,则颜色不应该倾向于透明颜色值(或多或少处于未定义状态),目标颜色应为全白,而不是50%(在alpha乘法之后),这是你在应用上面的等式后得到的(如果D与S的颜色相同,这是我想到的).
该等式是一般混合方程的简化.它假定目标颜色是不透明的,因此会删除目标颜色的alpha术语.
D = C1 * C1a + C2 * C2a * (1 - C1a)
Run Code Online (Sandbox Code Playgroud)
其中D是结果颜色,C1是第一个元素的颜色,C1a是第一个元素的alpha,C2是第二个元素颜色,C2a是第二个元素的alpha.目标alpha使用以下公式计算:
Da = C1a + C2a * (1 - C1a)
Run Code Online (Sandbox Code Playgroud)
得到的颜色与alpha预乘.要将颜色恢复为未经过相乘的值,只需除以Da即得到的alpha值.