跟着閆令琪老師的課程學習,總結自己學習到的知識點
光線追蹤
為什么要光線追蹤
soft shadow
soft shadow相較於hard shadow,其邊緣較為模糊。但是我們並不能通過模糊(blur)陰影邊界來模擬soft shadow。如下圖所示,正確的soft shadow,或者說,符合常理的soft shadow應該表現為,距離投影物體更近的區域,陰影會表現的更清晰。

原因
1. 前面已經學習過光柵化,針對全局光照,我們可以了解到光柵化無法實現或者實現的方法較困難,尤其是有很多的光線共同作用時.

2. 光柵化成像速度很快,但是畫質效果不好.光線追蹤成像速度慢,但是畫質很好
下圖1是光柵化,圖二是光線追蹤


基本的光線追蹤算法(The Basic Ray-Tracing Algorithm)
算法前提:
1. 光線是直線傳播
2. 不考慮光的波動性
3. 光路互逆性:當你凝視深淵時,深淵也在凝視你.
算法概述
1.Ray Casting
這種算法第一步的簡述流程:
1. 視點與每個像素都發射一條光線(射線),射線照射到最近的交點.

2. 連接交點與光源,判斷是否有物體在中間可以知道該交點是否時在陰影中,進行光照模型的計算

2.Recursive (Whitted-Style) Ray Tracing
第一步僅僅實現了光柵化的過程,想要考慮全局光照,就要對全局進行分析.那么第一個交點就會發生光的反射和折射.反射光線與其他物體再相交,也會發生反射和折射現象.交點與光源的連線可以用來檢測陰影.

所以每一個交點的顏色來自於直接光照,反射方向間接光照,折現方向的間接光照.
最終實現的效果 :

線與面的交點
線與面的隱式表示
線的隱式表示

面的隱式表示

光線與面相交
1. 方法一: 等式相等求交點

1. 方法二: Möller Trumbore Algorithm
Möller Trumbore Algorithm算法主要是利用重心坐標求解, 具體的實現原理可以算法專欄Möller Trumbore Algorithm

數學原理我們已經知道了,但是具體應用時,如果只是簡單的計算模型的每個三角形面與光線是否相交,這樣計算的次數有:
太費時,所以通常情況下,我們通常將所有的三角形用box包圍其來,這樣,我們可以用計算光線與box是否相交,如果光線與box沒有交點,那么光線肯定也不會與box內的三角形面相交。如果光線與box有交點,那么再計算光線與box內的三角形是否相交,這樣可以節省很多計算量。
基於上面表述,有兩個主要的問題:
1. 怎樣判斷盒子與光線相交
2. 怎么划分盒子,計算量最小(加速結構)
光線與盒子相交
Axis-Aligned Bounding Box(AABB) 軸對齊包圍盒
我們可以這樣理解光線:光線是一條射線。也可以這樣理解一個盒子:盒子是三對平面相交形成的。基於此,AABB盒子就很容易理解了。AABB盒子是平行於\(x,y,z\)軸的平面形成的。

為什么要用AABB盒
計算光線與平面相交的時候更簡單

判斷AABB盒與光線相交
再看光線與三維box相交之前,我們先從簡單二維box的看:光線分別於\(x,y\)平面相交,分別記錄照射的時間\(t_{min},t_{max}\)。

同樣的對三維box,也分別對應有三組\(t_{min},t_{max}\)。接下來判斷光線與box相交。關鍵點:
1. 只有當光線進入三組與軸平行的平面才可以判斷處光線進入box。
2. 如果光線出任意一個平面,那么光線已經出box了。所以,$$t_{enter} = max(t_{min}) , \quad
t_{exit} = min(t_{max})$$
當\(t_{enter}<t_{exit}\),我們知道光線再box中停留了一段時間。基於此,總結:
1. 當 \(t_{exit}<0\)時,說明光線與box沒有交點
2. 當 \(t_{exit}>=0 \quad and \quad t_{enter}<0\)時,說明光線在box內部,與box有交點
3. 當 \(t_{exit}>t_{enter} \quad and \quad t_{exit}>=0\)時,說明光線在box內部,與box有交點
加速結構
通過之前的學習,我們基本上已經實現了Whitted-Style Ray Tracing,但是我們還可以改進算法,來加速光線追蹤的速度。