【水科普】為什么光線追蹤未去噪的圖象很暗
最近在玩?Taichi 圖形編程,不得不說很好用,十分簡潔方便,我在以后就基本上都用 Taichi 語言來展示代碼了。
首先再次 review 噪點(diǎn)是怎么來的:
現(xiàn)在的光線追蹤(路徑跟蹤)是隨機(jī)采樣的,并且對于實(shí)時渲染來講,一幀往往只能發(fā)射 1 條光線去采樣。所以原始圖像信號是不連續(xù)的,由多個離散的采樣點(diǎn)組成。如圖,綠色的點(diǎn)代表著采樣點(diǎn)(中):

然而我們想要的信號是連續(xù)的(左),直接呈現(xiàn)這些離散的信號會導(dǎo)致最終結(jié)果(顯示的圖像)失真,所以我們需要進(jìn)行信號重建(reconstruction)(右)。右圖展示了一個線性插值的重建。
在光追中,重建的具體應(yīng)用就是大名鼎鼎的降噪(denoise)了。不過玩一些游戲可以關(guān)閉降噪,你會發(fā)現(xiàn)相比于降噪的完結(jié)果,未降噪的明顯暗很多。難道降噪打破了能量守恒嗎?那光追的意義是什么呢?


我們知道現(xiàn)在的光線追蹤具體是用路徑跟蹤來實(shí)現(xiàn)的,從攝像機(jī)視角發(fā)射光線并且追蹤到光源,對每個具體著色點(diǎn)求解渲染方程來計(jì)算顏色,邏輯上是很簡單的一件事。

在程序上,總體就是分這三步:
而我們要討論的問題就是為什么結(jié)果比較暗,這是關(guān)于顏色的問題。所以我們看向著色(def 著色(ray: Ray) -> Ray)部分。
這就是著色程序了,非常清晰明了:
你看,著色階段分為了兩種情況,也就是光線命中和未命中。未命中是怎么回事呢?
對了。我們一開始就提到了采樣的問題,我們做的是隨機(jī)采樣,有的光線不能命中到著色點(diǎn)。
所以我們定義一個未命中的情況:
看代碼,我們定義顏色為?,而在 RGB 顏色空間中:

是黑色。所以未命中的著色點(diǎn)我們就在程序中讓它顯示成黑色的。

當(dāng)然如果你閑的蛋疼,也可以改成? 讓它變成白色的。是不是這樣看上去就不暗了。

所以未命中點(diǎn)的顏色是程序固定設(shè)置的,而不是著色方程讓它變成黑色。最重要的是它本質(zhì)上沒有違背能量守恒,只是視覺上看起來比正確圖像暗而已。