目錄
- 投石問路系列寓意
- 本文內容
- 伽馬(Gamma)
- sRGB
- 色彩空間(Color Space)
- 總結
- 轉色彩空間后出現問題的緣由
- 1.相同場景材質和光照為什么變暗了?
- 2.個人定制化的PBR顯示不正確了?(討論的是金屬流)
- 3.特效顯示不正確
投石問路系列寓意
筆者正處于達克效應的絕望之谷,開始知道自己不知道,希望通過投石問路的方式,讓更多的讀者指出筆者的問題或給予更好的方案,
本文內容
unity從推出SRP渲染管線后,相繼為使用者基于SRP定制了兩套渲染管線:URP和HDRP,越來越多的手游團隊也開始著手于從Built-in管線升級到URP管線,那從Built-in升級到URP有個比較大的變化之一是什么呢,就是色彩空間從Gamma Space轉到了Linear Space,那隨之而來可能會出現些什么問題呢,比如:“相同的場景和光照,升級后變暗”、“個人定制化的PBR顯示不正確了”、“特效顯示不正確了”等等,本文主要討論造成這些問題的緣由,
伽馬(Gamma)
為什么要討論Gamma這個概念,就先從人眼對光亮度的非線性感知說起,
舉個例子,夜晚時,當人處于一個漆黑的房間,這時點亮1盞100瓦的燈,人眼會覺得很明顯的變亮了,接著點亮第2盞100瓦的燈,人眼會覺得有亮了很多,但亮度的變化會沒有第一盞燈亮強烈,然后繼續依次點燈,當燈數量增長到一定多,比如50盞100瓦的燈,現在不論是熄滅一盞燈還是再點亮一盞燈,人眼都基本沒有任何亮度變化的感知了,

但是呢,對于燈發射的光子數量,卻還是在繼續的變化,當你點亮1盞燈時,有1x的光子數量進入人眼,當2盞燈時,有2x的光子數量進入人眼,50盞燈時,就會有50x的光子數量進入人眼,
如果把光子數量和對應人眼感知看到的亮度表示成一張圖片,就會有下邊這樣子一個光子數量線性,但肉眼看起來非線性的物理光強圖,

在此圖中有一個特殊地方,用于表現中間調,名為中性灰,也叫做18%的灰,高于此點的即為亮部,低于此點的即為暗部,

相機是怎么存盤影像的呢?不論說是膠片相機還是數碼相機,都是無法直接感知真實世界的顏色,而是通過光子數量來存盤顏色(接下里主要討論的是數碼相機),相機的光感原件通過均勻的信號采樣,存盤下采樣到的光子數量,就得到了一張影像,
假如采樣10個信號,可以發現亮部采樣了大約80%個點,而暗部采樣了大約20%個點,

這時會出現一個問題,亮部采樣點足夠多,表現充分;而暗部采樣過少,表現不足,出現很明顯的色階情況,如下圖一樣,(注:下圖色階數值并不準確,只為表達意思)

既然暗部的采樣點太少了,導致暗部變現不足,那就提高采樣次數呢,10次不夠,就采樣1000次或者更多,這樣暗部的采樣點就多起來了,不錯,思路是對的,但是呢,如果把所有的采樣點都存盤下來,影像的大小就會變得很大,帶來記憶體和帶寬的巨大壓力,更加的得不償失,
那要怎么處理才合適?提高采樣次數的同時,舍棄一部分采樣點,剛上邊也說到了,亮部的采樣點已經足夠多表現細節,提高采樣次數后,更多的采樣點并不會給亮部帶來太明顯的變化,即可有可無,那就可以選擇舍棄掉較多的亮部采樣點(可以結合房間電量很多燈之后,加燈減燈人眼無任何感覺理解),


可以從上圖看出,舍棄了很多的亮部采樣點,保留了更多的暗部采樣點,就可以得到一個亮部和暗部均表現充分的且線性的采樣圖,
一般稱這樣看起來線性,光子數量非線性的圖為美識訓度圖,

這樣的采樣程序就叫做Gamma的采樣,
顯示設備怎么輸出呢?,比如電腦顯示幕,如果說直接就把這樣子一個采樣點交給人眼識別,肯定就不正確了,因為已經把采樣曲線變成了非線性,而不是線性的物理光強了,
顯示幕需要做的就是通過一個采樣的反函式把非線性的采樣還原成線性,這個操作就叫做Gamma的矯正,

好了,經過兩次的Gamma操作,就可以在顯示幕上的充分且真實的表現物理空間的色彩了,

sRGB
有個Gamma這樣的一個想法后,各廠家應該怎么處理呢,不可能說各自按照各自的想法來,制造生成影像設備的廠家制定自己采樣的規則,然后制造顯示設備的廠家跟著去做各種適配,1996年,微軟和惠普就一起制定一種標準的色彩空間:sRGB(standard Red Green Blue),這種標準得到了各大廠商的支持,
sRGB對應的就是Gamma0.45所在空間,對應的顯示設備的就是Gamma2.2所在空間,(就如上圖gamma采樣曲線表現一樣,約為0.45的冪函式;顯示設備約為1 / 0.45 = 2.2的冪函式 )
注意:
1.sRGB只是一種主流的標準,還有其他的標準,
2.上邊所說的生成影像設備并不單指相機,也包含各種dcc軟體,譬如PhotoShop,
3.生成影像設備和顯示設備的Gamma值并非全是0.45和2.2,譬如相機可以調整gamma效果、ps可以選擇作業空間RGB定義的gamma值,好一點的顯示幕也會有gamma選項,還有就是電影和影院放映也是用的獨特的一套gamma引數,以達到更好的效果,反正記住一點,用多少的gamma曲線存盤影像,就用對應倒數的gamma曲線還原,才能達到最佳的效果,
色彩空間(Color Space)
unity提供了兩套色彩空間:Gamma Space和Linear Space,
內置Built-in管線大多時候使用的都為Gamma Space,基于SRP打造的URP和HDRP管線則使用的是Linear Space,
兩種色彩空間的區別在于什么呢?
Gamma Space:不會對計算前的輸入和計算后的輸出做任何改變,全程都是保持使用Gamma0.45空間的數值計算,
Linear Space:會對計算的輸入部分進行一個Gamma2.2的處理,得到Gamma1.0這樣一個線性的值來計算,對計算的輸出部分進行一個Gamma0.45的處理還原到Gamma0.45空間的數值,
(為什么Linear Space要這樣子進行一個處理呢?上邊說過我們的色彩大部分是按照sRGB方式存盤的,已經非線性了,我們計算的方式又是按照真實世界線性的方式去計算,一個非線性的輸入 + 一個線性的計算方式得到的結果肯定會和真實世界不一樣,解決方式就兩種:計算方式的改變和輸入的改變,Linear Space就是采用統一輸入的方式來讓計算結果更加正確)
兩者的區別就在于計算時:Gamma Space的計算空間為Gammaa0.45, Linear Space的計算空間為Gamma1.0,

上邊有說到,Linear Space會對部分輸入進行Gamma2.2的處理,具體是哪部分呢?部分貼圖的RGB值和所有shader定義的顏色的RGB值,
所有shader定義顏色就不多說了,指材質面板看到的顏色輸入,(注:也包含光照的顏色)

部分貼圖的RGB值是個什么意思呢?大家可以看到部分貼圖的面板中有個sRGB的選項,

使用內置Built-in管線+Gamma Space的朋友應該知道,不論是否勾選此選項,對于效果來說都沒有任何變化,是因為Gamma Space不會對輸入進行任何處理,但是在Linear Space中,此選項就決定了該貼圖的RGB值是否要進行Gamma2.2的處理,下圖就可以看出,在Linear Space空間,如果不勾選sRGB,就會導致顏色偏亮,

注意:
1.上述說的貼圖是普通貼圖,針對如法線貼圖、光照貼圖等不是按照sRGB格式存盤的圖片,就沒有sRGB選項,且不會進行Gamma2.2的處理,
2.剛一直在說自定義顏色的RGB和貼圖的RGB,并未提到Alpha?所有顏色Alpha通道和貼圖的Alpha通道是不會進行Gamma2.2的處理,
總結

結合上邊所說,就可得到上邊這樣子一個表示貼圖顏色從出生至顯示設備的一個程序,
轉色彩空間后出現問題的緣由
1.相同場景材質和光照為什么變暗了?

場景材質中經常會用到一個內容:球諧光照,

可以從其中一塊看出,就是在Gamma Space輸出顏色時會進行一個接近Gamma0.45的操作,而在Linear Space時,不會進行這個處理,只會在輸出時統一進行Gamma0.45的操作,先加后冪會比先冪后加得到的值更低,表現出來就是場景變暗了,

2.個人定制化的PBR顯示不正確了?(討論的是金屬流)

金屬流有三張重要的貼圖:base color + roughness + metallic,定制化PBR時,可能都會有考慮過混合影像,比如:把roughness(R通道) + metallic(G通道) + other(例: AO)(B通道)合成一張貼圖使用,發現在Built-in管線 + Gamma Space顯示很正確,但是升級到URP + Linear Space后,GGX部分完全顯示不正常了,
問題出現的重點在于金屬流幾張重要貼圖的的存盤方式:base color(0 - 255sRGB)、metallic(0 - 255sRGB)和 roughness(0.0 - 1.0),大部分時候,固有色和金屬是使用sRGB方式存盤,而粗糙度則是直接用線性的方式存盤,當按照定制化的方式合成貼圖后,在Gamma Space不會有任何問題,因為不會對輸入和輸出進行處理;在Linear Space,且勾選了sRGB選項后,roughness存盤的線性值經過Gamma2.2的處理變得非線性了,從而導致GGX部分顯示出錯,這時就需要進行Gamma0.45的處理,還原線性,

對比說下Unity Sample中的金屬圖,同樣是混合影像,但卻是用Alpha通道來存盤的roughness,
上邊有說過Alpha通道一個很重要的特性:不會受到Linear Space的Gamma2.2的影響,這樣子就避免了切換色彩空間帶來的問題,

3.特效顯示不正確

可以明顯的看到兩個特效(貼圖、材質和特效引數均一樣)的區別:左邊非線性增長 、右邊線性增長,該特效是使用了一個uv的v方向值灰度圖來表現推進這一部分的效果,這個灰度圖放在Gamma Space,不論勾選sRGB都不會對特效有影響;但是放到Linear Space后,如果勾選了sRGB,就把線性值變得不線性,導致左邊不線性的情況,去掉sRGB后就能恢復右邊線性的效果,
由于現在越來越多的使用通道影像代替彩色影像,就需要更加注意色彩空間的影響,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/402563.html
標籤:其他
上一篇:約瑟夫以及其變異體總結
