dasasdhba 发表于 2025-9-28 10:45:57

我们可能被 CTF 的混合模式骗了十年

也许有人还记得,以前用 CTF 做关的时候,同时给图层和图层内物件加透明度,最后的结果似乎不太正常,通常表现为透明度明显偏高
实验证明,CTF 的 dx8/9 以及 dx11 在不开启 premultiply 的情况下,均存在此问题,原理如下:

我们称 RGBA 为 Shader 标准「归一化色彩参数」,其中:

RGB = RGB Coefficient / 255
A = 1 - Blend Coefficient / 255

简单来说,RGB 就是把 0-255 的颜色参数归一化到 区间
A 全称 Alpha 值,可以理解为不透明度,同样也是被归一化到了 区间

我们称一个图层需要「二次混合」,若这个图层满足 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 模式下被修复了,直接造成了两种模式显著的混合差异

zqh——123 发表于 2025-9-28 23:52:32

绿色的糖果 发表于 2025-9-29 21:20:29

Never Gonna Give You Up 循环播放十年
页: [1]
查看完整版本: 我们可能被 CTF 的混合模式骗了十年