課堂筆記_ 光線跟蹤原理
Turner Whitted於1980年首次提出一個包含光反射和折射效果的模型:Whitted模型,並第一次給出光線跟蹤演算法的示例,是計算機圖形學歷史上的里程碑。發表於Communications of the ACM 1980。
定義:
特徵:
通過光線跟蹤,可以很容易地表現出例如陰影、反射、折射等引人入勝的視覺效果。除了基本的幾何形狀,(例如球體、椎體、立方體等),光線跟蹤容易適用於更復雜的物體表示方法,(例如多邊形網格表示或者符合形狀等)
核心虛擬碼:
求交點,計算區域性光照,判斷折射反射方向,遞迴求解。
光線求交
光線的表示
光線與平面求交
光線與三角形求交
一般做法:
1.首先計算光線與三角形所在平面的交點;
2.判斷交點是否在三角形的內部。
三角形與光線的交點可以通過結合重心座標快速計算:
重心座標的表示,在三角形內部的點P將三角形可以分為三個小三角形,分別用小三角形的面積除以大三角形的面積得到三個數來刻畫P點的座標。
可以通過線性求解得到交點的重心座標以及直線引數t。
光線與多邊形求交
不能像三角形那樣方便的利用重心座標計算,需要一個更普適的方法,即上邊提到的首先計算光線與多邊形所在平面的交點,然後判斷這個交點是否在多邊形內部。
注:交點在頂點的時候得考慮;光線方向是水平的。
最快的點包含判別演算法–弧長法
按逆時針方向遍歷多邊形的每條邊,每條邊與點P形成一個角度,這個角度也是帶符號的,上圖中左邊圖形的角度之和為0,右邊的圖形角度之和為360度。但是求角度需要反三角函式,計算困難。好處是穩定,可靠性高,對於比較小的誤差可以忽略
以被測點為圓心,作單位圓,計算其在單位圓上弧長的代數和。
–代數和為0:點在多邊形外部。
–代數和為2
–代數和為
上述弧長法的主要缺點在於角度計算量,但是魯棒性很好,對此提出改進的弧長法:
穿過兩個象限:
光線與球面求交
1.代數方法求解:有可能出現奇異值導致的不穩定性
2.幾何法求解:能快速判斷光線與球面是否相交、光源是否在球體內部、光線的方向
這樣求解魯棒性好。
光線與長方體(包圍盒)求交
Slab演算法和Woo演算法:複雜度類似。
光線追蹤實現思路
光線投射
由視點向該畫素中心投射一條光線,射向場景當中。對場景中的各個物體,計算與投射光線的交點,儲存所有物體的交點中距離視點最近的一個。接著根據光照、物體材質、以及法向方向,使用區域性光照模型計算畫素顏色值。
明暗效果僅僅由第一次相交的物體表面法向方向、材質、視點和光照方向、以及光照強度等因素共同決定。而光線投射並不考慮第二層以及更深層次的光線,因此不具有陰影、反射、折射等效果。
新增陰影
當前的交點處發射一條光線(陰影測試線),陰影測試線射向光源,如果測試線被物體遮擋,則就在陰影下,否則不在陰影下。注意此處只是考慮與物體是否相交,而不關心具體的交點。
新增反射和折射效果
光線跟蹤具有模擬物體表面反射效果以及折射效果的能力:
首先,計算光線與場景中物體的最近的交點。
然後,計算光線在交點處被物體反射和折射所產生的新的光線的方向,新的方向由入射光方向、物體表面法向、以及介質共同決定。
對新產生的管線(反射光線和折射光線)分別繼續進行跟蹤。
遞迴結束(一般三次):
1.在光線彈射一定次數後停止
2.在光線的貢獻衰減到足夠小時停止
新增紋理
一些問題思考
1.計算精度問題;
2.加速問題;
3.光線跟蹤為什麼要以視點來反向跟蹤?如果按照光源發射的多條光線來計算,由於經過彈射最終能夠抵達視點的光線是及其少的,得到的效果會很差,計算也很複雜。