您當前的位置:首頁 > 攝影

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

作者:由 石廈老男人 發表于 攝影時間:2022-11-07

從軟陰影開始有很多很迷的描述,看不懂的話應該也正常。

13。1 透明和折射(Transparency and Refraction)

在第 4 章中,我們討論了使用遞迴光線追蹤來計算來自表面的鏡面反射或鏡面反射。 另一種型別的鏡面反射物體是電介質——一種折射光線的透明材料。 鑽石、玻璃、水和空氣是電介質。 電介質也過濾光; 有些玻璃濾除的紅光和藍光多於綠光,因此玻璃呈現綠色。 當光線從折射率為

n

的介質傳播到折射率為

n_{t}

的介質中時,部分光被透射併發生彎曲。 這在圖 13。1 中顯示為

n_{t} > n

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

圖 13。1。 Snell定律描述了角度 φ 如何取決於角度 θ 以及物體和周圍介質的折射率

Snell定律告訴我們

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

計算兩個向量之間的角度的正弦通常不如計算餘弦方便,餘弦是單位向量的簡單點積,例如我們這裡的情況。 使用三角恆等式

sin^2 θ + cos^2 θ = 1

,我們可以推匯出餘弦的折射關係:

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

請注意,如果

n

nt

顛倒,則

 θ

φ

也是如此,如圖 13。1 右側所示。

為了將

sin φ

cos φ

轉換為 3D 向量,我們可以在表面法線

n

和射線方向

d

的平面中設定一個 2D 正交基。

從圖13。2 中,我們可以看到

n

b

形成了折射平面的正交基。

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

圖 13。2 向量 n 和 b 形成平行於向量 t 的 2D 正交基。

根據定義,我們可以根據此基描述變換後的光線

t

的方向:

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

由於我們可以在相同的基礎上描述

d

,並且

d

是已知的,因此我們可以求解

b

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

這意味著我們可以用已知變數求解

t

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

請注意,無論

n

n_{t}

中的哪個更大,此等式都有效。 一個直接的問題是,“如果平方根下的數字是負數,你該怎麼辦?” 在這種情況下,沒有折射光線,所有能量都被反射。 這被稱為全內反射(total internal reflection),它是造成玻璃物體豐富外觀的主要原因。

根據菲涅耳方程,電介質的反射率(reflectivity)隨入射角而變化。 實現接近菲涅耳方程的一個好方法是使用 Schlick 近似

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

其中

R_{0}

是正入射(也就是垂直入射)的反射率:

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

請注意,上面的

cos θ

項總是針對在空氣中的角度(相對於法線的內角和外角中較大的一個)。

對於在典型有色玻璃中發現的均質雜質,根據比爾定律,載光射線的強度會減弱。 當光線穿過介質時,它會根據

dI = -CI dx

失去強度,其中

 dx

是距離。 因此,

dI/dx = -CI

。 我們可以解這個方程並得到指數

I = k \ exp(−Cx)

。 衰減的程度用RGB衰減常數

a

來描述,它是一個單位距離後的衰減量。 加上邊界條件,我們知道

I(0) = I_{0}

,並且

I(1) = aI(0)

。 前者意味著

I(x) = I_{0}  \ exp(−Cx)

。 後者意味著

I_{0}a = I_{0} \ exp(-C)

,所以

-C = ln(a)

。 因此,最終的公式是

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

其中

I(s)

是距離介面

s

處的光束強度。 在實踐中,我們透過眼睛逆向得到,因為這樣的資料很不容易找到。 比爾定律的效果可以在圖 13。3 中看到,其中玻璃呈現綠色。

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

圖 13。3 玻璃的顏色受全內反射和比爾定律的影響。 透射和反射的光量由菲涅耳方程確定。 地平面上的複雜光照是使用粒子追蹤計算的,如第 23 章所述。

要將透明材質新增到我們的程式碼中,我們需要一種方法來確定光線何時“進入”物件。 最簡單的方法是假設所有物體都嵌入空氣中,折射率非常接近 1。0,並且表面法線指向“向外”(朝向空氣)。 具有這些假設的光線和電介質的程式碼段是:

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

上面的程式碼假設自然對數已經被摺疊成常數

(ar, ag, ab)

。 如果存在全內反射,折射函式返回 false,否則填充引數列表的最後一個引數。

13。2 例項化(Instancing)

13。3 體素構造表示(Constructive Solid Geometry)

13。4 分散式光線跟蹤(Distribution Ray Tracing)

對於某些應用程式,光線追蹤影象太“乾淨”了。 可以使用分佈光線追蹤來減輕這種影響。 傳統的光線追蹤影象看起來很乾淨,因為一切都很清晰; 陰影非常清晰,反射沒有模糊,一切都在完美的焦點上。 有時我們希望陰影柔和(就像在現實生活中一樣),反射像拉絲金屬一樣模糊,影象具有不同的聚焦度,就像在大光圈的照片中一樣。 雖然從基本原理完成這些事情有些複雜(如第 23 章所述),但我們可以透過對基本光線追蹤演算法進行一些相當簡單的更改來獲得大部分視覺效果。 此外,該框架為我們提供了一種相對簡單的方法來抗鋸齒影象。

13。4。1 抗鋸齒(Antialiasing)

回想一下,消除影象鋸齒的一種簡單方法是計算畫素區域的平均顏色,而不是中心點的顏色。 在光線追蹤中,我們的計算圖元是計算螢幕上某個點的顏色。 如果我們對畫素中的許多點進行平均,我們就接近了真實的平均值。 如果包圍畫素的螢幕座標是

 [i, i + 1] × [j, j + 1]

,那麼我們可以替換迴圈:

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

使用在每個畫素內的常規

n × n

樣本網格上取樣的程式碼:

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

這通常稱為常規抽樣(regular sampling)。 畫素中 n = 4 的 16 個樣本位置如圖 13。9 所示。

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

圖 13。9。 單個畫素的十六個常規樣本。

請注意,這產生的結果與渲染傳統的光線追蹤影象相同,每個畫素在

n_{x}n  \times n_{y}n

解析度下一個樣本,然後對

 n \times n

畫素塊進行平均以獲得

n_{x} \times n_{y}

影象。

以畫素內的規則圖案取樣的一個潛在問題是,可能會出現規則偽影,例如莫爾圖案。 如圖 13。10 所示,透過在每個畫素內以隨機模式取樣,可以將這些偽像轉化為噪聲。

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

圖 13。10 單個畫素的 16 個隨機樣本。

這通常稱為隨機抽樣,只涉及對程式碼的一個小改動:

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

這種方法通常稱為抖動或分層抽樣(圖 13。11)。

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

圖 13。11 單個畫素的 16 個分層(抖動)樣本顯示有和沒有突出顯示的 bin。 每個 bin 內恰好有一個隨機樣本

13。4。2 軟陰影(Soft Shadows)

陰影在標準光線追蹤中難以處理的原因是,燈光是無窮小的點或方向,因此要麼可見要麼不可見。 在現實生活中,燈光具有非零區域,因此可以部分可見。 這個想法在圖 13。12 中以二維形式顯示。

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

圖 13。12 軟陰影從無陰影區域逐漸過渡到陰影區域。 過渡區是圖中 p 表示的“半影”。

光完全不可見的區域稱為本影(umbra)。 部分可見的區域稱為半影(penumbra)。 沒有陰影的區域沒有常用術語,但有時稱為反本影(anti-umbra)。

實現軟陰影的關鍵是以某種方式將光視為一個區域而不是一個點。 一個簡單的方法是用一組分散式的 N 個點光源來近似光,每個點光源的強度是基礎光的 N 分之一。 這個概念在圖 13。13 的左邊說明了,其中使用了九個燈。

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

圖 13。13 左:區域光可以用一定數量的點光源來近似; 九個點中有四個對 p 可見,因此它在半影中。 右:為陰影光線選擇燈光上的一個隨機點,它有一定的機會擊中燈光或不擊中燈光

您可以在標準光線追蹤器中執行此操作,這是在現成的渲染器中獲得柔和陰影的常用技巧。 這種技術有兩個潛在的問題。 首先,通常需要數十個點光源來實現視覺上的平滑效果,這會大大減慢程式的速度。 第二個問題是陰影在半影內部有明顯的過渡。

分佈光線追蹤在陰影程式碼中引入了一個小的變化。 我們不是在離散數量的點光源上表示區域光,而是將其表示為無限數量,併為每條觀察光線隨機選擇一個。 這相當於為任何被照亮的表面點選擇燈光上的隨機點,如圖 13。13 右側所示。

如果光是由角點 c 和兩個邊向量 a 和 b 指定的平行四邊形(圖 13。14),則選擇隨機點 r 很簡單:

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

圖 13。14 由角點c和兩個邊向量指定的平行四邊形燈的幾何形狀。

其中 ξ1 和 ξ2 是 [0, 1) 範圍內的均勻隨機數(uniform random)。

然後我們將陰影射線傳送到該點,如圖 13。13 右側所示。 請注意,此光線的方向不是單位長度,這可能需要根據其假設對基本光線追蹤器進行一些修改。(下面的實現我沒看懂)

We would really like to jitter points on the light。 However, it can be dangerous to implement this without some thought。 We would not want to always have the ray in the upper left-hand corner of the pixel generate a shadow ray to the upper left-hand corner of the light。 Instead we would like to scramble the samples, such that the pixel samples and the light samples are each themselves jittered, but so that there is no correlation between pixel samples and light samples。 A good way to accomplish this is to generate two distinct sets of

n^2

jittered samples and pass samples into the light source routine:

我們真的很想在光平面上抖動(jitter)點(我猜是隨機取樣的意思?)。 然而,不加思索地實現這一點可能是危險的。 我們不希望畫素左上角發出的光線始終生成到光平面左上角的陰影光線。 相反,我們希望對樣本進行打亂,這樣畫素樣本和光樣本本身都是抖動的,但畫素樣本和光樣本之間沒有相關性。 實現此目的的一個好方法是生成兩組不同的

n ^2

抖動樣本並將樣本傳遞到標準光追程式(light source routine)中:

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

This shuffle routine eliminates any coherence between arrays r and s。 The shadow routine will just use the 2D random point stored in s[p] rather than calling the random number generator。 A shuffle routine for an array indexed from 0 to N −1 is:

這個 shuffle 消除了陣列 r 和 s 之間的任何一致性。 陰影程式將只使用儲存在 s[p] 中的 2D 隨機點,而不是呼叫隨機數生成器。 索引從 0 到 N -1 的陣列的 shuffle 程式是:

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

13。4。3 景深(Depth of Field)

大多數照片中看到的柔焦效果可以透過在非零尺寸“鏡頭”而不是一個點上收集光線來模擬。 這稱為景深。 透鏡從錐形方向收集光,該錐形方向的頂點位於所有物體都聚焦的距離處(圖 13。15)。

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

圖 13。15。 鏡頭在擊中被取樣畫素位置的錐形方向上取平均值。

我們可以將取樣的“視窗”放置在所有物體都聚焦的平面上(而不是像我們之前那樣在

z = n

平面上)和鏡頭在眼睛那。 一切都聚焦的平面的我們稱為焦平面,到它的距離由使用者設定,就像在真實相機中到焦平面的距離由使用者或測距儀設定一樣。

為了最忠實於真實的相機,我們應該把鏡頭做成圓盤。 然而,我們將獲得與方形透鏡非常相似的效果(圖 13。16)

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

圖 13。16。 為了建立景深效果,眼睛是從正方形區域(應該是左邊)中隨機選擇的。

所以我們選擇鏡頭的邊長並在上面隨機取樣。 視線的原點將是這些受擾的位置而不是眼睛的位置。 同樣,shuffle 程式用於防止與畫素樣本位置相關。 圖 13。17 顯示了一個使用每畫素 25 個樣本和一個大圓盤鏡頭的示例

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

圖 13。17 景深示例。 酒杯陰影中的焦散是使用粒子追蹤計算的,如第 23 章所述。

13。4。4 Glossy的反射(Glossy Reflection)

一些表面,例如拉絲金屬,介於理想的鏡子和漫射表面之間。 在反射中可以看到一些可辨別的影象,但它是模糊的。 我們可以透過隨機擾動(perturbing)理想的鏡面反射光線來模擬這一點,如圖 13。18 所示

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

圖 13。18。 反射光線被擾亂為隨機向量 r &;amp;amp;#39;。

只需要解決兩個細節:如何選擇向量 r‘ 以及當產生的擾動光線低於反射光線的表面時該怎麼辦。 後一個細節通常透過在光線低於表面時返回零顏色來解決。

To choose r’ , we again sample a random square。 This square is perpendicular to r and has width a which controls the degree of blur。 We can set up the square’s orientation by creating an orthonormal basis with w = r using the techniques in Section 2。4。6。 Then, we create a random point in the 2D square with side length a centered at the origin。 If we have 2D sample points

(ξ, ξ

, then the analogous point on the desired square is

為了選擇 r‘,我們再次取樣一個隨機正方形。 這個正方形與 r 垂直,寬度為 a,用於控制模糊程度。 我們可以透過使用第 2。4。6 節中的技術建立 w = r 的正交基來設定正方形的方向。 然後,我們在 2D 正方形中建立一個隨機點,邊長 a 以原點為中心。 如果我們有 2D 樣本點

(ξ, ξ

,那麼所需正方形上的類似點是

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

因為我們要擾動的正方形平行於 u 和 v 向量,所以射線 r’ 只是

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

請注意, r‘ 不一定是單位向量,如果您的程式碼需要對光線方向進行歸一化,則應該對其進行歸一化。

13。4。5 運動模糊(Motion Blur)

我們可以為物件新增模糊外觀,如圖 13。19 所示。

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

圖 13。19 右下角的球體在運動,因此外觀模糊。

這稱為運動模糊,是在非零時間跨度內形成影象的結果。 在真實相機中,光圈在物體移動的某個時間間隔內開啟。 我們可以透過設定一個從

T_{0}

T_{1}

的時間變數來模擬開孔。 對於每條觀察光線,我們選擇一個隨機時間,

Fundamentals of Computer Graphics, Fourth Edition 13、More Ray Tracing(更多的光線追蹤)

我們可能還需要建立一些物件來隨時間移動。 例如,我們可能有一個運動球體,其中心在區間內從

c_{0}

移動到

c_{0}

。 給定 T ,我們可以計算實際中心並與該球體進行射線相交。 因為每條射線都是在不同的時間傳送的,所以每條都會在不同的位置遇到球體,最終的外觀會變得模糊。 請注意,運動球體的包圍盒應包住其整個路徑,以便可以為整個時間間隔構建有效率的結構。

標簽: 13  光線  畫素  我們  陰影