渲染中的數學知識

《全局光照技術》的眾籌過10萬了,按照約定我將贈送每名眾籌支持者一份學習路線圖以及總結我的一些學習方法,而學習路線圖的其中一項內容就是介紹圖形學中的一些數學知識,所以這裡先簡要做個概述。

《全局光照技術》正在摩點網眾籌

很顯然,數學是理解3D渲染演算法的重要基礎,那麼這是不是意味著你需要重新去複習整個大學工科數學的知識呢?實際上作為工程師,我們的目標只是要理解工業技術(而非背後的數學知識)的原理,這本也是工程技術和理論研究的區別。一門數學學科本身是需要去解決更一般的問題的,然而對於理解一種工程技術,如果你不需要去設計和改進演算法本身,你往往只需要了解它的(可能是非常簡化的)一部分或者說理解它的意義即可,當你對整個工程技術的架構比較熟悉之後,你可以從某個方面深入去學習,定製和甚至改進。

以下我從渲染方面做一些簡要分析以及歸類,列出一些大概需要掌握的相對比較重要的數學知識,並對每種知識做一個簡要概述,以及說明每個知識點用於解決渲染中什麼樣的問題。

蒙特卡洛方法

蒙特卡洛方法是整個離線渲染最核心的基礎,由於渲染方程是一個(理論上無限)高維積分,所以它不可能通過分析的方法求解。你需要深刻明白對一個概率密度函數進行抽樣,並用所得樣本來求解一個積分值的概念,我們稱作對積分的一個估計,不僅僅是渲染方程,渲染中的很多積分計算可能都需要使用蒙特卡洛方法進行計算;在這個過程中由於隨機數本身的方差屬性,因此估計值也具有方差,減少估計的方差是渲染當中的核心內容,你需要明白每個樣本參與估計的「貢獻值」的概念,貢獻值越小的樣本越容易產生較大的方差,使每個樣本的貢獻值儘可能大,這個概率密度函數與被積函數需要儘可能的相似,這又稱為重要性採樣;然而我們很難找到與被積函數相似的概率密度函數,但是很容易找到與被積函數的部分相似的概率密度函數,因此我們希望將多個重要性採樣組合起來,這就是複合重要性採樣,你要明白複合重要性採樣的核心是使來自每個重要性採樣的樣本的貢獻值儘可能相似。除了數學層面,你還需要理解雙向路徑採樣中頂點連接涉及的一個重要方面,那就是頂點連接不是一個隨機的過程,因此這個它使得連接起來的路徑具有獨一無二的組合概率密度函數,因此對於同一長度的路徑,在不同位置處進行連接是一種不同的採樣技術,因此當你產生一條完整路徑之後,實際上你(通過在不同位置處連接兩條子路徑)產生了多個採樣的結果,然後你使用複合重要性採樣對所有這些採樣技術進行組合。

傅里葉分析

傅里葉分析可能是僅次於蒙特卡洛方法的數學工具,它廣泛運用於過濾,平滑,以及數據壓縮等方面,它也是小波分析和球諧函數的重要基礎。如同一系列正交的坐標軸(如(0,0,1), (0,1,0), (1,0,0))構成一個矢量空間,然後該空間中的任何矢量都是這組正交基矢量的線性組合一樣,如果一系列的函數是相互正交的(即它們每兩個函數的乘積的積分值均為0,除非兩個函數相同,此時積分值為1),則這些函數構成一個函數空間,因此該函數空間的任意一個函數都可以表述為這些基函數的線性組合,傅里葉變換使用的正餘弦函數正是這樣的一組無限個數量的基函數,因此這就是為什麼任意函數都可以進行傅里葉變換,傅里葉變換的本質就是將一個函數轉換為所有這些無限個正餘弦函數的線性組合,這些線性組合的係數是由一個稱為投影的方法計算的,該方法的演算法就是通過求原始信號函數與某個基函數乘積的積分值,理論上我們記住這無數個線性組合的係數就可以重合合成為原始的信號函數,這個過程稱為重建。所有這些投影形成的係數形成一個連續的函數,它反映的是原始信號函數的頻率分布,如果你去掉該頻率分布中的某些區間,你就丟掉了原始信號對應的頻率部分,通常對於一個方差比較大的採樣結果,我們可以丟棄掉頻率高的部分,它們通常都是導致方差較大的罪魁禍首,因此函數的高頻部分需要更多的樣本,而由於計算資源限制我們通常都無法滿足這樣的條件。你會發現一個在頻率域對頻率分布進行帶限的函數,在原始的時間域或空間域變成了一個平滑函數,這也是通過對這個帶限函數本身進行傅里葉逆變換得到的,這就是過濾的思想。你還會發現在頻率域計算兩個函數的乘積變成了時間域或空間域對一個數組(例如所有像素組成的一個圖像)元素中的每個元素都執行一次過濾計算,這就是卷積的概念。

小波分析

函數空間的投影和重建的概念也是小波分析的基礎,小波函數是一類特殊的正交基函數,即低頻率的基函數構成的函數空間是高頻率基函數構成的函數空間的一個子集,這就使得高頻部分的基函數係數可以表述為與低頻部分基函數係數的差值,這種特性使得小波變換形成了一個多解析度的結構,你可以想像對於多級紋理(mipmap),低解析度的圖像是高解析度圖像中相鄰元素平滑過濾得到的,例如對於較遠的表面,使用低解析度的紋理就可以得到很好的近似,這種結構特性被天然使用到輻射度方法中,你會發現原來我們不需要對每兩個細分曲面進行光照傳輸的計算,因為有些較遠或者立體角較小的範圍,這部分可以使用低解析度的曲面細分網格結構,這稱為階層式曲面細分方法。

球諧函數

函數空間的投影和重建也是所謂球諧函數的基礎,球諧函數本質上就是將傅里葉變換使用的單位圓上的正餘弦函數擴展到單位球面上,這些基函數實際上就是將三維空間的勒讓德多項式進過縮放是之恰好位於球面上,由於單位球面坐標上的長度固定為1,因此球面坐標系退化為一個二維的單位球面坐標系,其兩個坐標值構成一個空間的方向,因此球諧函數的線性組合可以用來表述一個與位置無關的方向函數,而方向函數在渲染中太普遍了,例如環境貼圖就是一個與位置無關的方向函數,表面的反射方程也是一個方向函數,它根據一個入射方向分布計算出一個出射方向分布,因此球諧函數可以用來表述光照傳輸函數和環境貼圖光源,同樣去掉高頻的部分,使用少量的係數就可以近似一個方向函數的低頻部分,這就是預計算輻射度方法的數學基礎,此外球諧函數的一些特性,如旋轉不變性,卷積,內積等,這些也是輻射照度緩存演算法的基礎。

幾何光學

除了光滑平面上的反射/折射定理,光學部分最重要的內容是關於微觀表面的光照傳輸。在數字場景表述中,我們可以使用紋理貼圖來表述一個表面的屬性,例如BRDF雙向反射函數,折射率等,然而要知道實際物體的微觀表面結構的尺寸是非常小的,它甚至比一個像素的尺寸還要小得多,這個時候用貼圖是沒有辦法描述的。然而我們可以使用一個像素的表面「展開」成一個分布函數,注意,原始紋理像素表述中,每個像素只產生一個確定的值,入射對於一個固定的入射方向,始終會反射到一個固定的出射方向,但是現在對於一個像素,相同的入射方向可以根據概率被反射到不同的出射方向,其中每一個不同的交互結果模擬了一個微觀粒子(可理解為一個微觀平面)的行為,這就使得光照傳輸可以在像素級別處理微觀粒子結構的交互,這就是著名的微面元理論,不同的微面元的方法就是建立不同的分布函數模型,它們主要是建立一個這些微觀粒子的法線分布,同時還有建立這些粒子形成的不平整曲面見的遮擋等關係,最終將菲涅爾函數融入到分布函數中,形成了最終的微面元雙向分布函數。

梅特波利斯演算法

如果採樣使用的概率密度函數與被積函數不相似,那麼樣本的貢獻值就不是一個常數,這意味著某些樣本更重要或者更不重要,這就是使得估計的方差比較大,我們需要調整概率密度函數。如果採樣使用的概率密度函數完全正比於被積函數,則樣本的貢獻值為一個常數,估計的方差為0,並且這意味著每個樣本的計算都不需要計算貢獻值,我們只需要數每個區間樣本的數量就可以得出被積函數(即最終圖像)的分布。梅特波利斯演算法正是通過一種取捨的機制使得採樣的概率密度函數正比於被積函數。其原理來源於馬爾可夫鏈,馬爾可夫鏈是一種在穩定狀態下,系統之間各個狀態之間轉移概率的分布,梅特波利斯演算法將整個被積函數的分布當做一個馬爾可夫鏈,然後通過定義一個狀態之間的轉移概率分布使整個狀態之間的分布相似於被積函數。由於梅特波利斯演算法能夠產生完全相似於被積函數的樣本,因此可以很輕易地找到一些特別困難的路徑,是離線渲染當中一種非常重要的採樣方法。

模擬退火/總體蒙特卡洛方法

傳統的梅特波利斯演算法並沒有說明樣本的產生方法,在光線追蹤中一般是使用傳統的如雙向路徑追蹤來產生一個樣本路徑,然而對於同一路徑,雙向路徑追蹤可以使用多種採樣技術採樣而得,得到一條貢獻值較大的路徑的概率取決於其使用的採樣技術,在原始的MLT或PSSMLT演算法中,每種採樣路徑是隨機選擇的,然而除了可以對路徑的幾何信息(如位置)進行突變外,採樣技術之間也是可以突變的,因為對於一些特定的幾何場景,一些採樣技術會優於另一些採樣技術。在蒙特卡洛方法中,有一類方法可以將原始的單個馬爾可夫鏈按照某種度量進行區分,注意這種區分並不是空間上的劃分,而是每種區分本身都是一個獨立的馬爾可夫鏈,只是遵循不同的轉移概率分布,這種方法稱為總體蒙特卡洛方法,其中一個具體演算法是所謂模擬退火的思路,想像一下一個物體由高溫逐漸冷卻的過程,在其中的每一個溫度下,粒子之間都是出於一種平衡狀態的,然而在不同溫度下物質之間的轉移概率分布是不一樣的,這種思路使我們可以通過尋找一種影響狀態轉移的因素,並將該因素對應的狀態轉移定義為一個子平衡系統,通過在這些子系統之間跳躍,我們可以尋找到最快的遍歷全部狀態的方式。顯然路徑的不同的採樣技術就是一個這樣的因素,每種採樣技術都可以產生一個獨立的平衡系統,但是對於某些路徑,另一些採樣技術可能是更有效的,通過在路徑之間的跳躍,我們可以尋找最快收斂的方法。這些思路在近幾年的MMLT和RJMCMC演算法中有著重要運用(參見:https://zhuanlan.zhihu.com/p/28345852)。

微分幾何/流形

傳統的路徑的採樣都是完全隨機的,例如無論是基於蒙特卡洛方法的單/雙向路徑追蹤,還是基於馬爾可夫鏈蒙特卡洛方法的梅特波利斯光照傳輸等,本質上都是使用ray tracing的方式從每個頂點的BRDF函數對方向進行隨機採樣以形成一條路徑,這些方法都是基於對場景的幾何信息是未知的。如果我們能夠結合場景的幾何信息,那麼能否更有效地產生一條路徑呢?這就是近幾年非常重要的流形探索演算法的核心思路。流形是指一個用一個隱函數描述的幾何體,它是歐幾里得空間的一個部分,它的整個幾何體是通過局部的關係描述的,而不是像歐幾里得空間其用全局的位置等信息描述,這種局部特徵使得我們可以很好地探索場景的幾何信息。由於反射定理和折射定理也是基於局部的定理,結合這些局部幾何信息(往往是指能夠獲得幾何體局部位置的變化,如導數等),我們可以得出光照傳輸的局部微分信息,而根據牛頓方法,如果已知幾何體各個位置處的微分信息,則我們可以通過一系列連續迭代的過程尋找到一個給定函數的根的近似值,這用在流形中即是我們能夠通過確定性的方法「找出」一條相似路徑,這就是流形探索的核心思路,它用於梅特波利斯演算法中高效地尋找相似路徑。

有限元方法

如果光照的分布函數具有較低的頻率,例如對於由漫反射表面構成的場景,我們可以將被積函數進行比較低解析度的劃分,然後對每個較大的區間使用一個值進行近似,這種方法就是有限元方法,在渲染中稱為輻射度方法,在該方法中,場景被劃分為一些曲面片,然後通過預計算出這些曲面片之間近似的光照傳輸,以形成一個傳輸矩陣,那麼對於任意給定光照,我們便可以通過該矩陣的線性變換計算這些光照的傳輸結果。

迭代法

在輻射度方法中,我們通過預計算得到一個光照傳輸矩陣,它可以將任意一個給定的光源分布進行線性變換得到最終的光照結果。對於線性方程組的求解,數學上常用的方法是高斯消元法,它們通過對方程組的係數構成的矩陣執行一系列行交換操作將其轉換為一個上三角矩陣(upper triangular matrix)進行求解。然而這樣精確求解的方法在數字計算機中運用時卻會遭遇被稱為取整誤差帶來的問題。 在數字計算中,一個實數被保存為浮點數的形式 ,計算機中存儲尾數的數字位是有限的,如果有 n 個數字位供存儲,那麼超 出 n 的部分則按四捨五入法進行取整,取整後被存儲進計算機的值稱為存儲值, 上述的高斯消元法是由一系列操作組成的,對於每一次操作計算,它都需要將結果寫回到內存中供後續的計算使用,每次存儲都可能出現這種取整誤差,隨著整個消元法的進行,這些誤差被傳播並累計下去,導致最終結果出現比較大的誤差,輻射度方法中矩陣的維度更是可能上萬,這種誤差是不可能忽略的。 高斯消元法計算的是一個直接的結果,它沒有提供一種修正的機制,對於這樣的誤差,我們希望能夠有一種修正的機制用於通過一個迭代過程將誤差逼近至某個可接受的範圍。所以在計算機中,我們通常使用迭代法來求解線性方程組,例如前面介紹的牛頓迭代法,它每次計算的可能不是一個直接準確的結 果,但是它提供一種機制使可以逐漸收斂到正確結果,在這個收斂過程中,我們就有機會將最終結果限定在一個可接受的誤差範圍。 常見的迭代法如雅可比方法,高斯-賽德爾方法等。此外,你還可以對傳輸矩陣執行分解以得出一個全局的傳輸操作符。

概率密度估計

在回歸分析中,對於給定的一些數據抽樣值,我們可以根據這些樣本擬合出一個真實函數出來,例如核估計通過對周圍一定鄰域範圍內的樣本求加權平均來計算某個位置的真實值,與此類似,核密度估計方法則是要根據一些(往往具有相同值)的樣本擬合出一個概率密度函數,因此我們可以首先將光子根據光照傳輸隨機分布到場景表面上形成一個光子圖,然後通過對這些光子執行概率密度估計來計算出它的光照分布,然後再從攝像機收集這些光照來計算最終看到的圖像的分布,這就是光子映射的基本思路。和回歸的思路類似,概率密度估計通過對周圍的樣本進行平滑來擬合概率密度分布,這個平滑的過程導致了偏差,但是卻減小了估計方差,更重要的是,將一條路徑的頂點與該頂點附近的光子進行「合併」以產生一條全路徑,這相比於前面介紹的雙向路徑追蹤的頂點「連接」,它大大提升了漫反射頂點與光澤路徑的連接效率,使得其成為渲染如焦散效果的最有效的方法,如今,基於概率密度估計的光子映射方法也幾乎是離線渲染器的標配。

【上述以及更多渲染相關數學知識以後在本專欄會以系列的形式更詳細介紹】

上述所有這些數學方法都會在《全局光照技術》中詳細討論,並且是以比較容易理解的方式討論,我的目標是甚至不需要你專門去查詢和複習相關數學概念,就可以理解它們的基本意義以及在渲染中的運用。

《全局光照技術》正在摩點網眾籌預購,該書歷時三年創作,為了更好的理解這些數學概念及思路,以便為了更好的學習圖形學,建議您夠買一本《全局光照技術》,這也是對我寫作的一種鼓勵和支持,感謝!

預購地址:《全局光照技術》出版在即!揭秘工業中最前沿的渲染技術-發現項目-摩點會想


推薦閱讀:

物理、數學和計算機科學中很多次用到的術語「正則」是什麼意思?它是怎樣被翻譯過來的?
如何在生存galgame《神様のゲーム -監禁された6人の男女》中全員存活?
numpy.linalg.lstsq這個是什麼意思啊?
關於量子力學(二)

TAG:计算机图形学 | 游戏开发 | 数学 |