Unity3d 基礎知識-伽馬空間和線性空間區別

官方文檔:https://docs.unity3d.com/Manual/LinearRendering-LinearOrGammaWorkflow.html

1、伽馬空間(非線性空間)-Gamma

一個是屏幕和強度的對應關系是非線性,一個是相當于淺色變色,人眼更容易區分暗色的漸變色的不同,例如當圖像壓縮以節省空間的時候,我們犧牲一下淺色強度的精度,以讓暗色的強度可以獲得更高的精度,這個可以通過伽馬校正解決;每一個像素的強度都是通過一個冪函數存儲到圖像中,伽馬就是應用到圖像上冪的名字。


大部分圖像都是以伽馬0.45存儲,如左圖所顯示。圖像的暗色區域使用更大范圍的數值存儲,而淺色的范圍是被壓縮的,被壓縮的空間圖像就是“伽馬空間”。

伽馬空間流程:

在這個顏色空間內渲染,GPU不會再Gamma校正,而是直接使用存儲的值參與渲染計算,因為大家使用的都是閹割版的顏色嘛。

但是在這個空間里進行的渲染,因為使用的是閹割過的Gamma顏色空間,因此你會得到不符合真實表現的效果。

在最終輸出到顯示器的時候,仍然會經過Gamma校正,將渲染后的0.5,表現成0.2給你看。

因為使用了較少的顏色(相對于線性顏色空間),因此會得到比較好的渲染效率以及較低的渲染能力需求。但是圖像會存在失真(偏暗,因為亮部細節表現不夠)等一系列問題。


2、線性空間-Linear

是數值強度值,與感知強度是成正比例對應的。


線性空間流程:

在Unity中,如果使用Linear顏色空間,除非對指定圖片選擇了ByPass sRGB(忽略sRGB,你理解為忽略Gamma校正),否則所有的圖片都會默認變成sRGB格式。

這樣做的目的是把你在Gamma顏色空間里創作的圖片里面的顏色給校正到正確的32位顏色,再參與GPU渲染計算。

ByPass sRGB的意思就是直接使用這個0.5,不用再校正了,除非你是在線性顏色空間里創作的圖片,否則不建議這么干。

然后,GPU再把結果Gamma校正一次,0.2-0.5,這樣做的目的是:顯示器不管你到底干了什么,他老人家是一定要在最后Gamma校正一次的(0.5-0.2)。

顯示器按照接受到的值進行Gamma校正(0.5校正到0.2)給你看。

在這個空間里進行渲染,因為使用的是線性的顏色空間,因此你會得到非常真實的表現效果。

但是,因為色彩豐富的同時,帶來的各項成本,如硬件渲染能力的需求也會增加。


3、顏色空間和渲染管線

Unity 默認使用伽馬空間,僅在PC,Xbox,和游戲平臺支持線性渲染。最近項目開發中在渲染3D模型時,遇到了Linear和Gamma兩種不同的設置出現不同的效果問題,查閱了一下Unity官方blog,看到目前在Unity5.5新增加了linear Rendering 同時支持Android和IOS,但是它使用的OpenGLES3.0,而現在大部分Android手機只支持OpenGLES2.0。所以只能選擇Gamma。二者在效果是不同的:



?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容