1. 程式人生 > 其它 >Unreal中關於顏色的技術分享

Unreal中關於顏色的技術分享

Hello . 大家好,今天我們來聊點與顏色有關的事,用過unreal的小夥伴應該都會注意到,我們在unreal裡面進行貼圖設定的時候,對於basecolor都需要勾選上sRGB。

為什麼需要勾選?每張貼圖都需要勾選麼?如果不做勾選會怎麼樣?這就需要用我們的gamma校正和線性空間來破案了。


Gamma校正


首先什麼是gamma校正。官方解釋,RGB值與功率並非簡單的線性關係,而是冪函式關係,這個函式的指數稱作Gamma值,一般為2.2(power2.2),而這個換算過程,稱為Gamma校正。官方來源,開發gamma編碼是用來抵消陰極射線管(CRT)顯示器的輸入和輸出特性,電子槍的電流,也是光的亮度,與輸入的正極電壓的變化是非線性的。通過gamma壓縮來改變輸入訊號抵消了這個非線性,因此輸出影象就能有預期的亮度。
畫圖來理解就是如下,


如果我們有一張線性的照片,如果我們顯示器也是線性的,那經過顯示器輸出的影象就應該和真實的影象是一樣的;

但是實際上我們的顯示器根本不按套路來,它的gamma值是2.2,所以如果我們的圖片是線性的,那麼從gamma為2.2的顯示器中輸出出來就是下面這個樣子

 


可以看到結果有明顯的色彩失真,所以如果我們把照片的gamma值設定成1/2.2的話,經過兩次調整,結果就是正確的啦

在進行gamma校正的方式就是取樣進行輸入的時候,Gamma=1/2.2,調亮Gamma;


在顯示輸出的時候Gamma=2.2,調暗Gamma。

 


線性空間


一般在圖片的渲染中存在兩個顏色空間,第一個是Gamma(非線性)的顏色空間;然後是Linear(線性)顏色空間。Gamma使用的是進行了校正的顏色表;而linear使用的是一個線性的完整顏色表,而且渲染中用到的光線也是線性空間的,所以我們在進行計算的時候要線上性空間中進行,輸入和輸出需要進行gamma校正。


最好的辦法就是在圖片輸入的時候採用sRGB格式,目的是為了告訴linear color space,需要對輸入的顏色進行power2.2校正切換到線性空間,然後再進行shader計算,計算完畢以後再通過power1/2.2切換回gamma空間。所以解決了我們剛開始提的在unreal中的basecolor需要勾選sRGB選項。而非sRGB紋理則會直接在shader中進行計算,比如normal和mask。


所以以上就解釋了我們在匯入貼圖的時候需要注意到的問題,只有勾選了引擎才會進行正確的畫素計算;一般basecolor才需要勾選;對於basecolor來說,不勾選GPU就不會進行gamma校正,而直接使用儲存的值進行渲染,但同時也不會得到真實的效果。