【譯】計算機圖形學基礎第四版(4.2)

語言: CN / TW / HK

theme: fancy highlight: ascetic


持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第9天,點選檢視活動詳情

特別宣告

本文翻譯的是由Steve MarschnerPeter Shirley主要參與編寫的的第四版《計算機圖形學基礎》[英]。\ 版權歸原作者所有。

正文

## 4 光線追蹤(二) ### 4.4 射線-物體相交 一旦我們生成了一條射線 e td,接下來我們需要找到與任何 t > 0 的物件的第一個交點。在實踐中,解決一個稍微更一般的問題是有用的:找到射線之間的第一個交點和出現在區間 [t0, t1] 中的 t 處的表面。基本光線相交是 t0 = 0 和 t1 = ∞ 的情況。我們為球體和三角形解決了這個問題。在下一節中,將討論多個物件。 #### 4.4.1 射線-球體相交 給定一條射線 p(t) = e td 和一個隱式曲面 f(p)=0(參見第 2.5.3 節),我們想知道它們在哪裡相交。當射線上的點滿足隱式方程時,就會出現交點,因此我們尋求的 t 值是那些求解方程的值

image.png

圓心 c = (xc, yc, zc) 半徑為 R 的球體可以用隱式方程表示

image.png

我們可以用向量形式寫出同樣的方程:

image.png

任何滿足這個方程的點 p 都在球面上。如果我們將射線上的點 p(t) = e td 代入這個方程,我們會得到一個關於 t 的方程,它由 t 的值滿足,該值在球體上產生點:

image.png

image.png

在這裡,除了引數 t 之外,一切都是已知的,所以這是 t 中的經典二次方程,這意味著它具有以下形式

image.png

該方程的解在 2.2 節中討論。二次解中平方根符號下的項 B2 − 4AC 稱為判別式,它告訴我們有多少實解。如果判別式為負,則其平方根為虛數且線與球不相交。如果判別式為正,則有兩種解決方案:一種是光線進入球體的解決方案,另一種是光線離開的解決方案。如果判別式為零,則光線掠過球體,恰好在一點接觸球體。代入球體的實際項並取消兩倍,我們得到

image.png

在實際實施中,您應首先在計算其他條款之前先檢查判別物的值。如果球僅用作更復雜物件的邊界物件,那麼我們只需要確定是否擊中它。檢查判別劑的足夠。

如第2.5.4節所述,點P處的正常向量由梯度n = 2(p -c)給出。正常單位為(p -c)/r。

4.4.2射線三角形交集

有許多演算法用於計算射線與三角形的交點。我們將展示對包含三角形的引數平面使用重心座標的形式,因為除了三角形的頂點之外,它不需要長期儲存(Snyder & Barr,1987)。

為了使光線與引數表面相交,我們建立了一個方程組,其中笛卡爾座標全部匹配:

image.png

在這裡,我們有三個方程和三個未知數(t、u 和 v),因此我們可以對未知數進行數值求解。如果幸運的話,我們可以分析地解決它們。

在引數曲面是引數平面的情況下,引數方程可以寫成向量形式,如第 2.7.2 節所述。如果三角形的三個頂點是a、b、c,那麼交點會發生在

image.png

對於某些 t、β 和 γ。如圖 4.10 所示,

image.png

交點 p 將在 e td 處。 同樣,從第 2.7.2 節,我們知道交點在三角形內部當且僅當 β > 0、γ > 0 和 β γ < 1。否則,射線已經射到三角形外部的平面,所以它錯過了三角形。如果沒有解,要麼三角形退化,要麼射線平行於包含三角形的平面。 為了求解方程 (4.2) 中的 t、β 和 γ,我們將其從向量形式展開為三個座標的三個方程:

image.png

這可以重寫為標準線性系統:

image.png

解決這個3×3線性系統的最快經典方法是Cramer的規則。這為我們提供瞭解決方案

image.png

矩陣A是

image.png

和| A |表示A的決定因素A的3×3決定因素具有可以利用的常見縮寫。檢視帶有虛擬變數的線性系統

image.png

克萊默法則給了我們:

image.png 當:

image.png

我們可以通過重用“ei-minus-hf”等數字來減少操作次數。

我們需要線性解的射線-三角形相交的演算法可以有一些提前終止的條件。因此,該函式應類似於:

image.png

4.4.3 射線-多邊形相交

給定一個具有 m 個頂點 p1 到 pm 和表面法線 n 的平面多邊形,我們首先使用隱式方程計算射線 e td 和包含該多邊形的平面之間的交點

image.png

我們通過設定 p = e td 並求解 t 來做到這一點

image.png

這使我們能夠計算p。如果p在多邊形內,則射線擊中它。否則,它不會。 我們可以通過將點和多邊形頂點投射到XY平面並在那裡回答多邊形來回答P多邊形內部的問題。最簡單的方法是將任何2D射線從p中傳送出去,並計算該射線與多邊形邊界之間的相交數量(Sutherland,Sproull和Schumacker,1974; Glassner,1989)。如果相交的數量是奇數的,則該點在多邊形內。否則不是。這是正確的,因為進入的光線必須熄滅,從而建立了一對交叉點。只有從內部開始的射線不會建立這樣的一對。為了使計算簡單,2D射線也可以沿X軸傳播:

image.png

對於 s ∈ (0, ∞),計算該射線與諸如 (x1, y1, x2, y2) 等邊的交點很簡單。

然而,對於投影到 xy 平面中的多邊形是一條線,就會出現問題。為了解決這個問題,我們可以在 xy、yz 或 zx 平面中選擇最好的。如果我們實現我們的點以允許索引操作,例如 p(0) = xp 那麼這可以如下完成:

image.png

現在,所有計算都可以使用 p(index0) 而不是 xp,等等。

另一種在實踐中經常使用的多邊形方法是將它們替換為幾個三角形。

4.4.4 與一組物件相交

當然,最有趣的場景由多個物件組成,當我們將一條射線與場景相交時,我們必須只找到沿射線與相機最近的交點。實現這一點的一種簡單方法是將一組物件視為其本身是另一種型別的物件。要將射線與組相交,只需將射線與組中的物件相交併返回具有最小 t 值的交點。以下程式碼測試區間 t ∈ [t0, t1] 中的命中:

image.png

image.png

4.5 陰影

一旦知道畫素的可見表面,就可以通過評估著色模型來計算畫素值。如何做到這一點完全取決於應用程式——方法範圍從非常簡單的啟發式到精細的數值計算。在本章中,我們描述了兩種最基本的著色模型;第 10 章將討論更高階的模型。

大多數著色模型,以一種或另一種方式,旨在捕捉光反射的過程,即表面被光源照亮並將部分光反射到相機。簡單的著色模型是根據來自點光源的照明來定義的。光反射中的重要變數是光的方向 l,它是指向光源的單位向量;檢視方向v,它是指向眼睛或相機的單位向量;表面法線 n,它是在發生反射的點處垂直於表面的單位向量;以及表面的特徵——顏色、光澤度或其他屬性,具體取決於特定型號。

4.5.1 朗伯著色

最簡單的著色模型基於 Lambert 在 18 世紀所做的觀察:光源落在表面區域的能量取決於表面與光線的角度。直接面向光的表面接收最大照明;與光線方向相切(或背向光線)的表面不接收照明;之間的照明與表面法線和光源之間的角度 θ 的餘弦成正比(圖 4.12)。

image.png

這導致了朗伯著色模型:

image.png

其中l是畫素顏色;KD是瀰漫係數或表面顏色。我是光源的強度。因為n和l是單位向量,所以我們可以將n·l用作方便的速記(無論是在紙上還是在程式碼上)作為cosθ。該方程式(如本節中的其他陰影方程)分別適用於三個顏色通道,因此畫素值的紅色分量是紅色擴散分量,紅光源強度和點乘積的乘積;綠色和藍色也是如此。

向量L是通過從光源位置減去射線和表面的交點來計算的。不要忘記V,L和N都必須是單位向量;在陰影計算中未能使這些向量歸一化是一個非常普遍的錯誤。

來自真實點的照明會隨著距離平方的形式掉落,但這通常比簡單的渲染器中值得更多的麻煩。 如有疑問,將光源保持顏色中性,具有相等的紅色,綠色和藍色強度。

Blinn-Phong著色

朗伯著色與檢視無關:表面的顏色不取決於您觀看的方向。許多真實表面顯示出某種程度的光澤,產生高光或鏡面反射,隨著視點的變化,它們似乎會四處移動。朗伯著色不會產生任何高光,並導致非常無光澤、白堊的外觀,並且許多著色模型在朗伯著色中添加了鏡面反射分量;朗伯部分是漫反射分量。

Phong (Phong, 1975) 提出了一個非常簡單且廣泛使用的鏡面高光模型,後來 Blinn (J. F. Blinn, 1976) 將其更新為當今最常用的形式。這個想法是在 v 和 l 對稱地穿過表面法線時產生最亮的反射,此時會發生鏡面反射;然後,隨著向量遠離鏡面配置,反射會平穩減少。

image.png

我們可以通過比較半向量 h(v 和 l 之間的角的平分線)與表面法線(圖 4.16)

image.png

來判斷我們與映象配置的接近程度。如果半向量接近表面法線,則鏡面反射分量應該是亮的;如果它很遠,它應該是暗淡的。這個結果是通過計算 h 和 n 之間的點積來實現的(記住它們是單位向量,所以當向量相等時,n·h 達到最大值 1),然後將結果乘以 p > 1 以使其減小快點。功率或 Phong 指數控制表面的明顯光澤度。半向量本身很容易計算:由於 v 和 l 的長度相同,因此它們的和是一個將它們之間的角度平分的向量,只需對其進行歸一化即可產生 h。

綜上所述,Blinn-Phong 著色模型如下:

image.png

其中 ks 是表面的鏡面反射係數或鏡面反射顏色。

p的典型值:10——“蛋殼”; 100——有輕微光澤; 1000——非常有光澤; 10,000——幾乎像鏡子一樣。 如有疑問,請將鏡面反射顏色設為灰色,並具有相等的紅色、綠色和藍色值。

4.5.3 環境陰影

根本沒有獲得照明的表面將被呈現為完全黑色,通常是不可取的。避免黑色陰影的粗略但有用的啟發式是在陰影模型中新增一個恆定元件,該模型的貢獻僅取決於物件的命中,而完全不依賴於表面幾何形狀。這就是所謂的環境陰影 - 好像表面是由同樣來自任何地方的“環境”光照亮的。

為了方便調整引數,環境陰影通常表示為具有環境淺色的表面顏色的產物,因此可以單獨或將所有表面一起調整環境陰影。與Blinn-Phong模型的其餘部分一起,環境陰影完成了簡單且有用的陰影模式的完整版本:

在現實世界中,不被光源照亮的表面被其他表面的間接反射所照亮

image.png

其中 ka 是表面的環境係數,或“環境顏色”,Ia 是環境光強度。

如有疑問,請將環境顏色設定為與漫反射顏色相同

4.5.4 多點光源

光的一個非常有用的特性是疊加——由多個光源引起的效果只是各個光源效果的總和。 出於這個原因,我們的簡單著色模型可以很容易地擴充套件到處理 N 個光源:

image.png

其中,Ii、li、hi 是第 i 個光源的強度、方向和半向量。