之前在查詢Physically Based Rendering(PBR)資料的時候偶爾翻到了幾篇關(guān)于光和顏色的博客零如,才知道原來在我寫的shader里一直在用的RGB值的由來,也去閱讀了Real Time Rendering(4th Edition)第八章的相關(guān)內(nèi)容,所以這篇算是一個讀書筆記吧有鹿。
-
Radiometry(光能測量學(xué))
顧名思義,這門學(xué)問是測量電磁輻射的寄狼。在這里我并不是要來解釋這門學(xué)問或者將原文這段翻譯一下查乒,而是要記錄下這段的兩個要點(diǎn)弥喉。
第一,人眼的可見光波長范圍在[400nm,700nm]
第二玛迄,光度學(xué)所測量的四個重要方面:radiant flux由境,irradiance,radiant intensity以及radiance
首先來看第一個輻射功率(radiant flux)蓖议。我們知道虏杰,光都是攜帶能量的。我們把一束光在我們感知到的一瞬間(1幀)所發(fā)出的能量記為radiant flux勒虾。一束光中包含了多個光波纺阔,每個光波波長不一,波長越長則radiant flux越小修然。
irradiance笛钝,中文為輻照度,這個量是關(guān)于感受器(比如說視網(wǎng)膜)的愕宋。由于radiant flux無法直接度量感受玻靡,想象下一個燈泡在極短的時間內(nèi)向四周發(fā)射光線,不能說誰的視網(wǎng)膜面積大所以感受到的光強(qiáng)吧中贝?所以我們用irradiance來度量囤捻,指單位面積接受到多少radiant flux。對于點(diǎn)光源來說邻寿,蝎土,球的面積是。
第三個radiant intensity绣否,與irradiance用來衡量光能接收器相對的誊涯,是衡量光能發(fā)出器的一個東西。由于光子從發(fā)光源發(fā)射之后蒜撮,隨著距離的增加光子分布的越稀疏暴构,在不同距離的irradiance也是不同的,所以拿irradiance來度量并不是一個好的選擇淀弹。radiant flux可以用來作為衡量的一個標(biāo)準(zhǔn)丹壕,但更常用的方式是以發(fā)射源作為球心,測量單位球面度上的光子的總能量薇溃,這個量用intensity(強(qiáng)度)來表述菌赖,。為什么要除以呢沐序?首先要明白什么是球面度琉用,角度是二維圓弧上對應(yīng)的角度堕绩,那么球面度就是三維球上一個弧面對應(yīng)的球心角度,整個圓的角度為邑时,整個圓弧長為奴紧,那么整個球面度為,球面積為晶丘。在游戲引擎中黍氮,通常用intensity來衡量光源的強(qiáng)度,而且intensity和irradiance可以相互轉(zhuǎn)化浅浮,沫浆,如果即在單位球上,他們倆相等滚秩。
radiance专执,輻射率,是用于成像的接收器的度量郁油。上文提到的irradiance在視網(wǎng)膜或者攝像機(jī)成像中本股,是不能成像的。理論上視網(wǎng)膜的一個細(xì)胞會接受來自場景每個點(diǎn)的光能反射桐腌,這些irradiance互相相加平均才產(chǎn)生模糊的像拄显。人眼是個小孔成像系統(tǒng),其機(jī)制是選出一小束光使其通過小孔哩掺,射到接收器上凿叠。之后就可以用radiance來度量涩笤,其表述的是總的光能radiant flux在極小球面度和極小球面積上的值嚼吞,那么
w是球面角,area是光線與表面接觸的球面積蹬碧,是要算與光線垂直截面的面積舱禽。
我們一般用L來代表radiance,它由5個變量所決定(或者6個恩沽,包括波長)誊稚,寫成函數(shù)即。p為光線的起點(diǎn)罗心,d是方向里伯。在渲染方程里,經(jīng)常出現(xiàn)或者渤闷,代表從點(diǎn)x處發(fā)出或射入點(diǎn)x處的光線疾瓮,d為光線的方向,經(jīng)常是從x處向外指飒箭,是為了計(jì)算比如說點(diǎn)積的方便狼电。有了L蜒灰,我們就可以描述渲染要解決的數(shù)學(xué)問題了。我們將屏幕當(dāng)做一個小孔成像系統(tǒng)肩碟,追蹤在場景中穿過其的每條光線并對其積分强窖,即為像素獲得的能量,也就是pixel shader(fragment shader)的最終輸出削祈,由于的單位是翅溺,所以這個積分要在每個球面角和每個球面積上進(jìn)行。
-
Photometry(光度學(xué))
以上是光的能量的測量問題髓抑,但我們?nèi)搜鄹惺艿降墓夂鸵陨纤鲇钟胁煌次祝瑖H照明組織(CIE)給出了一條曲線,叫photometric curve启昧,乘上這條曲線叙凡,可以將Radiometry轉(zhuǎn)成Photometry。
那么上面所說的四個量也就能轉(zhuǎn)成人眼所能感受的量了密末。
我們通常用Luminance表達(dá)亮度握爷,HDR電視屏幕的峰值亮度為500-100尼特(nit),干凈明亮的天空為8000尼特严里,一只60w的電燈泡為120000尼特新啼,太陽為600000尼特。
-
Colorimetry(色度學(xué))
人眼中有三種感受光的視桿細(xì)胞刹碾,每種細(xì)胞會對不同波長的光產(chǎn)生不同的反應(yīng)燥撞,但傳到大腦中的信號只有三種,而可見光有七種顏色即七種波長迷帜,那么到底傳到大腦中的是哪三種特定波長即顏色的信號呢物舒?國際照明組織(CIE)做了實(shí)驗(yàn),用人肉的方式得出了結(jié)論戏锹,即我們現(xiàn)在所熟知的RGB三原色冠胯。
這三種顏色的疊加造成了我們能看到超過千萬種不同的顏色。然而锦针,這種人肉實(shí)驗(yàn)得出的曲線在某些范圍內(nèi)有負(fù)值荠察,顯然,在這種狀態(tài)下我們不能用rgb來表達(dá)某些顏色了奈搜。所以悉盆,rgb不能表達(dá)所有的顏色,只是對顏色的降維表達(dá)馋吗,真正要表達(dá)顏色還是需要用光譜焕盟。
那么,好不容易找到了三原色不可能因?yàn)檫@就拋棄不用吧耗美?事實(shí)上京髓,CIE通過一系列的操作航缀,提出了另一種rgb的曲線
雖然在現(xiàn)實(shí)中不存在這樣的曲線圖,但卻能表達(dá)人類所能看見的所有顏色了堰怨。將rgb作為xyz的空間坐標(biāo)芥玉,即能得到顏色空間的圖
然后將這三維空間投影到x+y+z=1的二維平面(因?yàn)閦可以通過1-x-y獲得),則得到了一個馬蹄形的色域圖
我們?nèi)搜鬯芤姷念伾荚谶@張圖里备图,那個在白色三角形內(nèi)的顏色代表sRGB這種顏色標(biāo)準(zhǔn)所能表達(dá)的全部顏色灿巧,黑點(diǎn)是白點(diǎn),是純白色的所在揽涮。我們現(xiàn)在很多設(shè)備的顯示都是遵循sRGB這種顏色標(biāo)準(zhǔn)的抠藕,所以,當(dāng)你盯著屏幕的時候蒋困,其實(shí)你能看到的顏色比現(xiàn)實(shí)中少很多盾似。當(dāng)然有許多其他的顏色標(biāo)準(zhǔn),可以把這個三角形區(qū)域擴(kuò)大很多雪标,但依然有許多顏色不能被物理設(shè)備所展現(xiàn)零院,畢竟rgb是低維的表達(dá),而不是光譜村刨。
那么告抄,radiometry是在表述光的能量,photometry在表述人眼所能辨別的光能嵌牺,colorimetry在表述人眼所見的顏色打洼,他們之間有什么關(guān)系呢?其實(shí)逆粹,光能強(qiáng)不強(qiáng)和人眼所見的光能強(qiáng)不強(qiáng)是兩回事募疮,而人眼所見的光強(qiáng)不強(qiáng)和反饋在rgb這三個量上的數(shù)值又是兩回事,落實(shí)到游戲領(lǐng)域枯饿,我們渲染的最終結(jié)果還是基于人的感知空間的色度作為度量來進(jìn)行光照計(jì)算酝锅。
-
Scene to Screen(場景到屏幕)
前面經(jīng)過光照計(jì)算所得的顏色代表了我們所感知的場景的顏色诡必,然而把它輸出給屏幕奢方,在屏幕上顯示的顏色是否是我們感知的顏色呢?答案是否定的爸舒。首先蟋字,人眼有自適性,場景的亮和暗會對物體的顏色產(chǎn)生影響扭勉,并且鹊奖,物體在不同顏色的環(huán)境中,人眼也會看到不同的顏色涂炎。如圖忠聚,你感受到的顏色一樣么设哗?
其次,所有的物理設(shè)備顯示的顏色范圍是有限的两蟀,場景的顏色范圍遠(yuǎn)遠(yuǎn)大于物理設(shè)備所能顯示的顏色數(shù)量网梢,所以我們需要一些技術(shù),比如HDR赂毯,把物理設(shè)備顯示的顏色范圍提高一些战虏,或者,把較寬的顏色范圍對應(yīng)到一個較窄的范圍內(nèi)党涕。
基于這些不同烦感,toon mapping應(yīng)運(yùn)而生。這種技術(shù)把真實(shí)場景中的顏色轉(zhuǎn)成人眼感知的顏色膛堤,以達(dá)到在屏幕上顯示的顏色在被人看到后能夠讓人還原當(dāng)時的場景手趣,而不會讓人感覺場景很假。
PS. 這是今年的最后一篇博客了肥荔,看了下電腦上的便簽回懦,還有8個主題想要寫成博客(也許會增加),希望能在明年第一季度寫完次企!
參考
RTR4 拾遺(一)-- 圖形學(xué)的B面
顏色 /About Color --圖形學(xué)的B面(二)
PBR--RTR4筆記--第八章 光與顏色