|
也许有人还记得,以前用 CTF 做关的时候,同时给图层和图层内物件加透明度,最后的结果似乎不太正常,通常表现为透明度明显偏高
实验证明,CTF 的 dx8/9 以及 dx11 在不开启 premultiply 的情况下,均存在此问题,原理如下:
我们称 RGBA 为 Shader 标准「归一化色彩参数」,其中:
RGB = RGB Coefficient / 255
A = 1 - Blend Coefficient / 255
简单来说,RGB 就是把 0-255 的颜色参数归一化到 [0,1] 区间
A 全称 Alpha 值,可以理解为不透明度,同样也是被归一化到了 [0,1] 区间
我们称一个图层需要「二次混合」,若这个图层满足 RGBA ≠ (1,1,1,1),或 Effect 不为 None
Bug:任何处于需要「二次混合」图层的物件,其 RGBA 中的 A(即不透明度 Alpha 值),结果上会被视为 A^3
举例,假设图层有 Blend Coefficient 32,等效 Alpha 值约为 0.875,图层内物件有 Blend Coefficient 64,等效 Alpha 值约为 0.75
那么最后的混合结果,等效 Alpha 值为 0.875 * 0.75^3 ≈ 0.37,等效 Blend Coefficient 约为 160,可见透明度被严重放大了
注:正常来说,混合结果应该是两个 Alpha 值直接乘算,等效 Blend Coefficient 应为 87 左右
这个 Bug 在开启 premultiply 的 dx11 模式下被修复了,直接造成了两种模式显著的混合差异 |
|