Unity Gamma Linear Color Space
生活随笔
收集整理的這篇文章主要介紹了
Unity Gamma Linear Color Space
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
轉(zhuǎn)載文章,出自http://www.manew.com/thread-105872-1-1.html,作者 alphatt
Gamma & Linear Color Space
一、真實(shí)?感覺(jué)? ? ??1、你相信你的眼睛嗎 (藍(lán)黑or白金?) (A和B的顏色一樣嗎?) 2、你以為你以為的就是你以為的嗎 (中度灰,127?186?) 二、Gamma Color Space ? ??1、什么是亮度 人類視覺(jué)對(duì)亮度感知能力并不是呈現(xiàn)線性關(guān)系的,人類的眼睛在在感受純白(亮度100%)與純黑(亮度0%)后,對(duì)于中等亮度(亮度50%)的實(shí)際感知并不是中灰(PS中128度灰)所帶來(lái)的亮度,而當(dāng)人眼接受到18%左右的亮度的光源后,就能感覺(jué)到這是中等亮度了。 那么人類對(duì)于對(duì)亮度的感知響應(yīng)稱為亮度。 ? ??2、什么是Gamma和Gamma矯正
傳統(tǒng)的CRT顯示器是通過(guò)電壓的強(qiáng)度來(lái)進(jìn)行屏幕亮度的顯示的,而CRT顯示器顯示的亮度跟施加的電壓并不是呈線性的關(guān)系的,是呈現(xiàn)一種冪律響應(yīng)的方式:在顯示器的表面處產(chǎn)生的亮度與提高到2.5倍的施加電壓大致成比例,該功率函數(shù)的指數(shù)的數(shù)值通常被稱為γ(Gamma)。 這是一個(gè)實(shí)際CRT傳輸功能的圖形 為了實(shí)現(xiàn)亮度的正確再現(xiàn),同時(shí),如上面所說(shuō)(什么是亮度),人類對(duì)于亮度的感知是非線性的,所以必須補(bǔ)償該非線性。(這里的非線性指兩個(gè),人類對(duì)亮度的感知的非線性和CRT顯示器的對(duì)電壓的非線性的響應(yīng)關(guān)系) 那么對(duì)于Gamma矯正的原因,網(wǎng)上也是眾說(shuō)紛紜,有的人認(rèn)為僅僅是因?yàn)槔鲜接?jì)算機(jī)(CRT)的的歷史遺留 問(wèn)題,這個(gè)說(shuō)法主要來(lái)自Gong大,還要一個(gè)黨派認(rèn)為這僅僅是因?yàn)槿搜鄣囊曈X(jué)感官所決定的,跟CRT沒(méi)半點(diǎn)關(guān)系,這個(gè)說(shuō)法主要來(lái)自韓世麟,那么最終也有人結(jié)合這兩派提出自己的觀點(diǎn),她認(rèn)為主要跟人眼就關(guān),CRT只是個(gè)巧合,CandyCat。 ? ??? ??1)CRT歷史遺留問(wèn)題黨 開(kāi)發(fā)gamma編碼是用來(lái)抵消陰極射線管(CRT)顯示器的輸入和輸出特性。電子槍的電流,也就是光的亮度,與輸入的正極電壓的變化是非線性的。通過(guò)gamma壓縮來(lái)改變輸入信號(hào)抵消了這個(gè)非線性,因此輸出圖像就能有預(yù)期的亮度。來(lái)自維基百科 如果單純考慮歷史原因,CRT的輸入輸出問(wèn)題,那么計(jì)算就很簡(jiǎn)單了,如下圖
那么我們所看到的圖像,就有以下幾種情況了:
按照Gong大的意思,這個(gè)原因完全與人眼無(wú)關(guān),但是這里我是質(zhì)疑的,當(dāng)然下面也有人留言進(jìn)行了反駁。 ? ??? ??2)人眼至上黨 ? ??? ??? ??人眼對(duì)自然亮度的感知是非線性的(韋伯定律) 對(duì)于你看到的跟實(shí)際的情況不符,韓世麟用了一條韋伯定律來(lái)大概說(shuō)明了下這種現(xiàn)象,在wiki上韋伯定律是這么解釋的:
韋伯定律:在同類刺激之下,其差異閾限的大小是隨著標(biāo)準(zhǔn)刺激強(qiáng)弱而成一定比例關(guān)系的,K=ΔI/I K為常數(shù)。?
費(fèi)希納定律:在絕對(duì)閾限之上,主觀的感覺(jué)強(qiáng)度與刺激強(qiáng)度的改變,兩者間呈對(duì)數(shù)的關(guān)系,亦即,刺激強(qiáng)度如果按幾何級(jí)數(shù)增加,而引起的感覺(jué)強(qiáng)度卻只按算術(shù)級(jí)數(shù)增加。
這條定律套用到前面所說(shuō)的亮度的關(guān)系就是說(shuō),在一間黑屋子里,開(kāi)一盞燈,你立刻就能感覺(jué)到亮度的巨大變化,如果在這種狀態(tài)下想獲得成倍的亮度變化的感覺(jué),理論上你再開(kāi)一盞燈就可以,但實(shí)際不是,可能要開(kāi)兩盞燈你才能感受到這個(gè)屋子里的亮度變亮了一倍,也就是說(shuō),你想獲得成倍亮度變化的體驗(yàn),所開(kāi)的燈的數(shù)量并不是呈線性比的,而是一個(gè)指數(shù)函數(shù)的關(guān)系。
這張圖說(shuō)明,在亮度呈現(xiàn)線性變化的情況下,人眼的感覺(jué)的變化并不是呈現(xiàn)線性的,下面黑色區(qū)域的變化,人眼能很容易的分辨,而上面白色區(qū)域的變化,人眼就很難分辨了,為了加強(qiáng)這種感覺(jué),戴眼鏡的同學(xué)可以把眼睛摘掉,或者遠(yuǎn)距離觀察。 ? ??? ??? ??大自然的灰階是無(wú)限的,而記錄展示的灰階是有限的 好了,既然上面說(shuō)到,人眼觀察到的這個(gè)世界的線性亮度變化,實(shí)際感覺(jué)是非線性的,那么怎么利用這點(diǎn)呢,前面說(shuō)到了因?yàn)镃RT顯示器的原因,還有一個(gè)非常非常重要的原因,就是大自然有無(wú)窮無(wú)盡的色彩,亮度,需要將這些無(wú)窮無(wú)盡的色彩全都裝進(jìn)屏幕里,顯然是不太可能的,那么就需要一個(gè)映射關(guān)系,正常的計(jì)算機(jī)顯示的圖片都是8bit的位圖,那么8bit的位圖所能產(chǎn)生的色彩是256^3,而灰階只有可憐的256個(gè)。 在攝像機(jī)等記錄影響的設(shè)備進(jìn)行記錄畫面的時(shí)候,如果不矯正的話,按照線性的去記錄,理論上沒(méi)啥問(wèn)題,實(shí)際上牽扯到我們剛剛講了人眼的特性,這就很有問(wèn)題了。請(qǐng)看下圖
下面的灰階圖表示了正確的線性灰階過(guò)度關(guān)系,但是上圖才是我們?nèi)搜壅嬲兄降幕译A過(guò)度關(guān)系,如果按照下面的狀態(tài)去記錄,那么人眼就會(huì)感覺(jué)到暗部細(xì)節(jié)偏少,在人眼的感官里,白色是占了很大一部分的,然而人眼對(duì)亮度不那么敏感,所以造成了很大的浪費(fèi)。 因此,我們就需要用到Gamma矯正來(lái)糾正這種關(guān)系,說(shuō)白了就是要讓人感到爽。 因此我們就有了pow(color, 1/2.2)這個(gè)gamma encoding操作,通過(guò)這個(gè)公式,先讓一張圖變亮,來(lái)讓暗部細(xì)節(jié)更豐富(暗部細(xì)節(jié)得到更多的色階),最后再通過(guò)displaygamma輸出到屏幕上,達(dá)到還原的目的。 這里補(bǔ)充一個(gè)小知識(shí):伽馬校正的公式是:V(out) = V(in) ^ r. 0 < r < 1 時(shí),該 r 稱為 encoding gamma,該過(guò)程稱為 gamacompression; 1< r, 該 r 稱為 decoding gamma,該過(guò)程稱為gamaexpansion。具體表現(xiàn)如下圖。 好了,上面說(shuō)了那么多,通過(guò)這張圖基本就可以完全理解了
那么來(lái)說(shuō)說(shuō),那個(gè)CRT是怎么回事,當(dāng)年CRT的display Gamma是2.5,這個(gè)數(shù)值接近于人眼的感光的冪率1/0.45=2.2,于是當(dāng)時(shí)的人們很驚訝,我X,真是太巧了,顯示器不需要做額外的工作就能正確顯示我們之前根據(jù)人眼的特性矯正過(guò)的圖片了,太棒了!這就造成了一個(gè)小問(wèn)題,0.45*2.5最終的結(jié)果是1.125,并非是1,但是也沒(méi)人管這事啊,直到后來(lái),科技大佬們終于管起了這事:
sRGB (標(biāo)準(zhǔn)紅綠藍(lán))是惠普和微軟 1996年合作創(chuàng)建的用于顯示器,打印機(jī)和互聯(lián)網(wǎng)的RGB色彩空間 ,隨后由IEC標(biāo)準(zhǔn)化為IEC 61966-2-1:1999。 [1]它通常用作不包含任何顏色空間信息的圖像的“默認(rèn)”顏色空間,特別是如果圖像存儲(chǔ)為8位整數(shù)。
SRGB的display gamma的值為2.2,這樣配合之前根據(jù)人眼推算出來(lái)的gamma值為0.45,最終的gamma值就為1了。
當(dāng)然,1這個(gè)值也不是絕對(duì)的,只是在大部分的情況下比較合適,如果在黑暗的電影院里,1.5是比較好的選擇,而在比較明亮的辦公室里,1.125是比較好的選擇,這就像手機(jī)上的自動(dòng)調(diào)節(jié)光照一樣,陽(yáng)光很好的室外,會(huì)自動(dòng)調(diào)亮屏幕,夜晚躺在床上看小說(shuō),屏幕自動(dòng)調(diào)暗。
那么對(duì)于Gamma和Gamma矯正以及人眼什么的,可以用一下幾句話來(lái)總結(jié): 韓世麟:灰階有限的前提下,因?yàn)槿搜蹖?duì)自然的非線性感知特性,我們才需要Gamma校正。 渣渣:gamma校正存在的本質(zhì)原因是:是受限于有限存儲(chǔ)空間及渲染帶寬,需要在整個(gè)圖像的流轉(zhuǎn)各級(jí)轉(zhuǎn)換中盡可能保留暗部細(xì)節(jié),以滿足人眼對(duì)暗部敏感的需求。 疾風(fēng)齒輪:gamma值就是對(duì)動(dòng)態(tài)范圍內(nèi)亮度的非線性存儲(chǔ)/還原算法。
Gamma encoding of images is used to optimize the usage of bits when encoding an image, or bandwidth used to transport an image, by taking advantage of the non-linear manner in which humans perceive light and color.[1] The human perception of brightness, under common illumination conditions (not pitch black nor blindingly bright), follows an approximate power function (note: no relation to the Gamma function), with greater sensitivity to relative differences between darker tones than between lighter ones, consistent with the Stevens' power law for brightness perception. If images are not gamma-encoded, they allocate too many bits or too much bandwidth to highlights that humans cannot differentiate, and too few bits or too little bandwidth to shadow values that humans are sensitive to and would require more bits/bandwidth to maintain the same visual quality.[1][2] Gamma encoding of floating-point images is not required (and may be counterproductive), because the floating-point format already provides a piecewise linear approximation of a logarithmic curve.[3] Although gamma encoding was developed originally to compensate for the input–output characteristic of cathode ray tube (CRT) displays, that is not its main purpose or advantage in modern systems. In CRT displays, the light intensity varies nonlinearly with the electron-gun voltage. Altering the input signal by gamma compression can cancel this nonlinearity, such that the output picture has the intended luminance. However, the gamma characteristics of the display device do not play a factor in the gamma encoding of images and video—they need gamma encoding to maximize the visual quality of the signal, regardless of the gamma characteristics of the display device.[1][2] The similarity of CRT physics to the inverse of gamma encoding needed for video transmission was a combination of luck and engineering, which simplified the electronics in early television sets.[4] 圖像的伽瑪編碼用于通過(guò)利用人類感知光和顏色的非線性方式來(lái)優(yōu)化編碼圖像時(shí)使用的比特,或者用于傳輸圖像的帶寬。 [1]在普通照明條件下(不是黑色或黑暗),人類對(duì)亮度的感知遵循近似的功率函數(shù) (注意:與伽馬函數(shù)無(wú)關(guān)),對(duì)較暗的色調(diào)之間的相對(duì)差異的敏感性比較輕一些,與史蒂文生的亮度感知的冪律一致。 如果圖像沒(méi)有伽瑪編碼,它們會(huì)分配太多的位或太多的帶寬,以突顯人類無(wú)法區(qū)分,太少的位或太少的帶寬影響人類敏感的值,并且需要更多的位/帶寬來(lái)維護(hù)相同的視覺(jué)質(zhì)量。 [1] [2] 浮點(diǎn)圖像的伽馬編碼不是必需的(并且可能適得其反),因?yàn)楦↑c(diǎn)格式已經(jīng)提供了對(duì)數(shù)曲線的分段線性近似。 [3] 雖然伽瑪編碼最初是為了補(bǔ)償陰極射線管 (CRT)顯示器的輸入輸出特性而開(kāi)發(fā)的,但這不是現(xiàn)代系統(tǒng)的主要目的或優(yōu)點(diǎn)。 在CRT顯示器中,光強(qiáng)度隨電子槍電壓而非線性變化。 通過(guò)伽瑪壓縮來(lái)改變輸入信號(hào)可以消除這種非線性,使得輸出圖像具有預(yù)期的亮度。 然而,不管顯示裝置的伽馬特性如何,顯示裝置的伽馬特性不會(huì)影響圖像和視頻的伽馬編碼,因此它們需要伽馬編碼以使信號(hào)的視覺(jué)質(zhì)量最大化。 [1] [2] CRT物理學(xué)與視頻傳輸所需伽馬編碼的相反性是運(yùn)氣與工程的結(jié)合,簡(jiǎn)化了早期電視機(jī)中的電子設(shè)備。 [4]
對(duì)于CRT黨和人眼黨,我后來(lái)又仔細(xì)閱讀了下wiki的說(shuō)明,wiki的意思是,雖然早期gamma的存在是為了補(bǔ)充陰極射線管(CRT),但是這不是現(xiàn)代系統(tǒng)主要的目的,我猜測(cè)這里說(shuō)的現(xiàn)代系統(tǒng)應(yīng)該就是微軟聯(lián)合惠普等科技大佬指定sRGB標(biāo)準(zhǔn)之后的時(shí)間,所以對(duì)于業(yè)界的Gamma&Gamma矯正就不做深究了,下面主要講講中的Color Space。
三、Unity3d中的Gamma和Linear Color Space 在unity中除了選擇渲染路徑外,在“顏色空間”也是很重要的。顏色空間決定了在燈光計(jì)算中混合顏色或從紋理中讀取值時(shí),統(tǒng)一所使用的計(jì)算方式。這可能會(huì)對(duì)游戲的畫面真實(shí)性產(chǎn)生比較大的影響,在以前Linear Color Space不支持移動(dòng)平臺(tái),但是在Unity 5.5中已經(jīng)加入了對(duì)和iOS的線性渲染。通過(guò)線性渲染,你可以確定你的輸入輸入,輸出和計(jì)算都是在正確的顏色空間中完成的。最終圖像的亮度將隨著場(chǎng)景中的光的數(shù)量增長(zhǎng)而呈現(xiàn)線性增長(zhǎng)。 在Android上,線性渲染需要OpenGL ES3??API,市面上61.1%的Android設(shè)備都滿足。在iOS上,線性渲染需要Metal API,市面上71.1%的IOS設(shè)備都能滿足。 根據(jù)最新的消息,Unity2017.2已經(jīng)開(kāi)始支持WebGL2.0的線性色彩空間。目前市面上支持的瀏覽器是Chrome和Firefox瀏覽器。 首先明確一點(diǎn),在Shader中計(jì)算顏色一定是在線性空間進(jìn)行的。使用unity在Gamma空間中創(chuàng)建的紋理可以在線性空間顏色空間中被正確的表現(xiàn)出來(lái)。 所有的8位圖片都是經(jīng)過(guò)gamma矯正的,但是shader計(jì)算是要在線性空間下的,所以當(dāng)你選擇線性空間的時(shí)候,為了克服gamma空間下貼圖計(jì)算不準(zhǔn)確的問(wèn)題,可以讓unity使用RGB采樣而不是sRGB采樣,具體設(shè)置如下:
當(dāng)選擇Gamma Space時(shí):就是一個(gè)“負(fù)負(fù)得正”的過(guò)程,加載貼圖(此時(shí)貼圖是校正了的1/gamma),采樣,計(jì)算,再寫到緩沖區(qū),顯示在屏幕上,也不會(huì)對(duì)輸出像素進(jìn)行任何處理,這意味著輸出的像素會(huì)經(jīng)過(guò)顯示器的display gamma轉(zhuǎn)換后得到非預(yù)期的亮度,通常表現(xiàn)為整個(gè)場(chǎng)景會(huì)比較昏暗。
當(dāng)選擇Linear Space時(shí):Unity會(huì)使用線性計(jì)算光照紋理,引擎會(huì)創(chuàng)建支持sRGB的緩沖區(qū),替換普通的緩沖區(qū)。同時(shí)會(huì)默認(rèn)的對(duì)紋理進(jìn)行一次反gamma矯正(就是進(jìn)行一次pow(x,2.2)),這個(gè)過(guò)程就是unity在線性空間下對(duì)于gamma空間下貼圖的轉(zhuǎn)換處理的過(guò)程。如果此時(shí)開(kāi)啟了混合,在此種緩沖區(qū)進(jìn)行Alpha混合時(shí),先將緩沖區(qū)的顏色G(x)^Gamma,變換回線性變化,再進(jìn)行混合,而后再對(duì)得到的結(jié)果G(x)^(1/Gamma)到緩沖區(qū),這樣保證Alpha混合時(shí)結(jié)果也是正確的.此外,如果應(yīng)用了HDR,創(chuàng)建了浮點(diǎn)緩沖區(qū),寫入和讀取浮點(diǎn)緩沖區(qū)時(shí)都沒(méi)做特殊處理,里面的內(nèi)容都是線性變化的,在將浮點(diǎn)緩沖區(qū)寫入帶sRGB的緩沖區(qū)時(shí)再一次性進(jìn)行G(x)^(1/Gamma)。 sRGB模式是在近代的GPU上才有的東西。如果不支持sRGB,我們就需要自己在shader中進(jìn)行伽馬校正。對(duì)非線性輸入紋理的校正通常代碼如下:
float3 diffuseCol = pow(tex 2D( diffTex, texCoord ), 2.2 );??
最后輸出顏色為了配合顯示器的displaygamma一定要進(jìn)行如下計(jì)算:
fragColor.rgb = pow(fragColor.rgb, 1.0/2.2); return fragColor;
最后通過(guò)一個(gè)實(shí)例,來(lái)看看在unity中使用 Linear Color Space:
當(dāng)你使用伽瑪渲染時(shí),提供給一個(gè)著色器的顏色和紋理已經(jīng)有了伽馬校正。當(dāng)它們被用在一個(gè)著色器上時(shí),高亮度的顏色實(shí)際上比線性照明的亮度要高。這意味著當(dāng)光強(qiáng)度增加時(shí),表面會(huì)以非線性的方式變得更亮。這就導(dǎo)致了很多地方的照明過(guò)于明亮。整個(gè)場(chǎng)景的表現(xiàn)就會(huì)變得非常糟糕。當(dāng)你使用線性渲染時(shí),當(dāng)光強(qiáng)度增加時(shí),表面的響應(yīng)仍然是線性的。這就產(chǎn)生了更現(xiàn)實(shí)的表面陰影和更漂亮的表面效果。具體可以看上面的圖。
四、參考資料 https:// unity3d.com/cn/learn/tutorials/topics/graphics/choosing-color-space
https://www.zhihu.com/question/43574033?sort=created
http://blog.csdn.net/zhaoguanghui2012/article/details/54016868
https://blogs.unity3d.com/cn/2016/12/07/linear-rendering-support-on- android-and-ios
https://docs.unity3d.com/Manual/LinearLighting.html?_ga=2.149938495.806633104.1499837304-570944340.1493705545
http://blog.csdn.net/candycat1992/article/details/46228771
http://blog.csdn.net/golden_shadow/article/details/40183561
https://docs.unity3d.com/Manual/LinearRendering-LinearOrGammaWorkflow.html
https://docs.unity3d.com/Manual/LinearLighting.html
https://docs.unity3d.com/Manual/LinearRendering-GammaTextures.html
https://docs.unity3d.com/Manual/LinearRendering-LinearTextures.html
https://en.wikipedia.org/wiki/SRGB
https://www.w3.org/Graphics/Color/sRGB.html
http://www.klayge.org/2011/02/26/gamma%E7%9A%84%E4%BC%A0%E8%AF%B4/
https://forum.unity3d.com/threads/bug-with-bypass-srgb-sampling.282469/
http://qiankanglai.me/2014/12/24/gamma-correction/
https://www.zhihu.com/question/27467127
https://zhuanlan.zhihu.com/p/26644788
https://www.slideshare.net/ozlael/hable-john-uncharted2-hdr-lighting?from_action=save
http://www.poynton.com/notes/colour_and_gamma/GammaFAQ.html By,Alpha 2017-07-21
轉(zhuǎn)載請(qǐng)注明作者出處
Gamma & Linear Color Space
一、真實(shí)?感覺(jué)? ? ??1、你相信你的眼睛嗎 (藍(lán)黑or白金?) (A和B的顏色一樣嗎?) 2、你以為你以為的就是你以為的嗎 (中度灰,127?186?) 二、Gamma Color Space ? ??1、什么是亮度 人類視覺(jué)對(duì)亮度感知能力并不是呈現(xiàn)線性關(guān)系的,人類的眼睛在在感受純白(亮度100%)與純黑(亮度0%)后,對(duì)于中等亮度(亮度50%)的實(shí)際感知并不是中灰(PS中128度灰)所帶來(lái)的亮度,而當(dāng)人眼接受到18%左右的亮度的光源后,就能感覺(jué)到這是中等亮度了。 那么人類對(duì)于對(duì)亮度的感知響應(yīng)稱為亮度。 ? ??2、什么是Gamma和Gamma矯正
傳統(tǒng)的CRT顯示器是通過(guò)電壓的強(qiáng)度來(lái)進(jìn)行屏幕亮度的顯示的,而CRT顯示器顯示的亮度跟施加的電壓并不是呈線性的關(guān)系的,是呈現(xiàn)一種冪律響應(yīng)的方式:在顯示器的表面處產(chǎn)生的亮度與提高到2.5倍的施加電壓大致成比例,該功率函數(shù)的指數(shù)的數(shù)值通常被稱為γ(Gamma)。 這是一個(gè)實(shí)際CRT傳輸功能的圖形 為了實(shí)現(xiàn)亮度的正確再現(xiàn),同時(shí),如上面所說(shuō)(什么是亮度),人類對(duì)于亮度的感知是非線性的,所以必須補(bǔ)償該非線性。(這里的非線性指兩個(gè),人類對(duì)亮度的感知的非線性和CRT顯示器的對(duì)電壓的非線性的響應(yīng)關(guān)系) 那么對(duì)于Gamma矯正的原因,網(wǎng)上也是眾說(shuō)紛紜,有的人認(rèn)為僅僅是因?yàn)槔鲜接?jì)算機(jī)(CRT)的的歷史遺留 問(wèn)題,這個(gè)說(shuō)法主要來(lái)自Gong大,還要一個(gè)黨派認(rèn)為這僅僅是因?yàn)槿搜鄣囊曈X(jué)感官所決定的,跟CRT沒(méi)半點(diǎn)關(guān)系,這個(gè)說(shuō)法主要來(lái)自韓世麟,那么最終也有人結(jié)合這兩派提出自己的觀點(diǎn),她認(rèn)為主要跟人眼就關(guān),CRT只是個(gè)巧合,CandyCat。 ? ??? ??1)CRT歷史遺留問(wèn)題黨 開(kāi)發(fā)gamma編碼是用來(lái)抵消陰極射線管(CRT)顯示器的輸入和輸出特性。電子槍的電流,也就是光的亮度,與輸入的正極電壓的變化是非線性的。通過(guò)gamma壓縮來(lái)改變輸入信號(hào)抵消了這個(gè)非線性,因此輸出圖像就能有預(yù)期的亮度。來(lái)自維基百科 如果單純考慮歷史原因,CRT的輸入輸出問(wèn)題,那么計(jì)算就很簡(jiǎn)單了,如下圖
那么我們所看到的圖像,就有以下幾種情況了:
按照Gong大的意思,這個(gè)原因完全與人眼無(wú)關(guān),但是這里我是質(zhì)疑的,當(dāng)然下面也有人留言進(jìn)行了反駁。 ? ??? ??2)人眼至上黨 ? ??? ??? ??人眼對(duì)自然亮度的感知是非線性的(韋伯定律) 對(duì)于你看到的跟實(shí)際的情況不符,韓世麟用了一條韋伯定律來(lái)大概說(shuō)明了下這種現(xiàn)象,在wiki上韋伯定律是這么解釋的:
韋伯定律:在同類刺激之下,其差異閾限的大小是隨著標(biāo)準(zhǔn)刺激強(qiáng)弱而成一定比例關(guān)系的,K=ΔI/I K為常數(shù)。?
費(fèi)希納定律:在絕對(duì)閾限之上,主觀的感覺(jué)強(qiáng)度與刺激強(qiáng)度的改變,兩者間呈對(duì)數(shù)的關(guān)系,亦即,刺激強(qiáng)度如果按幾何級(jí)數(shù)增加,而引起的感覺(jué)強(qiáng)度卻只按算術(shù)級(jí)數(shù)增加。
這條定律套用到前面所說(shuō)的亮度的關(guān)系就是說(shuō),在一間黑屋子里,開(kāi)一盞燈,你立刻就能感覺(jué)到亮度的巨大變化,如果在這種狀態(tài)下想獲得成倍的亮度變化的感覺(jué),理論上你再開(kāi)一盞燈就可以,但實(shí)際不是,可能要開(kāi)兩盞燈你才能感受到這個(gè)屋子里的亮度變亮了一倍,也就是說(shuō),你想獲得成倍亮度變化的體驗(yàn),所開(kāi)的燈的數(shù)量并不是呈線性比的,而是一個(gè)指數(shù)函數(shù)的關(guān)系。
這張圖說(shuō)明,在亮度呈現(xiàn)線性變化的情況下,人眼的感覺(jué)的變化并不是呈現(xiàn)線性的,下面黑色區(qū)域的變化,人眼能很容易的分辨,而上面白色區(qū)域的變化,人眼就很難分辨了,為了加強(qiáng)這種感覺(jué),戴眼鏡的同學(xué)可以把眼睛摘掉,或者遠(yuǎn)距離觀察。 ? ??? ??? ??大自然的灰階是無(wú)限的,而記錄展示的灰階是有限的 好了,既然上面說(shuō)到,人眼觀察到的這個(gè)世界的線性亮度變化,實(shí)際感覺(jué)是非線性的,那么怎么利用這點(diǎn)呢,前面說(shuō)到了因?yàn)镃RT顯示器的原因,還有一個(gè)非常非常重要的原因,就是大自然有無(wú)窮無(wú)盡的色彩,亮度,需要將這些無(wú)窮無(wú)盡的色彩全都裝進(jìn)屏幕里,顯然是不太可能的,那么就需要一個(gè)映射關(guān)系,正常的計(jì)算機(jī)顯示的圖片都是8bit的位圖,那么8bit的位圖所能產(chǎn)生的色彩是256^3,而灰階只有可憐的256個(gè)。 在攝像機(jī)等記錄影響的設(shè)備進(jìn)行記錄畫面的時(shí)候,如果不矯正的話,按照線性的去記錄,理論上沒(méi)啥問(wèn)題,實(shí)際上牽扯到我們剛剛講了人眼的特性,這就很有問(wèn)題了。請(qǐng)看下圖
下面的灰階圖表示了正確的線性灰階過(guò)度關(guān)系,但是上圖才是我們?nèi)搜壅嬲兄降幕译A過(guò)度關(guān)系,如果按照下面的狀態(tài)去記錄,那么人眼就會(huì)感覺(jué)到暗部細(xì)節(jié)偏少,在人眼的感官里,白色是占了很大一部分的,然而人眼對(duì)亮度不那么敏感,所以造成了很大的浪費(fèi)。 因此,我們就需要用到Gamma矯正來(lái)糾正這種關(guān)系,說(shuō)白了就是要讓人感到爽。 因此我們就有了pow(color, 1/2.2)這個(gè)gamma encoding操作,通過(guò)這個(gè)公式,先讓一張圖變亮,來(lái)讓暗部細(xì)節(jié)更豐富(暗部細(xì)節(jié)得到更多的色階),最后再通過(guò)displaygamma輸出到屏幕上,達(dá)到還原的目的。 這里補(bǔ)充一個(gè)小知識(shí):伽馬校正的公式是:V(out) = V(in) ^ r. 0 < r < 1 時(shí),該 r 稱為 encoding gamma,該過(guò)程稱為 gamacompression; 1< r, 該 r 稱為 decoding gamma,該過(guò)程稱為gamaexpansion。具體表現(xiàn)如下圖。 好了,上面說(shuō)了那么多,通過(guò)這張圖基本就可以完全理解了
- 綠色的曲線是人眼的感光度的曲線,也就是對(duì)光線敏感程度的一條曲線,從圖中藍(lán)色的線可以看出,當(dāng)亮度達(dá)到0.218左右的時(shí)候,人眼就已經(jīng)感覺(jué)到這是中度亮度了。
- 為了配合這種特性,必須要用相反的一條曲線進(jìn)行校正,也就是圖中藍(lán)色的曲線,可以看到,當(dāng)進(jìn)行這樣一個(gè)過(guò)程之后,可以以用0.729的亮度來(lái)表示0~0.5的黑色區(qū)域,而那些人眼不敏感的白色區(qū)域只占到了0.271,這樣就達(dá)到了資源節(jié)省的目的。
那么來(lái)說(shuō)說(shuō),那個(gè)CRT是怎么回事,當(dāng)年CRT的display Gamma是2.5,這個(gè)數(shù)值接近于人眼的感光的冪率1/0.45=2.2,于是當(dāng)時(shí)的人們很驚訝,我X,真是太巧了,顯示器不需要做額外的工作就能正確顯示我們之前根據(jù)人眼的特性矯正過(guò)的圖片了,太棒了!這就造成了一個(gè)小問(wèn)題,0.45*2.5最終的結(jié)果是1.125,并非是1,但是也沒(méi)人管這事啊,直到后來(lái),科技大佬們終于管起了這事:
sRGB (標(biāo)準(zhǔn)紅綠藍(lán))是惠普和微軟 1996年合作創(chuàng)建的用于顯示器,打印機(jī)和互聯(lián)網(wǎng)的RGB色彩空間 ,隨后由IEC標(biāo)準(zhǔn)化為IEC 61966-2-1:1999。 [1]它通常用作不包含任何顏色空間信息的圖像的“默認(rèn)”顏色空間,特別是如果圖像存儲(chǔ)為8位整數(shù)。
SRGB的display gamma的值為2.2,這樣配合之前根據(jù)人眼推算出來(lái)的gamma值為0.45,最終的gamma值就為1了。
當(dāng)然,1這個(gè)值也不是絕對(duì)的,只是在大部分的情況下比較合適,如果在黑暗的電影院里,1.5是比較好的選擇,而在比較明亮的辦公室里,1.125是比較好的選擇,這就像手機(jī)上的自動(dòng)調(diào)節(jié)光照一樣,陽(yáng)光很好的室外,會(huì)自動(dòng)調(diào)亮屏幕,夜晚躺在床上看小說(shuō),屏幕自動(dòng)調(diào)暗。
那么對(duì)于Gamma和Gamma矯正以及人眼什么的,可以用一下幾句話來(lái)總結(jié): 韓世麟:灰階有限的前提下,因?yàn)槿搜蹖?duì)自然的非線性感知特性,我們才需要Gamma校正。 渣渣:gamma校正存在的本質(zhì)原因是:是受限于有限存儲(chǔ)空間及渲染帶寬,需要在整個(gè)圖像的流轉(zhuǎn)各級(jí)轉(zhuǎn)換中盡可能保留暗部細(xì)節(jié),以滿足人眼對(duì)暗部敏感的需求。 疾風(fēng)齒輪:gamma值就是對(duì)動(dòng)態(tài)范圍內(nèi)亮度的非線性存儲(chǔ)/還原算法。
Gamma encoding of images is used to optimize the usage of bits when encoding an image, or bandwidth used to transport an image, by taking advantage of the non-linear manner in which humans perceive light and color.[1] The human perception of brightness, under common illumination conditions (not pitch black nor blindingly bright), follows an approximate power function (note: no relation to the Gamma function), with greater sensitivity to relative differences between darker tones than between lighter ones, consistent with the Stevens' power law for brightness perception. If images are not gamma-encoded, they allocate too many bits or too much bandwidth to highlights that humans cannot differentiate, and too few bits or too little bandwidth to shadow values that humans are sensitive to and would require more bits/bandwidth to maintain the same visual quality.[1][2] Gamma encoding of floating-point images is not required (and may be counterproductive), because the floating-point format already provides a piecewise linear approximation of a logarithmic curve.[3] Although gamma encoding was developed originally to compensate for the input–output characteristic of cathode ray tube (CRT) displays, that is not its main purpose or advantage in modern systems. In CRT displays, the light intensity varies nonlinearly with the electron-gun voltage. Altering the input signal by gamma compression can cancel this nonlinearity, such that the output picture has the intended luminance. However, the gamma characteristics of the display device do not play a factor in the gamma encoding of images and video—they need gamma encoding to maximize the visual quality of the signal, regardless of the gamma characteristics of the display device.[1][2] The similarity of CRT physics to the inverse of gamma encoding needed for video transmission was a combination of luck and engineering, which simplified the electronics in early television sets.[4] 圖像的伽瑪編碼用于通過(guò)利用人類感知光和顏色的非線性方式來(lái)優(yōu)化編碼圖像時(shí)使用的比特,或者用于傳輸圖像的帶寬。 [1]在普通照明條件下(不是黑色或黑暗),人類對(duì)亮度的感知遵循近似的功率函數(shù) (注意:與伽馬函數(shù)無(wú)關(guān)),對(duì)較暗的色調(diào)之間的相對(duì)差異的敏感性比較輕一些,與史蒂文生的亮度感知的冪律一致。 如果圖像沒(méi)有伽瑪編碼,它們會(huì)分配太多的位或太多的帶寬,以突顯人類無(wú)法區(qū)分,太少的位或太少的帶寬影響人類敏感的值,并且需要更多的位/帶寬來(lái)維護(hù)相同的視覺(jué)質(zhì)量。 [1] [2] 浮點(diǎn)圖像的伽馬編碼不是必需的(并且可能適得其反),因?yàn)楦↑c(diǎn)格式已經(jīng)提供了對(duì)數(shù)曲線的分段線性近似。 [3] 雖然伽瑪編碼最初是為了補(bǔ)償陰極射線管 (CRT)顯示器的輸入輸出特性而開(kāi)發(fā)的,但這不是現(xiàn)代系統(tǒng)的主要目的或優(yōu)點(diǎn)。 在CRT顯示器中,光強(qiáng)度隨電子槍電壓而非線性變化。 通過(guò)伽瑪壓縮來(lái)改變輸入信號(hào)可以消除這種非線性,使得輸出圖像具有預(yù)期的亮度。 然而,不管顯示裝置的伽馬特性如何,顯示裝置的伽馬特性不會(huì)影響圖像和視頻的伽馬編碼,因此它們需要伽馬編碼以使信號(hào)的視覺(jué)質(zhì)量最大化。 [1] [2] CRT物理學(xué)與視頻傳輸所需伽馬編碼的相反性是運(yùn)氣與工程的結(jié)合,簡(jiǎn)化了早期電視機(jī)中的電子設(shè)備。 [4]
對(duì)于CRT黨和人眼黨,我后來(lái)又仔細(xì)閱讀了下wiki的說(shuō)明,wiki的意思是,雖然早期gamma的存在是為了補(bǔ)充陰極射線管(CRT),但是這不是現(xiàn)代系統(tǒng)主要的目的,我猜測(cè)這里說(shuō)的現(xiàn)代系統(tǒng)應(yīng)該就是微軟聯(lián)合惠普等科技大佬指定sRGB標(biāo)準(zhǔn)之后的時(shí)間,所以對(duì)于業(yè)界的Gamma&Gamma矯正就不做深究了,下面主要講講中的Color Space。
三、Unity3d中的Gamma和Linear Color Space 在unity中除了選擇渲染路徑外,在“顏色空間”也是很重要的。顏色空間決定了在燈光計(jì)算中混合顏色或從紋理中讀取值時(shí),統(tǒng)一所使用的計(jì)算方式。這可能會(huì)對(duì)游戲的畫面真實(shí)性產(chǎn)生比較大的影響,在以前Linear Color Space不支持移動(dòng)平臺(tái),但是在Unity 5.5中已經(jīng)加入了對(duì)和iOS的線性渲染。通過(guò)線性渲染,你可以確定你的輸入輸入,輸出和計(jì)算都是在正確的顏色空間中完成的。最終圖像的亮度將隨著場(chǎng)景中的光的數(shù)量增長(zhǎng)而呈現(xiàn)線性增長(zhǎng)。 在Android上,線性渲染需要OpenGL ES3??API,市面上61.1%的Android設(shè)備都滿足。在iOS上,線性渲染需要Metal API,市面上71.1%的IOS設(shè)備都能滿足。 根據(jù)最新的消息,Unity2017.2已經(jīng)開(kāi)始支持WebGL2.0的線性色彩空間。目前市面上支持的瀏覽器是Chrome和Firefox瀏覽器。 首先明確一點(diǎn),在Shader中計(jì)算顏色一定是在線性空間進(jìn)行的。使用unity在Gamma空間中創(chuàng)建的紋理可以在線性空間顏色空間中被正確的表現(xiàn)出來(lái)。 所有的8位圖片都是經(jīng)過(guò)gamma矯正的,但是shader計(jì)算是要在線性空間下的,所以當(dāng)你選擇線性空間的時(shí)候,為了克服gamma空間下貼圖計(jì)算不準(zhǔn)確的問(wèn)題,可以讓unity使用RGB采樣而不是sRGB采樣,具體設(shè)置如下:
- Gamma Color Space workflow
- Linear Color Space workflow
- 線性貼圖
- Gamma貼圖
當(dāng)選擇Gamma Space時(shí):就是一個(gè)“負(fù)負(fù)得正”的過(guò)程,加載貼圖(此時(shí)貼圖是校正了的1/gamma),采樣,計(jì)算,再寫到緩沖區(qū),顯示在屏幕上,也不會(huì)對(duì)輸出像素進(jìn)行任何處理,這意味著輸出的像素會(huì)經(jīng)過(guò)顯示器的display gamma轉(zhuǎn)換后得到非預(yù)期的亮度,通常表現(xiàn)為整個(gè)場(chǎng)景會(huì)比較昏暗。
當(dāng)選擇Linear Space時(shí):Unity會(huì)使用線性計(jì)算光照紋理,引擎會(huì)創(chuàng)建支持sRGB的緩沖區(qū),替換普通的緩沖區(qū)。同時(shí)會(huì)默認(rèn)的對(duì)紋理進(jìn)行一次反gamma矯正(就是進(jìn)行一次pow(x,2.2)),這個(gè)過(guò)程就是unity在線性空間下對(duì)于gamma空間下貼圖的轉(zhuǎn)換處理的過(guò)程。如果此時(shí)開(kāi)啟了混合,在此種緩沖區(qū)進(jìn)行Alpha混合時(shí),先將緩沖區(qū)的顏色G(x)^Gamma,變換回線性變化,再進(jìn)行混合,而后再對(duì)得到的結(jié)果G(x)^(1/Gamma)到緩沖區(qū),這樣保證Alpha混合時(shí)結(jié)果也是正確的.此外,如果應(yīng)用了HDR,創(chuàng)建了浮點(diǎn)緩沖區(qū),寫入和讀取浮點(diǎn)緩沖區(qū)時(shí)都沒(méi)做特殊處理,里面的內(nèi)容都是線性變化的,在將浮點(diǎn)緩沖區(qū)寫入帶sRGB的緩沖區(qū)時(shí)再一次性進(jìn)行G(x)^(1/Gamma)。 sRGB模式是在近代的GPU上才有的東西。如果不支持sRGB,我們就需要自己在shader中進(jìn)行伽馬校正。對(duì)非線性輸入紋理的校正通常代碼如下:
float3 diffuseCol = pow(tex 2D( diffTex, texCoord ), 2.2 );??
最后輸出顏色為了配合顯示器的displaygamma一定要進(jìn)行如下計(jì)算:
fragColor.rgb = pow(fragColor.rgb, 1.0/2.2); return fragColor;
最后通過(guò)一個(gè)實(shí)例,來(lái)看看在unity中使用 Linear Color Space:
- 首先在unity中設(shè)置成linear空間,Edit -> Project Settings -> Player -> Other Settings
- 然后再PS里面制作一張128度灰的貼圖(這里可以制作兩張,一張是8bit的128度灰,還有一張是32bit的128度灰)導(dǎo)入U(xiǎn)nity
- 新建一個(gè)不接受光照的Shader,最終顏色呈兩倍輸出
- 新建一個(gè)Sphere和一個(gè)材質(zhì),然后先把8bit的圖貼在球上,觀察球的顏色,再把引擎的顏色空間切換成Gamma空間,你會(huì)得到如下圖所示的結(jié)果:
- 而對(duì)于32位編輯的紋理,不管是linear還是gamma空間,不管是否勾選srgb采樣都能獲得最正確的結(jié)果。
- Linear 和 Gamma 的區(qū)別、
- 光的衰減度
- 當(dāng)在線性模式下渲染時(shí),額外的伽馬矯正使得光的半徑顯得更大。
- 燈光的邊緣也顯得更加清晰。這更正確地表現(xiàn)了在表面上光照的衰減。
- 光強(qiáng)度的響應(yīng)
當(dāng)你使用伽瑪渲染時(shí),提供給一個(gè)著色器的顏色和紋理已經(jīng)有了伽馬校正。當(dāng)它們被用在一個(gè)著色器上時(shí),高亮度的顏色實(shí)際上比線性照明的亮度要高。這意味著當(dāng)光強(qiáng)度增加時(shí),表面會(huì)以非線性的方式變得更亮。這就導(dǎo)致了很多地方的照明過(guò)于明亮。整個(gè)場(chǎng)景的表現(xiàn)就會(huì)變得非常糟糕。當(dāng)你使用線性渲染時(shí),當(dāng)光強(qiáng)度增加時(shí),表面的響應(yīng)仍然是線性的。這就產(chǎn)生了更現(xiàn)實(shí)的表面陰影和更漂亮的表面效果。具體可以看上面的圖。
- Linear 和 Gamma 混合
- 內(nèi)置轉(zhuǎn)換代碼
四、參考資料 https:// unity3d.com/cn/learn/tutorials/topics/graphics/choosing-color-space
https://www.zhihu.com/question/43574033?sort=created
http://blog.csdn.net/zhaoguanghui2012/article/details/54016868
https://blogs.unity3d.com/cn/2016/12/07/linear-rendering-support-on- android-and-ios
https://docs.unity3d.com/Manual/LinearLighting.html?_ga=2.149938495.806633104.1499837304-570944340.1493705545
http://blog.csdn.net/candycat1992/article/details/46228771
http://blog.csdn.net/golden_shadow/article/details/40183561
https://docs.unity3d.com/Manual/LinearRendering-LinearOrGammaWorkflow.html
https://docs.unity3d.com/Manual/LinearLighting.html
https://docs.unity3d.com/Manual/LinearRendering-GammaTextures.html
https://docs.unity3d.com/Manual/LinearRendering-LinearTextures.html
https://en.wikipedia.org/wiki/SRGB
https://www.w3.org/Graphics/Color/sRGB.html
http://www.klayge.org/2011/02/26/gamma%E7%9A%84%E4%BC%A0%E8%AF%B4/
https://forum.unity3d.com/threads/bug-with-bypass-srgb-sampling.282469/
http://qiankanglai.me/2014/12/24/gamma-correction/
https://www.zhihu.com/question/27467127
https://zhuanlan.zhihu.com/p/26644788
https://www.slideshare.net/ozlael/hable-john-uncharted2-hdr-lighting?from_action=save
http://www.poynton.com/notes/colour_and_gamma/GammaFAQ.html By,Alpha 2017-07-21
轉(zhuǎn)載請(qǐng)注明作者出處
總結(jié)
以上是生活随笔為你收集整理的Unity Gamma Linear Color Space的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MBD(一)-下载包-getstart-
- 下一篇: 日语中di,ti,du,这些如何用片假名