早期手機 GPU 沒有硬件調整 gamma 的電路,unity 保持對過往的流程相容性是很必要的,但顯然一切都還沒到對錯……
可以手動在查詢貼圖時自乘一下,輸出時開方一下,這樣就很接近線性光照了而且很快。
從藝術角度來看,gamma 和 linear 只是一個流程問題。從結果上看,線性黨可以說gamma黨燈光衰減過快,反過來gamma黨也可以說線性黨暗部細節不足,色飽和度損失嚴重。
gamma 的提出是為了應對在有限精度上,暗部細節資訊密度不夠的問題的:人眼對低照度的輪廓更敏感,對輪廓比對色彩敏感。這些都是我們壓縮圖形數據的重要基礎。gamma 2.2 時低亮度資訊密度比線性高 1.4 倍。在采集視覺資訊時,對數據進行gamma編碼,播放時還原,一樣的資訊量,更好的視覺體驗。
一開始,遊戲是定義自己為「視覺資訊合成」的。反正資訊都是已有的,無所謂了視覺資訊本身怎麽來的。技術雖然進步,但是大家都是在有限的條件下做著「只要看起來很贊」就可以的工作。如今計算效能開始富裕了,有的團隊覺遊戲的畫面制作應該分成 生成(渲染)和采集(後期) 兩部份:自然應該是要把用於視覺計算的素材給變成科學性的,然後把生成出的圖片「用gamma編碼」之後拿來顯示。
可是美術大大一個問題把你打回原形:你告訴我效果是什麽樣?你回答他,色飽和度會降低,暗部會變亮,高光不那麽亮了,全靠後處理再整……你們友情的小船還在不在了?如今的遊戲視覺效果(特別是手遊)就像8bit一樣,仍然是一種特殊環境下的藝術。你說貼圖不去gamma,渲染出來會太亮而且會沒法搞HDR特效,美術會大嘴巴抽你-我在制作工具裏都看不到最終效果你還好意思跟我談畫面質素?制作人會大嘴巴抽你-你要是在紅米上跑不起來下個月給我滾蛋!
非上升到工程的角度來說,的確是要分開光學部份和視覺部份的。可惜遊戲還太遠,遊戲裏燈光連個單位都沒有,扯淡呢麽。CG 很早就提出了光度學的概念,燈光就是有單位的了:坎德拉/球面度 或者 尼特(勒克司/平米)或者走輻射單位 w/srm2 。扛過一天攝影機的人都知道燈要算瓦數……
燈光之外是材質,知乎大神寫了很多了。這裏不贅述。然後我們就得到了一個完整的影像。只不過這個影像壓根沒法看:對比度實在太大了。
搞光學的人早就發現了人眼所能辨識的動態範圍只有 7個EV的樣子…… 所以之前所有的感光器材,采用的玩法都是把最接近人皮膚的 18% 反射率表面作為標準,然後上3下4取7個EV的動態範圍,更大的範圍壓縮掉。這樣可以最大程度上還原一個人和另一個人面對面時的視覺體驗。(細節花色太多,玩攝影的都懂)
數碼時代感光問題依然有。我們渲染了一幅影像出來,挑選動態範圍的過程叫 tonemapping 色調對映。然後把色調對映後的畫面 gamma 編碼用於顯示。色調對映可以和gamma組合在一起, Unreal4 就是這麽弄的 GammaColor = LinearColor / (LinearColor + 0.187) * 1.035 。色調對映是個大學問,同樣索尼cmos的手機拍照色彩不同也和從半導體感光到影像的色調對映不同有關。
在沒有 光度學照明,物理學材質,物理學渲染的 情況下,一切討論對錯都可能僅僅打破成熟美術生產流程而並不帶來畫面真實感提升的嚴重後果。特別是遊戲美術還稀缺後期意識。
至於 Unity 在 gamma 空間下跑 standard 材質,這是一種相容帶來的畸形。已經不是基於物理學了,錯的沒邊兒。但也許美術同事同樣會給你驚喜。