光線跟蹤
出自 MBA智库百科(https://wiki.mbalib.com/)
光線跟蹤(Ray Tracing)
目錄 |
光線跟蹤是指一種在二維(2D)屏幕上呈現三維(3D)圖像的技術。
光線跟蹤程式可以識別和複製光線的路線,但是方向相反(從眼睛到原點)。每個光線路徑由多個直線部件組成,並且包括點的反射、折射和陰影效應。在動畫中,每一束光線的直線部件的位置和方向總是在不斷變化,因此每一條光線都要用一個數學方程式來表示,把通過空間的光線路徑定義為時間函數。基於光線通過的場中的色素,光線被分配顏色。顯示屏上的每個像素都與一個光線對應。
光線跟蹤最先是在20世紀60年代由一個數學應用組的科學家發明的。光線跟蹤廣泛應用於電腦游戲、卡通動畫、電視、DVD節目和電影製作。
為了生成在三維電腦圖形環境中的可見圖像,光線跟蹤是一個比光線投射或者掃描線渲染更加逼真的實現方法。這種方法通過逆向跟蹤與假象的照相機鏡頭相交的光路進行工作,由於大量的類似光線橫穿場景,所以從照相機角度看到的場景可見信息以及軟體特定的光照條件,就可以構建起來。當光線與場景中的物體或者媒介相交的時候計算光線的反射、折射以及吸收。
光線跟蹤的場景經常是由程式員用數學工具進行描述,也可以由視覺藝術家使用中間工具描述,也可以使用從數位相機等不同技術方法捕捉到的圖像或者模型數據。
由於一個光源發射出的光線的絕大部分不會在觀察者看到的光線中占很大比例,這些光線大部分經過多次反射逐漸消失或者至無限小,所以對於構建可見信息來說,逆向跟蹤光線要比真實地模擬光線相互作用的效率要高很多倍。電腦模擬程式從光源發出的光線開始查詢與觀察點相交的光線從執行與獲得正確的圖像來說是不現實的。
這種方法的一個明顯缺點就是需要假設光線在觀察點處終止,然後進行逆向跟蹤。在一定數量的最大反射之後,最後交點處的光線強度使用多種演算法進行估計,這些演算法可能包括經典的渲染演算法,也可能包括如輻射著色這樣的技術。
Arthur Appel 於 1968 年首次提出用於渲染的光線投射演算法。光線投射的基礎就是從眼睛投射光線到物體上的每個點,查找阻擋光線的最近物體,也就是將圖像當作一個屏風,每個點就是屏風上的一個正方形。通常這就是眼睛看到的那個點的物體。根據材料的特性以及場景中的光線效果,這個演算法可以確定物體的濃淡效果。其中一個簡單假設就是如果錶面面向光線,那麼這個錶面就會被照亮而不會處於陰影中。錶面的濃淡效果根據傳統的三維電腦圖形學的濃淡模型進行計算。光線投射超出掃描線渲染的一個重要優點是它能夠很容易地處理非平面的錶面以及實體,如圓錐和球體等。如果一個數學錶面與光線相交,那麼就可以用光線投射進行渲染。複雜的物體可以用實體造型技術構建,並且可以很容易地進行渲染。
位於紐約 Elmsford, New York Mathematical Applications Group, Inc.(MAGI)的科學家首次將光線投射技術用於生成電腦圖形。1966 年,為了替美國國防部計算放射性污染創立了這個公司。MAGI 不僅計算了伽馬射線如何從錶面進行反射(輻射的光線投射自從二十世紀四十年代就已經開始計算了),也計算了它們如何穿透以及折射。這些研究工作幫助政府確定一些特定的軍事應用;建造能夠保護軍隊避免輻射的軍用車輛,設計可以重入的太空探索交通工具。在 Philip Mittelman 博士的指導下,科學家們開發了一種使用同樣基本軟體生成圖像的方法。1972 年,MAGI 轉變成了一個商業動畫工作室,這個工作室使用光線投射技術為商業電視、教育電影以及最後為故事片製作三維電腦動畫,他們全部使用光線投射製作了 Tron 電影中的絕大部分動畫。MAGI 於 1985 年破產。
下一個重要的研究突破是 Turner Whitted 於 1979 年做出的。以前的演算法從眼睛到場景投射光線,但是並不跟蹤這些光線。當光線碰到一個物體錶面的時候,可能產生三種新的類型的光線:反射、折射與陰影。光滑的物體錶面將光線按照鏡像反射的方向反射出去,然後這個光線與場景中的物體相交,最近的相交物體就是反射中看到的物體。在透明物質中傳輸的光線以類似的方式傳播,但是在進入或者離開一種物質的時候會發生折射。為了避免跟蹤場景中的所有光線,人們使用陰影光線來測試光線是否可以照射到物體錶面。光線照射到物體錶面上的某些點上,如果這些點面向光線,那麼就跟蹤這段交點與光源之間的光線。如果在錶面與光源之間是不透明的物體,那麼這個錶面就位於陰影之中,光線無法照射。這種新層次的光線計算使得光線跟蹤圖像更加真實。
光線跟蹤的流行來源於它比其它渲染方法如掃描線渲染或者光線投射更加能夠現實地模擬光線,象反射和陰影這樣一些對於其它的演算法來說都很難實現的效果,卻是光線跟蹤演算法的一種自然結果。光線跟蹤易於實現並且視覺效果很好,所以它通常是圖形編程中首次嘗試的領域。
光線跟蹤的一個最大的缺點就是性能,掃描線演算法以及其它演算法利用了數據的一致性從而在像素之間共用計算,但是光線跟蹤通常是將每條光線當作獨立的光線,每次都要重新計算。但是,這種獨立的做法也有一些其它的優點,例如可以使用更多的光線以抗混疊現象,並且在需要的時候可以提高圖像質量。儘管它正確地處理了相互反射的現象以及折射等光學效果,但是傳統的光線跟蹤並不一定是真實效果圖像,只有在非常近似或者完全實現渲染方程的時候才能實現真正的真實效果圖像。由於渲染方程描述了每個光束的物理效果,所以實現渲染方程可以得到真正的真實效果,但是,考慮到所需要的計算資源,這通常是無法實現的。於是,所有可以實現的渲染模型都必須是渲染方程的近似,而光線跟蹤就不一定是最為可行的方法。包括光子映射在內的一些方法,都是依據光線跟蹤實現一部分演算法,但是可以得到更好的效果。