查看: 52|回复: 2

[讨论] 我们可能被 CTF 的混合模式骗了十年

[复制链接]

43

主题

893

回帖

14

精华

版主

经验
9552
硬币
1717 枚

赞助用户永吧十五周年建吧日纪念勋章永吧十五周年倒计时海报勋章2016年第五届MW杯亚军对不起,小姐盲猜大王数字君X68数字君X68数字君X78

发表于 3 天前 | 显示全部楼层 |阅读模式
也许有人还记得,以前用 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 模式下被修复了,直接造成了两种模式显著的混合差异
Moonstruck Blossom
个人网站:dasasdhba.github.io

103

主题

1822

回帖

13

精华

超级版主

经验
12197
硬币
1800 枚

赞助用户永吧十五周年倒计时海报勋章2014年第三届MW杯冠军2022年第十一届MW杯四强2025年第十四届MW杯四强PK!MF3 冠军PK!MF6 亚军PK!MF5 季军PK!MF4 殿军综合发挥奖最佳人气奖欢乐演员欢乐演员人气之王欢乐演员

发表于 3 天前 | 显示全部楼层
自己制作的游戏The Frontiers 点击进入

163

主题

1118

回帖

4

精华

版主

绿色的糖果

经验
8265
硬币
1008 枚

永吧十五周年建吧日纪念勋章永吧十五周年倒计时海报勋章2025年第十四届MW杯亚军PK!MF5 冠军PK!MF4 季军最佳效率奖请务必再光临秘密合战!欢乐演员请务必再光临秘密合战!对不起,小姐

发表于 前天 21:20 | 显示全部楼层
Never Gonna Give You Up 循环播放十年
【勇闯恐怖鬼屋】Mario Forever THE 震撼发布!!!
点我下载
您需要登录后才可以回帖 登录 | 创建账户

本版积分规则