说明
调暗屏幕时,伽马表到底做了什么
亮度滑块不是一个操作。从滑块到面板之间有五步, 而顺序比数值更重要。
五步运算,按顺序
对斜坡里的每一个采样点,逐个处理:
x = pow(raw, 1/gamma)
x = (x - 0.5) * contrast + 0.5
x = x * brightness
x = x * tint
x = clamp(x, 0, 1)
请仔细读第二行:对比度是绕 0.5 旋转的,不是绕零。 在 contrast 为 1 时它是恒等变换,整行等于不存在;一旦低于 1, 它就把整条斜坡往中点拉——也就是把斜坡底部抬离零。 让真黑变成深灰的是这一项,不是调光本身。
陷阱一:反复调整会复利
如果每次调整都在当前表格上再加工,第二次加工的就是一张已经被加工过的表。 正确做法是先捕获面板的原始斜坡一次,之后永远基于它。 这和「调度器乘一个已经被调暗过的值」是同一类 bug:第一次看起来没问题,之后永远在漂。
陷阱二:表格会被静默丢弃
唤醒、改分辨率、GPU 复位,都可能把表格丢掉而不通知任何人。 所以不能假设「写进去了就一直有效」:读回来, 拿一个内部采样点和你的意图比对,不一致就退避重试。 比对必须有容差,因为读回来不是逐位精确的。
陷阱三:暖色调整绝不能把面板调亮
把画面调暖,意味着抬高红、压低蓝。直白地做,峰值会超过 1,面板反而比你设定之前更亮。 约束只需要一行:把峰值归一到 1。 颜色变动不该变成亮度变动。
参考白点
所有色偏都相对于一个参考白点表达,这样参考色温就是恒等变换, 一块没被动过的面板保持原样。这个锚点选得草率,「什么都没改」就会悄悄变成「稍微暖了一点」。
诚实的边界
- 以上全部只改画面,不碰背光。它在每一块显示器上都能用, 包括完全不支持 DDC/CI 的面板——但它没法让面板本身真的变暗。
- 这里的具体常数是某一个实现的选择。可迁移的是顺序和三个陷阱,不是那些数字。
- 带容差的读回,仍可能接受一张在采样点上恰好吻合的错误表格。只比一个点便宜,但不穷尽。