當前位置:成語大全網 - 書法字典 - 單位線性空間和伽瑪空間簡介

單位線性空間和伽瑪空間簡介

為什麽我會想到寫這篇博客?原因是當在項目中做PBR時,藝術家問映射應該是線性空間映射還是伽馬空間映射。經過壹番糾結和驗證,項目最終切入線性空間,映射可以優先線性空間,產生不了的伽馬空間也可以做。至於為什麽,這就是這篇博客的目的。

首先要解決第壹個問題,什麽是伽馬空間,什麽是線性空間?線性空間很好理解,顏色逐漸線性變化的空間就是線性空間。我在網上看到壹個有趣的例子。想象壹池純黑色墨水,滴入壹滴白色顏料。隨著白色顏料的不斷滴落,墨池會變得越來越白,直到變成白色。記錄每壹滴顏料後墨池的顏色變化是壹個從黑到白的線性漸變過程。既然有線性漸變,就壹定有非線性漸變,伽馬空間就是這樣壹個用於顏色非線性漸變的空間。為什麽會這樣?

壹個廣為流傳的版本說這是由CRT顯示器造成的。因為CRT顯示與輸入電壓和顯示亮度不是線性關系,所以它類似於冪律曲線。壹般來說,這條曲線的指數部分稱為伽馬值,為2.5。在顯示器具有這樣的特性後,正常顏色在輸入時將變暗。我自己畫了壹幅畫來說明它。

這是壹條冪律曲線。如果顏色輸入值為0,則輸出值約為0,更接近黑色。所以輸出時輸入顏色會變暗。為了解決這個問題,圖片在收集時將被反轉。如果顏色為0,則先反轉再返回。這裏我們使用兩個gamma值和,它們分別稱為編碼gamma和顯示gamma,並通過下圖顯示它們的用途。

編碼伽瑪通常存在於生成圖片時(例如,相機拍攝的照片、PS新創建的圖片等)。),而顯示器gamma是顯示器的固有特性(當然,目前的顯示器不再是CRT,因此顯示器gamma可能不是2.5,但制造商為了兼容會添加以前的2.5 gamma值),它們的乘積稱為端到端gamma。如果是1,則捕獲真實場景的亮度和亮度。但是,圖書實時渲染指出了產品為1的問題。首先,我們人眼看到的真實場景的亮度與顯示器能夠顯示的亮度相差幾個數量級。說白了,顯示器能顯示的色彩精度根本達不到真實場景的精度;其次是周圍環境的影響。當我們看真實場景時,我們的視野中充滿了真實場景,而當我們看監視器時,除了虛擬場景外,我們的視野還會被真實場景包圍。這兩個差異導致了這樣壹個事實:如果端到端伽馬為1,則無法保證顯示器的亮度與原始場景的亮度相同。書中推薦電影院的暗環境為1.5,亮室為1.125。

我們通常使用的sRGB標準的編碼灰度約為0.45(1/2.2),這與2.5的顯示灰度相匹配,因為0.45 * 2.5 = 1.125。當然顯示器的顯示gamma值還是設置為2.2(這裏有個網站,可以看到不同gamma值下圖片的不同精確gamma 2.2和預設的五種gamma值),這樣1/2.2*2.2 = 1。

當然,馮樂樂的前輩們也從其他領域提出了伽馬的解釋,以論證伽馬值存在的必然性。在任何情況下,伽馬空間中的顏色都不會線性變化,而是以曲線形式變化。

因此,當我們做PBR時,為什麽我們要努力使用伽馬空間或線性空間呢?PBR的全稱是基於物理的渲染。由於它是基於物理的渲染,因此從貼圖中采樣的值必須與真實環境中的值相同。如果采用gamma空間,通過gamma編碼將改變貼圖中的顏色,並且從shader中采樣的顏色值與真實環境中的顏色值不同。怎麽能稱之為基於物理的渲染?

我們以人體皮膚渲染為例。皮膚貼圖的R通道的值通常高於其他兩個通道的值。然後經過伽馬校正(即伽馬功率對原始值的操作),這種差異將被進壹步放大,然後進行照明計算,妳會發現R通道的值異常高。

上圖左邊是線性正確值,右邊是帶gamma值的渲染,所以增強光的亮度會很快曝光。

當這種差異擴大時,妳會發現眼瞼輪廓上有藍黑色的痕跡,如下圖所示。

因此,在渲染PBR時使用線性空間是非常必要的。

我們糾結的點是,如果將Unity引擎切入線性空間,那麽之前的所有美術資源都是在gamma空間中制作的。會有什麽問題嗎?其實有壹個問題。

當我們將Unity從gamma空間切換到線性空間時,我們需要在引擎中檢查壹些東西,以便gamma空間中的資源也可以使用。

在檢查了圖片中的sRGB後,引擎實際上為我們做了壹項工作。當對這張圖片進行采樣時,它將調用OpenGL ES3.0中的sRGB采樣器接口來恢復通過在貼圖中編碼gamma而更改的值,以便我們在著色器中進行的任何計算都基於真實場景中對象的顏色。計算後,當我們想將顏色輸出到顯示器時,因為顯示器自帶顯示灰度系數,我們無法刪除它,因此引擎為我們做了另壹件事,調用OpenGL ES3.0中的sRGB幀緩沖接口,並使用編碼灰度系數計算最終結果以抵消顯示灰度系數的影響。

那麽在線性空間下使用伽馬空間資源有什麽問題呢?透明混合會引起問題。我們知道透明混合時dst顏色在幀緩沖區中,當顏色在線性空間中進入幀緩沖區引擎時,它會調用sRGB幀緩沖區接口做pow0.45的操作,而透明混合顯然需要線性空間中的顏色,因為src顏色沒有進入幀緩沖區,也沒有做pow4.5的操作。因此,當dst顏色從幀緩沖區中取出時, 它將執行pow2.2的操作以返回到線性空間,然後執行透明混合,並在獲得結果後再次執行pow0.45。

假設src顏色的壹個分量是1,alpha是0.5;dst顏色的壹個分量為0,則根據正常計算,它為:

使用sRGB采樣器和sRGB幀緩沖器:

差異就產生在這裏,而且隨著攪拌次數的增加,差異會越來越大。

理論上,最好的解決方案是直接在線性空間中制作藝術資源。正如官方所說,在PhotoShop設置中選擇“將RGB顏色與灰度系數混合”,並將參數設置為1。

或者參考在線解決方案Unity Complement計劃、Unity線性空間中的Alpha混合問題和Unity手機線性空間中的透明混合問題(I),但它們都有額外的消耗,因此對於性能不太富裕的項目,它們無能為力。

涉及

伽瑪和線性顏色空間上的Unite 2018 |

談Unity和線性工作流的Gamma校正。

我所理解的圖形伽瑪校正。

第二十四章。線性的重要性