日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

浅谈unity中gamma空间和线性空间

發布時間:2024/8/26 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅谈unity中gamma空间和线性空间 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載請標明出處:http://www.cnblogs.com/zblade/

一、概述? ?

很久沒有寫文章了,今天寫一篇對gamma空間和線性空間的個人理解總結,在查閱和學習了各個資料后,算是一個個人筆記吧。??

二、Gamma顏色空間和線性顏色空間

其實對于顏色空間的理解,我個人是這樣理解的:所有的一切顏色空間,最終的目的,都是為了最終投入到人眼中,能夠基本重現自然界的顏色。? ?

記住這一個目的,對下面的一些理解就會更加的有依據了。? ??

2.1 人眼的感知能力

既然目標是我們人自身,那么我們就需要對人自身的眼睛的感知能力有一個基本的認識:人眼對于光強度的感知是非線性的。? ?

什么是線性,什么是非線性,從數學的角度說,就是自變量的變化和因變量的變化是否成固定比例(默認為1),如果成比例,即:y = kx, 那么這個變化就是線性的。

如果不成固定比例,那么這個變化就是非線性的,非線性是自然界最常見的變化關系。? ?

人類對于很多環境因素的變化的感知能力,都是非線性的,例如對于音階,就是基于等比關系,而不是線性關系;對于分貝,對于疼痛等級,等等。??

回到對光強的感知,人眼對于光強度的變化的感知,是非線性的,這是通過實驗得出的結論。如果在一個全黑的房間中,放入一根蠟燭,此時感知的光強變化比較明顯;

如果房間中已經放入100根蠟燭,再次放入一根蠟燭,此時人眼對這新加入的一根蠟燭帶來的光強度變化是沒有最初從0到1的感知強的(默認每根蠟燭的光強度增量一樣)。? ?

可見,人眼對于高亮部分的感知能力,是沒有暗部的感知能力強的。? ?

2.2 存儲空間的有限

上面說了人眼的感知能力特點,那么自然界的光又是如何?自然界的光強度,是和其對應的功率成正比的,對應的范圍是極其大:日光下100000lux,? 星光0.0003 lux...??

如果要將這么大范圍的光強度變化都表示存儲起來,其對內存的占用以及傳輸帶寬的占用是無法承受的。

業界目前主流的,對于顏色亮度的表示,用的是8位,也就是8bit,從0-255來進行表示。逐漸也有32位的真彩,當然不在這次的討論中。? ?

2.3 Gamma空間

基于1和2的論證,那么如何將自然采光的結果存儲到實際的圖片中,就有一個基本的思路:將自然光以接近人眼感知能力曲線的函數進行壓縮到8位圖像中,這時候得到的圖形就是經過壓縮后的顏色結果。? ?

所謂Gamma壓縮,其實質就是這個壓縮的函數,是以Vout = VinGamma 來進行壓縮的。? ?

現在業界提到的Gamma = 2.2, 是業界經過反復測量,得到的一個數值,這樣可以在256個灰度階的范圍內更多的保留暗部的細節:

?

?

?上面的兩個圖兩個圖,就可以基本的解釋Gamma = 2.2 的來源,人眼的感知能力和n = 1/2.2的冪函數比較靠近,當然不同環境下有不同的數值,大概范圍在1.8-2.5之間。? ?

2.4 線性空間

理解非線性空間-Gamma空間后,自然可以理解線性空間,就是上面圖二中的 n = 1這條曲線,為什么要提線性空間?因為我們的相機對于光強的感知,是基于線性空間的。??

舉一個簡單例子,兩個光子投射到相機上,其得到的光強就是2倍光子光強,當然我們已經知道人眼并不是2倍光強。? ?

而業界的圖片都是Gamma空間中存儲,那么相機到最終圖片,就會經歷一個編碼過程,這就是所謂的Gamma編碼,也就是: Vout = Vin(1/2.2) 這個過程。? ?

?

三、Gamma補償

現在,我們通過相機拍攝的圖片,最終是以gamma空間的格式存儲(業界標準稱為sRGB), 那么我們在顯示器上查看圖片,是否也是以sRGB的結果顯示的?答案是否定的。

前面業界已經將原生自然界的光照進行了壓縮,那么業界定然要通過一定的辦法將壓縮的圖片重新轉換回來,得到更接近自然界的圖像,這個過程,就是Gamma補償,也被叫做Gamma校正。? ?

既然我們知道是以什么函數進行壓縮,那么解壓的過程,自然就是一個求逆的過程,可以得到:Vout?=?Vin2.2? ? ?

這一步是業界的顯示器自動默認執行的,所以我們在最終向顯示器上提交的顏色,需要滿足對應的關系。

用一張圖表示整個采樣到顯示的過程:?

一句話總結: 采樣生成,使用了Gamma編碼,這是業界標準,顯示過程,使用了Gamma補償,這也是業界標準,選取gamma = 2.2, 這是業界根據人眼進行測試得到的比較靠近人眼感知能力曲線的數值。

?

四、Unity中使用線性空間和Gamma空間

?在圖形學界,技術是不斷進步和探索的,應用一直都是延遲更新的(為了向下兼容的需要)。??

當然gamma空間的存在,以前都是忽視這部分的差異,直接基于gamma空間的存圖進行光學計算的。? ?

但是引擎中的光學計算(shader中),是基于線性空間的公式進行的,這樣就會帶來較大的差異,我們推算的公式基于線性空間得到的,但是輸入的數據是基于gamma空間存儲的格式,圖像采集得到的結果

作為光學計算公式的輸入,得到的輸出自然是錯誤的。以前游戲行業對于這個一直處于忍受階段,也可以通過美術進行調整,得到較為差異不大的計算結果。? ?

最近幾年逐漸推廣的PBR技術,對于光照的計算更為苛刻,這推動了線性空間在游戲行業的逐步推廣。? ?

4.1 Gamma空間的處理過程

在gamma空間中,在shader進行光學計算的過程中,直接將圖像采樣得到結果帶入公式中進行計算,得到的color存入colorbuff中,然后提交到顯示器,進過一次gamma補償,就得到最終的顏色。??

4.2 線性空間的處理過程

線性空間中,對所有的圖片,默認認為圖片都是線性存儲的方式。所以如果原圖是Gamma空間的sRGB的存儲方式,需要勾選sRGB的標志,這樣在進行shader計算的時候,會首先進行一次gamma補償,

將顏色從gamma空間轉換到線性空間,然后進行正確的光照計算,得到結果最后再轉換回到gamma空間(gamma壓縮), 最后提交到顯示器,進行一次gamma補償,得到最終的顏色。??

用一張圖表示這兩種處理的流程(直接用參考文章的圖):?

?

一句話總結:unity中的gamma空間和線性空間,其實質就是對存儲sRGB格式圖片,進行不同的光照計算,不同的光照計算進行不同的流程,得到精度不同的結果,最后都需要統一為gamma空間

的格式,提交到顯示器上進行gamma補償,得到最終的顯示圖片。

?

?參考文章:

?https://www.zhihu.com/question/27467127?該問題下的大部分回答

https://zhuanlan.zhihu.com/p/37679604?較為簡易

https://www.cambridgeincolour.com/tutorials/gamma-correction.htm?非游戲向的解釋gamma校正? ?

https://docs.unity3d.com/Manual/LinearRendering-LinearOrGammaWorkflow.html?unity官網的gamma/線性介紹

?

轉載于:https://www.cnblogs.com/zblade/p/10769202.html

總結

以上是生活随笔為你收集整理的浅谈unity中gamma空间和线性空间的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。