Gamma在CG制作Linear Work Flow中的重要性

? ??首先,物質(zhì)世界的顏色是無窮連續(xù)變化的,是一個線性量,但人的眼睛對亮度的感覺卻并非呈線性分布,而是呈指數(shù)分布的。人眼只是對亮度的比率敏感,而并非對亮度本身敏感,我們觀察到的亮度從0.10到0.11之間的差別與0.50到0.55之間的差別是一樣的。這種非線性在日常生活中很容易感覺,比如你把燈泡功率從20W調(diào)到80W再調(diào)到140W,你會發(fā)現(xiàn)20W到80W之間亮度的增加比后一次調(diào)節(jié)來得更大。所以,當真實世界中線性無窮的顏色量到達人眼時,它們實際上被人眼感覺的非線性做了一次“校正”,只是這種“校正”從某種意義上說是錯誤的背離真實的,但我們自身無法避免,這是人類眼睛的特質(zhì),沒有辦法,所以我們只能對源色彩向相反的方向進行指數(shù)校正(也就是讓顏色不呈線性分布,而呈指數(shù)分布),來讓我們覺得亮度分布均勻。
? ? 設(shè)想一下,當我們開始用電腦制作某CG內(nèi)容時,我們首先是通過電腦顯示器來與應用程序之間發(fā)生交互和信息交換的,如果顯示器本身不能很好的還原數(shù)字化內(nèi)容本身的真實顏色,也不能準確顯示標準的顏色,那么這就意味著,只要你開始選擇一個顏色,就是錯誤的。然后接下來不管怎么樣都會是錯誤的。
這樣,我們就得明白一個問題,顯示器為什么會失真,我們?nèi)绾涡U?/p>
? ?拿CRT顯示器來說,顯示器的亮度變化是因為其輸入電壓發(fā)生變化,但是由于輸入電壓的變化函數(shù)和亮度的變化關(guān)系是不成正比的,這就存在了失真。
? ?說得通俗點就是,當顯示器要表現(xiàn)一數(shù)字化圖像內(nèi)容時,假如我們這時把這個內(nèi)容看成是一個線性連續(xù)量,這時顯示器的電壓變化就不能很好的表現(xiàn)這個連續(xù)量,就出現(xiàn)了失真。換句話說,我們可以這樣理解,顯示器在顯示那個數(shù)字化內(nèi)容時,做了一個不正確的校正,非常巧合的,這個校正的函數(shù)關(guān)系也是指數(shù)關(guān)系。工業(yè)上我們一般把顯示器的這種錯誤校正或者說失真度,用一個參數(shù)來衡量,那就是Gamma。
? ?如果我們把顯示設(shè)備要顯示的原始數(shù)據(jù)稱之為輸入(Input),把原始數(shù)據(jù)通過顯示設(shè)備后顯示出來的結(jié)果稱之為(Output),那么它們之間的關(guān)系實際就是:
Output=InputGamma
? ?不難發(fā)現(xiàn),這就是一個指數(shù)關(guān)系,而輸出的結(jié)果,實際上就是給輸入做了一個gamma值大小的指數(shù)級映射變化,Gamma,也就是衡量了這個指數(shù)變化的程度,當Gamma為1時,也就是Output=Input,因此,如果Gamma值為1就意味著不發(fā)生改變,或不校正,不失真,輸入和輸出相等,而Gamma值越大時,失真也就越大。
? ?事實上,不同的CRT顯示器其失真度都不相同,也就是Gamma值都不盡相同,但一般來說都是2.2-2.5這個范圍,假如一個顯示器的gamma值為2.5,這意味著什么呢,就是一個線性連續(xù)圖像在顯示時會被做一個gamma2.5的錯誤校正,或一個gamma2.5的失真,線性分布的圖像會變成指數(shù)分布的圖像,可見,顯示器的這種錯誤“校正”使得中性灰在指數(shù)關(guān)系下變黑了,總體的表現(xiàn)就是暗部增加,圖像整體變暗,暗部細節(jié)丟失。
? ?那么,知道了錯誤發(fā)生的癥結(jié),我們該如何校正這一錯誤呢?由于顯示器的Gamma是顯示器的固有特性,我們是無法改變的,所以,思路應該是這樣,既然顯示器做了一個gamma2.5的改變,而我們需要的是讓Gamma保持為1,這樣輸出結(jié)果就是無失真的,那么我們只要再顯示器輸出過程之前多做一次Gamma校正,讓最終的Gamma值為1就可以了。也就是:
Display_Gamma=CRT Gamma * 校正Gamma=1
以CRT Gamma為2.5為例,那就是要做一個Gamma0.4的校正,這樣
Display_Gamma=2.5*0.4=1
? ? 在計算機系統(tǒng)中,在顯示器之前做的這個Gamma校正事實上由顯卡完成,但問題在于,上述的例子是我們事先知道顯示器CRT_Gamma為2.5的情況下,我們用一個Gamma0.4來做校正,但顯卡并不知道我們的顯示器實際是什么Gamma值,更壞的情況是,也許做為用戶的我們,自己都不知道自己的顯示器CRT_Gamma為何值。
? ?操作系統(tǒng)怎么解決這個問題呢?它提供了一個LUT系統(tǒng)(Look UP Table),也就是查色表,當我們知道自己的顯示器的CRT_Gamma值后,告訴LUT,現(xiàn)在這臺顯示器的Gamma值為多少,LUT得知后,調(diào)用對應的Gamma校正函數(shù),用合適的Gamma值來控制顯卡輸出校正后的電頻信息給顯示器,所以,我們也把這個校正Gamma數(shù)值稱之為LUT_Gamma。又由于這是系統(tǒng)內(nèi)部做的校正,我們又稱它為系統(tǒng)Gamma(System_Gamma)。
? ?但問題還沒得到完全解決,那就是,如果我不知道自己的顯示器CRT_Gamma值呢?事實上,這才是問題的關(guān)鍵。
? ?當我們用一部數(shù)碼單反相機拍下一張自然風景照片,并且存儲為RAW格式的圖像文件時,問題還不是很大,因為RAW是浮點格式的高精度存儲格式,我們可以認為它近似線性連續(xù)地記錄下了我們的原始數(shù)據(jù),但一旦你將它轉(zhuǎn)換為一些非浮點低精度圖像格式,如JPG、BMP、TIFF等格式時,因為這些格式是以整數(shù)來記錄數(shù)據(jù)的,這樣就造成數(shù)據(jù)被離散化,不再那么連續(xù),導致失真。
? ? 并且,另一個問題是,線性的RAW文件格式中的數(shù)據(jù)被映射在0-255這樣的整數(shù)范圍時,是否也是線性分布呢?這可不一定,所以在這里引入一個新的概念,編碼Gamma,也就是Encode_Gamma,如果系統(tǒng)或軟件在寫入某文件格式時,將原有的線性數(shù)據(jù)也按線性映射在整數(shù)范圍內(nèi),那么它的Encode_Gamma就是1,即不改變,這時數(shù)據(jù)的失真僅僅是因為近似無限連續(xù)的線性數(shù)據(jù)變成了離散化的線性數(shù)據(jù)。如果寫入時將原有的線性數(shù)據(jù)按指數(shù)分布映射在整數(shù)范轉(zhuǎn)內(nèi)時,Encode_Gamma就不為1了,此時Encode_Gamma代表的就是這個指數(shù)。反應的就是數(shù)據(jù)存進文件后有了怎樣程度的失真。當然,有寫就有讀,既然有編碼Gamma自然就有解碼Gamma,也就是Decode_Gamma,當一個軟件打開并讀取一個圖像文件時,它是否對這個圖像數(shù)據(jù)做變換處理,這個度是好多,就由Decode_Gamma來決定,如果Decode_Gamma為1,就是不改變,不校正,如果不為1,就表示要改變或校正,它的數(shù)值決定了做多大程度和什么樣的改變。
? ? 絕大多數(shù)情況下Encode_Gamma和Decode_Gamma都是為1的,比如,默認的操作系統(tǒng)中IE瀏覽器的Decode_Gamma就為1,ACDsee看圖軟件在沒設(shè)置的默認情況下,Decode_Gamma也為1,所以用它們兩個去看一張標準的線性圖片是會有問題的,因為顯示器的CRT_Gamma是2.2-2.5左右,而默認情況下LUT_Gamma為1 ,所以我們實際看到的圖像的Gamma也就是CRT_Gamma,是非線性的,這就發(fā)生了錯誤。
? ? ?而如果你用Adobe photoshop去打開這張圖片往往和那兩個軟件中看到的不一樣,并且結(jié)果是對的,因為Adobe photoshop默認是進行色彩管理的,就是在軟件使用過程中調(diào)用了LUT查色表并讓LUT_Gamma不為1,所以這時就做了對的校正處理。 事實上,我們不難在應用軟件中發(fā)現(xiàn)Encode_Gamma和Decode_Gamma 的應用身影,比如在MAX的優(yōu)先設(shè)置面板中,在GAMMA子選項里,有這么一組參數(shù)。
? ? 這個里面的InputGamma呢,指的是當MAX調(diào)入任何一張圖片格式時,做什么樣的Gamma校正,這個操作顯然是讀操作,假如InputGamma為2.2,那么當MAX調(diào)入一張貼圖時,這個貼圖就會在調(diào)入內(nèi)存時被事先校正,MAX通過把InputGamma,也就是2.2這個值告訴LUT查色表,查色表接著告訴MAX應該對貼圖進行了一個Decode_Gamma為0.4545的校正,這里是很容易產(chǎn)生混淆的一個概念,很多人會以為InputGamma取值為2.2時,是MAX對文件調(diào)入內(nèi)存之前做Gamma2.2的校正,這是錯誤的,當InputGamma取值為1時,LUT查色表告訴MAX需要對其做Decode_Gamma為1的校正,也就是不校正,不發(fā)生改變。反過來,再去理解OutputGamma就和上面的情況類似了,只不過它的校正發(fā)生在即將寫入文件數(shù)據(jù)之前,是寫入操作時發(fā)生的校正,并且通過將OutputGamma值傳遞給LUT告訴MAX該用什么樣的Encode_Gamma作校正。
這時,你可能要問,是不是總是應該保持Encode_Gamma和Decode_Gamma為1 呢,這樣反正就保持原樣了,豈不省事?這就要具體情況具體分析了。
如果你用單反數(shù)碼相機拍照存成了RAW文件,并轉(zhuǎn)換成諸如JPG、TIFF、BMP這樣的格式,這時,就會有一個問題,因為數(shù)碼相機感光器的特性,從相機里輸出的文件,比如RAW都是做過了一個Gamma0.45校正的,這時,往往在寫入文件時編碼就應該做一個 Encode_Gamma2.2的校正才能得到正確結(jié)果,或是在讀文件時做一個Decode_Gamma為2.2的校正才能正確顯示或使用這個圖像,所以不同的情況是不一樣的,如果圖像本身是從計算機內(nèi)部從無到有創(chuàng)建的,那么保持Encode_Gamma和Decode_Gamma為1是一個比較好的作法。
通常,我們把一個文件自身呈現(xiàn)的Gamma特性稱之為File_Gamma,如果文件由外界攝取自計算機,那么:
File_Gamma=Device_Gamma * Encode_Gamma
(其中,Device_Gamma是指設(shè)備的Gamma,如果是數(shù)碼單反,通常是0.45)
如果文件由計算機本身憑空創(chuàng)造,那么,就不存在設(shè)備,就有:
File_Gamma=Encode_Gamma
然而,為了保證整個工作流程的線性化,所以我們應時時保證文件自身的Gamma為1,也就是File_Gamma為1。
事實上,MAX在打開和存儲圖像文件時,都具備非常詳細的Gamma選項供用戶控制,其中
第一個選項Use image’s own gamma,就是使用文件自己的文件Gamma,不對其作任何改變的打開。
第二個選項Use system default gamma,就是說根據(jù)先前MAX優(yōu)先設(shè)置面版里的input或output里的Gamma值對文件Gamma相應進行Encode_Gamma或Decode_Gamma的校正。
第三個選項Override,是說用戶指定一個Gamma值,對這個圖像進行一次這個Override_Gamma值的校正,注意,這次就和上面講到的優(yōu)選設(shè)置面板里的OutputGamma和InputGamma情況不一樣,這次是直接做一個Override_Gamma取值的校正,你給2.2,就做Gamma2.2的校正,結(jié)果是圖像變暗,給0.45,就做Gamma0.45的校正,結(jié)果是圖像提亮,它是不會去查什么LUT查色表的,這就是實實在在做校正,要加以區(qū)別。
那么,通過這三個選項,我們就能很好地控制素材的文件Gamma,做到調(diào)進來的圖是否線性化,在線性工作流程下,有一個準則,如果圖像文件本身的文件Gamma不為1,那么我們就要通過設(shè)置這些參數(shù)來讓它調(diào)入后為1,如果圖像文件本身的文件Gamma已經(jīng)為1,那么我們可以選擇第一項來使用文件自己的Gamma設(shè)置就可以了,這樣,你的圖像至始至終都是在線性空間下工作的。這點在整個流程中也至關(guān)重要,因為校正是不可以多作的,校正多做了就是錯誤的結(jié)果。如果某張圖像文件由數(shù)碼相機拍攝并轉(zhuǎn)為JPG或其它整數(shù)結(jié)構(gòu)格式,這時,它的文件Gamma事實上不為1,前面我提到了,由于攝像機感光器特性,加上默認情況下軟件或系統(tǒng)的Encode_Gamma為1,所以文件Gamma就是Camera_Gamma也就是大約0.4545,那么當我們把這個文件調(diào)入到MAX里來做貼圖時,事實上該文件的數(shù)據(jù)就是非線性的,因為文件Gamma不為1嘛,我們要讓它變成 1,這里我們就可以使用第三個選項,將Override_Gamma設(shè)為2.2,這樣就對它做了一個Gamma2.2的校正,基本就線性化了。
那么,講到這里,我想Gamma的概念在我們的腦袋里應該有了不同的定義,在不同的階段不同的時候Gamma都有其特殊的意義,最后呢,我為這個小節(jié)做個總結(jié),列出一些我在文中提到過的概念:
Camera_Gamma 攝像機Gamma,因為攝像機感光器的特性,拍下來的圖像相當于會自動進行一次Gamma校正,其值一般約為0.4545
Encode_Gamma 編碼Gamma,在文件形成,數(shù)據(jù)寫入時,對數(shù)據(jù)變換分布所相當于造成的Gamma校正。
Decode_Gamma 解碼Gamma,在文件調(diào)用至內(nèi)存時,數(shù)據(jù)按新的分布方式讀出所相當于造成的Gamma校正。
LUT_Gamma 系統(tǒng)Gamma或查色表校正Gamma,作用于顯卡層面的幀緩沖,對其進行Gamma校正以適應設(shè)備輸出。
CRT_Gamma 顯示器自身電壓特性相當于造成的Gamma校正。不可修正,一般為2.2或2.5。
根據(jù)以上概念為基礎(chǔ),我們還加入一些附加概念:
File_Gamma 圖像文件相對于要反應的原始數(shù)據(jù)的Gamma特性,是文件自身的Gamma特性,表征了數(shù)據(jù)在存儲為文件后的改動特性。
如果文件來源于外部設(shè)備如攝像機,
File_Gamma=Camera_Gamma * Encode_Gamma
如果文件來源于計算機內(nèi)部創(chuàng)作
File_Gamma=Encode_Gamma
特殊地,如果文件在寫入之前有軟件功能上的人為Gamma校正,如Vray幀緩沖的Gamma曲線調(diào)節(jié),那么
File_Gamma=Calibration_Gamma * Encode_Gamma(其中Calibration是校正的意思)
Display_Gamma 顯示輸出Gamma,表征顯示設(shè)備最終顯示的結(jié)果相對于要顯示數(shù)據(jù)的改變特性
以CRT顯示器為例:Display_Gamma=LUT_Gamma * CRT_Gamma
View_Gamma 全局Gamma,是所有Gamma校正和變換結(jié)果的總和,通常用來表征我們最后看到一幅圖像的樣子時它相對于原始是什么樣的改變特性,事實 上,在我們提及的線性化流程里,我們的目標,就是要讓View_Gamma為1,如果考慮到人眼自身還有一個Gamma特性的變換,我們也可以讓View_Gamma最后為1.5。
而View_Gamma=File_Gamma * Display_Gamma
所以我們的線性工作流程,實際上包括兩個方面的工作:
第一、 保證每一個用到的文件,其File_Gamma是1
第二、 我們在操作軟件之前通過顯示設(shè)備所看到的圖像,本身應該是線性的,即Display_Gamma為1 只要保證了這兩點,我們的線性工作流就是成功,和高效的。
第四節(jié) MAX中的線性工作流程
之所以這一節(jié)的標題命名為MAX中的線性工作流程,是因為僅僅在MAX中實現(xiàn)線性工作環(huán)境這只是一個局部的概念,一個小概念,真正廣義的線性工作流程可能要涉及CG制作的全環(huán)節(jié),包括我前面講的從外界引入素材,但是在本節(jié),我們僅僅討論MAX的情況:
從第三節(jié)的總結(jié)中,我們已經(jīng)知道了,我們需要保證Display_Gamma和File_Gamma在MAX這個環(huán)節(jié)都要為1,F(xiàn)ile_Gamma保持為1我在第三節(jié)中基本已做了較詳細的講述,這里就省去不談了,主要看看Display_Gamma,由于操作系統(tǒng)在默認情況下,對GUI應用程序界面是不做校正的,任由顯示器CRT_Gamma輸出,這就導致Display_Gamma不為1,我們可以在MAX中設(shè)置,讓顯卡對MAX中的應用程序界面進行LUT_Gamma校正,這樣就能保證我們在在顏色拾取面板和材質(zhì)面板中選擇正確的線性顏色,并且保證正確的中性灰,來看下圖:
[轉(zhuǎn)載]VR高級理論---LWF線性工作流(Linear <wbr><wbr>Work <wbr><wbr>Flow <wbr><wbr>)
如圖所示,打開MAX優(yōu)先設(shè)置面板中的Gamma子頁,勾選使用LUT_Gamma,這里,你可以看到一個Gamma參數(shù),這個參數(shù)不是告訴MAX要做多少的Gamma校正,而是告訴MAX,你的顯示器的CRT_Gamma值,如果你的顯示器Gamma值為2.2,你就輸入2.2,為2.5你就輸入2.5,這個值最終將告訴LUT查色表來用什么LUT_Gamma來做校正,如果你不確定,或認為自己的顯示器沒校準得非常好,不用擔心,MAX提供了一個簡單的校準器,如圖中的外框和內(nèi)框兩個灰色區(qū)域,你可以邊調(diào)節(jié)Gamma數(shù)值,回車確定后瞇著眼觀察內(nèi)框灰度和外框是否容合到一起,如果基本能容在一起,那就可以了。接著,非常重要的一步是勾選Affect Color Selectors和Affect Material Editor,這樣,LUT_Gamma校正將作用于MAX的拾色器等有幀緩沖的界面,這樣你對顏色的選擇就比較準確了,然后呢,保持input gamma和output gamma都為1,因為即便我們想對文件的寫入讀出進行Gamma調(diào)整,也可以在寫入和打開時單獨用選項控制,不必動用這里的宏觀控制。
設(shè)置完成后,基本就完成了MAX里的線性工作環(huán)境設(shè)置,但此時要注意,如果你使用MAX自己的幀緩沖渲染輸出,那么就不應該再對其進行任何Gamma校正,因為在優(yōu)先設(shè)置面板里你已經(jīng)開啟了LUT_Gamma校正,它對MAX的幀緩沖是起作用的,渲染出來的圖是線性的,是校正后的。如果你使用VR的幀緩沖,因為MAX優(yōu)先設(shè)置面板里的LUT_gamma校正對VR的幀緩沖不起作用,所以渲染出的結(jié)果,是直接未校正就顯示在顯示器上的,是不準確的,這時你就需要通過VR的Gamma校正功能來校正。
? ? ?其實這里之所以要在使用VR的幀緩沖情況下單獨再用VR的Gamma校正,是因為MAX的設(shè)置對VR是不起作用的,所以對于LUT_Gamma校正我們要多做一次,僅此而已。并且, VR的Gamma校正里的Gamma值和MAX優(yōu)先設(shè)置里的Gamma值意義是一樣的,所以為保持一至,因為都是指顯示器CRT_Gamma值嘛,所以這兩個值應該是一樣的。
但是,以上的設(shè)置僅僅是解決了渲染結(jié)果顯示問題,即這些只能做到你渲染的結(jié)果是LWF的,但當你保存為文件時,還是沒有進行Gamma管理,所以我們應該在文件輸出時,指定和顯示輸出同樣的gamma校正,這非常簡單,一種是你可以在保存文件時在設(shè)置里用overrideGamma來決定存盤時的gamma值,比較簡單的方法是設(shè)定全局優(yōu)先面板里的outputgamma就可以了.數(shù)值和設(shè)定顯示的一樣.
那么,基本上,按照上述思路和要注意的地方完成設(shè)置后,在MAX里就能完全在線性空間下工作了??偨Y(jié)一下就是: 1. 將CRT顯示器利用相關(guān)工具盡可能校正準確,使亮度分布正確,并測出顯示器Gamma值。 2. 始終導入文件Gamma為1的線性圖像作為素材,如果不為1,應該在打開時調(diào)整Gamma校正使其為1。其實我們可以干脆把所有引入的貼圖看成線性的.不需要做什么改動
3. 在MAX的Gamma設(shè)置中開啟LUT_gamma校正,并填入顯示器Gamma參數(shù),保持影響拾色器和材質(zhì)編輯器兩個選項為勾選狀態(tài)。 4. 顯示方面,如果使用MAX自己的幀緩沖不需也不要做任何其它校正,看到的結(jié)果就是LWF的
5. 顯示方面,如果使用VR的幀緩沖則需要單獨用VR色彩映射管理里的Gamma校正再多做一次LUT_gamma校正,其值設(shè)置同MAX里設(shè)置一樣。
6. 輸出方面,將系統(tǒng)優(yōu)先面板里的gamma設(shè)置中的outputgamma設(shè)為顯示校正同樣的數(shù)值即可,這樣保存的文件也是LWF的
當然,以上是CRT顯示器的情況,如果你使用的是液晶顯示器,由于液晶顯示器的固有Gamma為1.0 那么情況會變得更簡單一些:
1. 禁用MAX里的LUT_gamma校正
2. 始終導入文件Gamma為1的線性圖像作為素材,如果不為1,應該在打開時調(diào)整Gamma校正使其為1。
3. 渲染結(jié)果始終不進行校正
最后需要說明一點的是,如果在LWF模式下渲染出來的圖,導入photoshop進行處理時,應該禁用photoshop的gamma校準,比如AdobeGammaloader,因為此時的文件結(jié)果已經(jīng)是根據(jù)顯示器校準過的了,導入時不應該再進行一次校準。