調暗螢幕時,伽馬表到底做了什麼
亮度滑桿不是一個操作。從滑桿到面板之間有五步,而順序比數值更重要。
五步運算,按順序
對斜坡裡的每一個取樣點,逐個處理:
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 的面板——但它沒法讓面板本身真的變暗。
- 這裡的具體常數是某一個實作的選擇。可遷移的是順序和三個陷阱,不是那些數字。
- 帶容差的讀回,仍可能接受一張在取樣點上恰好吻合的錯誤表格。只比一個點便宜,但不窮盡。