經驗分享 - Gamma Correction

Gamma Correction,Gamma 校正, Unity 引擎的 Color Space* 預設就是 Gamma,但也可以切換成跟 UE4 引擎一樣的 Linear。一般使用 PBR ( Physically Based Rendering ) 製作材質的專案,會將 Color Space 設定為 Linear。

* Why: Gamma Correction 關我什麼事?

         * 因為以下兩個經驗,使得 Gamma Correction 關我的事.....Q__Q
            1. 使用 3Ds Max 設定一個顏色,希望 UE4 內看到一樣的顏色,結果.....?
                Q: 在 Max 看到的顏色,數值換算到 UE4 中,顏色不一樣...? 
                A: UE4 中看到的顏色其實是經過 Gamma 校正的 ( 紅框處的 sRGB 就是用來預覽 Gamma 校正後的結果 ) 顏色,而 3Ds  
                Max 內的顏色是沒有經過 Gamma 校正的,所以顏色自然不一樣。

            2. 在 UE4 內製作 Shader,使用 Noise 貼圖取值影響 UV 位子,結果.....?
                Q: 使用 Photoshop 做一張 128 灰後輸出到 UE4 內,利用貼圖數值移動 UV,取到的數值不是 0.5 ? 
                A: UE4 在貼圖設定有一個 sRGB 勾選,沒勾就是 Linear Color,不會做 Remove Gamma Correction,取得數值是 0.5,
               有勾就是當一般  Color,會做 Remove Gamma Correction,對顏色做 col = pow (col, 2.2) 的計算,取得數值會
               變成 0.22。

* What: 所以.....到底什麼是 Gamma Correction? 

        老實說,我看了很多文章與影片解說後........還是一知半解........我以為 Gamma Correction 是這樣的....

         * 說明什麼是 Gamma Correction 前,要先知道.......什麼是 Gamma ,才知道要 Correction 什麼?
                A: 過去 CRT 顯示器輸入電壓與輸出亮度的關係,是一條非線性的冪函數關係曲線,即所謂的 Gamma 曲線,
                如下圖

         * 那.....為什麼是 Gamma 2.2 ?
              A: 先說說人類眼睛對於光反應的感知,可以從下圖1 看到,眼睛接收到光與看到光的關係,並非線性關係,
               而也是一個冪函數關係的曲線(藍色那條),但現實世界的物理現象應該是接收到多少光,就呈現多少亮度的
               線性關係(紫色那條)。基於上述,Ebner 和 Fairchild 在 1998 年的研究中發現使用 0.43 的指數將線性強度轉換
               為亮度,中性色可以提供最佳的灰色感官編碼。0.43的指數約為 2.33,非常接近 Gamma 2.2,如下圖2。

         * 透過上述可以理解什麼是 Gamma & Gamma  2.2,那 Gamma Correction?
                A: 用來解決 CRT 顯示器所產生的硬體設備問題 (輸入電壓與輸出亮度非線性關係),為了校正讓顯示器最終
               成像是線性 關係的結果 (接近現實物理環境),對儲存的影像都做一個逆指數的運算 1/2.2 = 0.45,如下圖所
              示。想正確在顯示器(螢幕)上看到正確的 128 灰,數值是 128/255 = 0.5,Gamma Correction 就是將 0.5 校正存
              成 0.73,接著透過 CRT 顯示器才會呈現正確的 0.5。


         * 如果你想看別人怎麼解釋,這些是我找到覺得不錯的,可以參考這些資料:
             點我點我點我點我點我點我點我點我

* How: 知道了什麼是 Gamma Correction,到底實際上應用,如何與它共處?

         * 老實說,我也只能針對上述的踩坑的應用經驗分享解決的辦法... :D
            1. 使用 3Ds Max 設定一個顏色,數值換算到 UE4 中,顏色不一樣?
                A1: 3Ds Max 內設定 Enable Gamma/Lut Correction,這樣看到的顏色就會經過 Gamma 校正,但缺點是整個畫面都會被
               校正,意思是連貼圖都會再次被校正過一次。

                A2: 上面的解法會使整個畫面都提亮,但我若只希望某個我設定的顏色提亮,就只能自己寫 DirectX Shader,在 Shader 
               內對顏色做一次 Gamma Correction 就可以了。

            2. 使用 Photoshop 做一張 128 灰後輸出到 UE4 內,利用貼圖數值移動 UV,取到的數值不是 0.5?
                A: 噪圖 (Noise) 這種會漸層灰階圖,用來對 UV 數值計算用的,Texture Setting sRGB 要取消勾選
         * sRGB: standard Red Green Blue 縮寫,就是 CRT Gamma 2.2

* Who: 誰需要跟 Gamma Correction 認識一下?

         * 以上總結,要不是踩了那兩個坑,可能我也不會理它..XD,自己覺得當你的專案是 Linear Color Space 的時候,幾個情況
            可以注意一下:
                1. 製作的貼圖是 Linear Texture 還是 sRGB Texture (一般影像軟體製作都是 sRGB Texture 居多)
                2. 導入遊戲引擎內,貼圖格式設定會影響圖最終被呈現在顯示器的成像
                3. 導入遊戲引擎內,在 Shader 計算時,貼圖的格式設定會影響取到的數值

* 補充:

         從參考文章可以了解,現在的 LED, LCD 螢幕的電壓與亮度關係已經是線性關係,那是否就不需要 Gamma 
           Correction 了呢? 邏輯來說,應該是不用,但凡事都有個 but......long time ago 的影像儲存格式都已經遵守這個規
           格,任意更改茲事體大,所以現在的螢幕都會模擬 CRT Gamma,還是統一與維持這個規範。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
       自己的碎碎念: 上面到底在說什麼呢? XDXD

留言

這個網誌中的熱門文章

UE4: Spine2D 導入與基本使用