一、問題及原因
1.遇到的問題?
前段時(shí)間學(xué)習(xí)shader時(shí)發(fā)現(xiàn)了一個(gè)問題,一張純紅色透明度為128的圖片疊加在一張純綠色的圖片上在unity中得出的結(jié)果與ps中的結(jié)果不一致。網(wǎng)上查找了ps中的透明混合的公式為?
color = A.rgb*A.alpha + B.rgb*(1-A.alpha)。自己計(jì)算了一下結(jié)果總是不對。?
紅色透明度128的圖? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ?綠色透明度255的圖
?? ? ? ? ?????????????????? ? ?
?ps中紅色在上綠色在下疊加后的結(jié)果色
? ??
?Unity疊加后的結(jié)果色
可以明顯看出ps混合后的數(shù)值要比unity中的數(shù)值低。
2.產(chǎn)生的原因?
問題產(chǎn)生原因是unity使用的顏色空間(Color Space)為線性空間數(shù)值(Linear),而ps使用的是伽馬矯正后的空間數(shù)值(gamma)。一般被gamma矯正后的圖片會比線性空間的數(shù)值要低。所以ps混合后的數(shù)值要比unity中的數(shù)值低。
二、關(guān)于顏色空間描述
1.伽馬空間(gamma)。
在查閱資料學(xué)習(xí)時(shí)關(guān)于gamma矯正產(chǎn)生的原因基本上圍繞著兩點(diǎn)
1.?CRT 顯示器的物理特性
2. 人眼對光強(qiáng)的感知能力并不是線性的
?1.1 伽馬矯正之CRT顯示器的問題
在早期我們的電腦顯示器基本上是陰極射線管顯示器(CRT),就是上面有個(gè)后腦勺的顯示器。顯示器一般是通過電壓來控制每個(gè)像素的數(shù)值從而顯示出圖片的,但是CRT顯示器有一個(gè)物理特性是輸入的電壓會輸出為約等于輸入電壓2.2次冪的亮度。從理論上講這個(gè)值應(yīng)該是2.5倍,但在當(dāng)時(shí)根據(jù)實(shí)際統(tǒng)計(jì)市面上的產(chǎn)品的特性總結(jié)出來的值約是2.2倍。這樣就會導(dǎo)致顯示器的圖比實(shí)際圖像要暗。圖片借用文章
我們想要讓圖片最終展示的亮度與原圖一致就需要對gamma2.2進(jìn)行一個(gè)矯正,這個(gè)矯正值就是gamma1/2.2(2.2次冪的對數(shù)0.45) ,看下方的矯正示意圖。
?
我們?yōu)槭裁匆M(jìn)行g(shù)amma1/2.2(0.45)的矯正呢?除了上方需要與gamma2.2進(jìn)行抵消后顯示原圖外還有一點(diǎn)就是我們渲染計(jì)算的數(shù)值要在伽馬值為 1 的理想線性空間進(jìn)行的。
這里舉個(gè)例子:
從矯正圖來看假如我們輸入一個(gè)暗紅色的光照RGB顏色為(0.5, 0.0, 0.0)的圖, 然后將這個(gè)顏色提升一倍變?yōu)?strong>(1.0, 0.0, 0.0).?但由于顯示器的非線性特性, 我們最終調(diào)節(jié)的顏色實(shí)際是從 (0.218, 0.0, 0.0) 變成了 (1.0, 0.0, 0.0)。
所以gamma矯正是為了解決CRT的物理特性。但基于人眼的感知特性這個(gè)gamma矯正又是怎么實(shí)現(xiàn)的呢?我們繼續(xù)往下看。
1.2?伽馬矯正之人眼的感知特性并不是線性的
這是一個(gè)黑白漸變圖。在rgba數(shù)值中是(0,0,0,1)~(1,1,1,1)
根據(jù)上面這個(gè)圖左側(cè)黑色數(shù)值為0,右側(cè)白色數(shù)值為1,那么半灰色是不是0~1區(qū)間的中間數(shù)0.5呢?在數(shù)學(xué)中0~1的中間值的確應(yīng)該是0.5。但是人眼在自然界中看到的半灰色實(shí)際在上面這張圖的3/4的位置即:0.75。來我們看下面這張圖:
我們根據(jù) “物理亮度圖” 第0.5的半灰色對比去找 “人類自然界感知亮度圖”中對應(yīng)的顏色應(yīng)該是在0.75左右。所以“?人眼對光強(qiáng)的感知能力并不是線性的 ” 的意思就是如此。
人類的視覺系統(tǒng)在黑暗環(huán)境下的辨識能力要強(qiáng)于明亮環(huán)境這是進(jìn)化過程中出現(xiàn)的特性, 這樣有助于我們及時(shí)發(fā)現(xiàn)黑暗中隱藏的危險(xiǎn)。而且人眼的這一特性與CRT顯示器的gamma2.2相似。
1.3 CRT顯示器與人眼特性的關(guān)系
網(wǎng)上查的好多資料視頻有的說gamma矯正是因?yàn)槿搜鄹兄匦?,有的又說是為了解決CRT顯示問題。但其實(shí)一開始gamma矯正是為了解決CRT的物理特性巧合的是人眼的感知特性也是如此,而且后面Led等液晶顯示器現(xiàn)世后已經(jīng)可以達(dá)到與現(xiàn)實(shí)色彩呈線性的數(shù)值因?yàn)槿搜厶匦院图嫒軨RT顯示器處理的圖片才保留了gamma矯正。我感覺這才是正確的。如果有什么不對的也歡迎大家指正。
其他:
- gamma本身是人眼對于不同灰階畫面切換時(shí)候,一個(gè)讓眼睛覺得更自然的亮度補(bǔ)充.
- 保存在計(jì)算機(jī)中的圖片數(shù)據(jù)是經(jīng)過gamma1/2.2(0.45)后的數(shù)據(jù)。
2.?線性空間(Linear)
這個(gè)空間對應(yīng)的就是物理空間亮度圖。半灰色在0~1區(qū)間中屬于正常的0.5。根據(jù)上方伽馬空間描述了解到人眼感受的亮度值比實(shí)際物理空間的亮度值暗,所以unity中線性空間下的圖片亮度會比gamma矯正后的圖片要亮。
2.1Texture紋理圖片sRGB(Color Texture)屬性
Texture紋理圖片sRGB(Color Texture)屬性只有在線性空間下才管用。勾選是開啟gamma矯正,未勾選是不開啟gamma矯正。
在線性空間下勾選了sRGB效果圖:
運(yùn)算公式?color = (A.rgb^2.2 * A.alpha + B.rgb^2.2 * (1-A.alpha)) ^ (1/2.2)? ?
未勾選sRGB效果圖:
運(yùn)算公式?color = (A.rgb * A.alpha + B.rgb*(1-A.alpha)) ^(1/2.2)? ?
三、解決方法?
1.將unity改為伽馬空間(gamma)
修改 File—>Build Settings—>Player Settings—>Other Setting選項(xiàng)卡中的Color Space為gamma即可。
2.PS修改為Linear?
?“編輯”—>“顏色設(shè)置”—>勾選“用灰度系數(shù)混合RGB顏色”。
?修改后ps的最后混合顏色結(jié)果?與unity中的一致。文章來源:http://www.zghlxwxcb.cn/news/detail-743748.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-743748.html
到了這里,關(guān)于Unity之透明度混合與ps的透明度混合計(jì)算結(jié)果不一致(gamma矯正和線性空間)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!