光線追蹤

光線跟蹤電腦演算法的一般描述

為了生成在三維電腦圖形環境中的可見圖像，光線跟蹤是一個比光線投射或者掃描線彩現更加逼真的實現方法。這種方法通過逆向跟蹤與假想的照相機鏡頭相交的光路進行工作，由於大量的類似光線橫穿場景，所以從照相機角度看到的場景可見資訊以及軟體特定的光照條件，就可以構建起來。當光線與場景中的物體或者媒介相交的時候計算光線的反射、折射以及吸收。
光線跟蹤的場景經常是由程式設計師用數學工具進行描述，也可以由視覺藝術家使用中間工具描述，也可以使用從數位相機等不同技術方法捕捉到的圖像或者模型資料。
由於一個光源發射出的光線的絕大部分不會在觀察者看到的光線中占很大比例，這些光線大部分經過多次反射逐漸消失或者至無限小，所以對於構建可見資訊來說，逆向跟蹤光線要比真實地類比光線相互作用的效率要高很多倍。電腦類比程式從光源發出的光線開始查詢與觀察點相交的光線從執行與獲得正確的圖像來說是不現實的。
這種方法的一個明顯缺點就是需要假設光線在觀察點處終止，然後進行逆向跟蹤。在一定數量的最大反射之後，最後交點處的光線強度使用多種演算法進行估計，這些演算法可能包括經典的彩現演算法，也可能包括如輻射著色這樣的技術。

自然現象

在自然界中，光源發出的光線向前傳播，最後到達一個妨礙它繼續傳播的物體表面，我們可以將「光線」看作在同樣的路徑傳輸的光子流，在完全真空中，這條光線將是一條直線。但是在現實中，在光路上會受到三個因素的影響：吸收、反射與折射。物體表面可能在一個或者多個方向反射全部或者部分光線，它也可能吸收部分光線，使得反射或者折射的光線強度減弱。如果物體表面是透明的或者半透明的，那麼它就會將一部分光線按照不同的方向折射到物體內部，同時吸收部分或者全部光譜並發出輻射。吸收、反射以及折射的光線都來自於入射光線，而不會超出入射光線的強度。例如，一個物體表面不可能反射 66% 的輸入光線，然後再折射 50% 的輸入光線，因為這二者相加將會達到 116%。這樣，反射或者折射的光線可以到達其它的物體表面，同樣，吸收、反射、折射的光線重新根據入射光線進行計算。其中一部分光線通過這樣的途徑傳播到我們的眼睛，我們就能夠看到最終的彩現圖像及場景。

光線投射演算法

Arthur Appel 於 1968 年首次提出用於彩現的光線投射演算法。光線投射的基礎就是從眼睛投射光線到物體上的每個點，尋找阻擋光線的最近物體，也就是將圖像當作一個屏風，每個點就是屏風上的一個正方形。通常這就是眼睛看到的那個點的物體。根據材料的特性以及場景中的光線效果，這個演算法可以確定物體的濃淡效果。其中一個簡單假設就是如果表面面向光線，那麼這個表面就會被照亮而不會處於陰影中。表面的濃淡效果根據傳統的三維電腦圖學的濃淡模型進行計算。光線投射超出掃描線彩現的一個重要優點是它能夠很容易地處理非平面的表面以及實體，如圓錐和球體等。如果一個數學表面與光線相交，那麼就可以用光線投射進行彩現。複雜的物體可以用實體造型技術構建，並且可以很容易地進行彩現。
位於紐約 Elmsford, New York Mathematical Applications Group, Inc.（MAGI）的科學家首次將光線投射技術用於生成電腦圖形。1966 年，為了替美國國防部計算放射性污染創立了這個公司。MAGI 不僅計算了伽馬射線如何從表面進行反射（輻射的光線投射自從二十世紀四十年代就已經開始計算了），也計算了它們如何穿透以及折射。這些研究工作幫助政府確定一些特定的軍事應用；建造能夠保護軍隊避免輻射的軍用車輛，設計可以重入的太空探索交通工具。在 Philip Mittelman 博士的指導下，科學家們開發了一種使用同樣基本軟體生成圖像的方法。1972 年，MAGI 轉變成了一個商業動畫工作室，這個工作室使用光線投射技術為商業電視、教育電影以及最後為故事片製作三維電腦動畫，他們全部使用光線投射製作了 Tron 電影中的絕大部分動畫。MAGI 於 1985 年破產。

光線追蹤演算法

下一個重要的研究突破是 Turner Whitted 於 1979 年做出的。以前的演算法從眼睛到場景投射光線，但是並不跟蹤這些光線。當光線碰到一個物體表面的時候，可能產生三種新的類型的光線：反射、折射與陰影。光滑的物體表面將光線按照鏡像反射的方向反射出去，然後這個光線與場景中的物體相交，最近的相交物體就是反射中看到的物體。在透明物質中傳輸的光線以類似的方式傳播，但是在進入或者離開一種物質的時候會發生折射。為了避免跟蹤場景中的所有光線，人們使用陰影光線來測試光線是否可以照射到物體表面。光線照射到物體表面上的某些點上，如果這些點面向光線，那麼就跟蹤這段交點與光源之間的光線。如果在表面與光源之間是不透明的物體，那麼這個表面就位於陰影之中，光線無法照射。這種新層次的光線計算使得光線跟蹤圖像更加真實。

光線追蹤的優點

光線跟蹤的流行來源於它比其它彩現方法如掃描線彩現或者光線投射更加能夠現實地類比光線，象反射和陰影這樣一些對於其它的演算法來說都很難實現的效果，卻是光線跟蹤演算法的一種自然結果。光線跟蹤易於實現並且視覺效果很好，所以它通常是圖形編程中首次嘗試的領域。

光線追蹤的缺點

光線跟蹤的一個最大的缺點就是效能，掃描線演算法以及其它演算法利用了資料的一致性從而在像素之間共用計算，但是光線跟蹤通常是將每條光線當作獨立的光線，每次都要重新計算。但是，這種獨立的做法也有一些其它的優點，例如可以使用更多的光線以抗混疊現象，並且在需要的時候可以提高圖像品質。儘管它正確地處理了相互反射的現象以及折射等光學效果，但是傳統的光線跟蹤並不一定是真實效果圖像，只有在非常近似或者完全實現彩現方程的時候才能實現真正的真實效果圖像。由於彩現方程描述了每個光束的物理效果，所以實現彩現方程可以得到真正的真實效果，但是，考慮到所需要的計算資源，這通常是無法實現的。於是，所有可以實現的彩現模型都必須是彩現方程的近似，而光線跟蹤就不一定是最為可行的方法。包括光子對映在內的一些方法，都是依據光線跟蹤實現一部分演算法，但是可以得到更好的效果。

光線穿過場景的反方向

從眼睛發出光線到達光源從而彩現圖像的過程有時也稱為後向光線跟蹤，這是因為它是實際光線傳播方向的反方向。但是，對於這個術語來說還有一些混淆的地方。早期的光線跟蹤經常是從眼睛開始，James Arvo 等早期研究人員用後向光線跟蹤表示從光源發出光線然後收集得到的結果。因為如此，將它們分成基於眼睛或者基於光源的光線跟蹤將會更加清楚。在過去的幾十年中，研究人員已經開發了許多組合了這兩種方向的計算方法與機制以生成投降或者偏離交叉表面的或多或少的光線。例如，輻射著色演算法通常根據光源對於表面的影響進行計算並且儲存這些結果，然後一個標準的遞迴光線跟蹤器可以使用這些資料生成場景的真實、物理正確的圖像。在全域照明演算法如光子對映以及 Metropolis light transport 中，光線跟蹤只是一個用來計算光線在表面之間傳輸的簡單工具。

經典遞迴光線追蹤演算法

對圖像中的每一個像素 {
  創建從視點通過該像素的光線
  初始化 最近T 為 無限大，最近物體 為 空值

  對場景中的每一個物體 {
     如果光線與物體相交 {
        如果交點處的 t 比 最近T 小 {
           設置 最近T 為交點的 t 值
           設置 最近物體 為該物體
        }
     }
  }

  如果 最近物體 為 空值{
     用背景色填充該像素
  } 否則 {
     對每個光源射出一條光線來檢測是否處在陰影中
     如果表面是反射面，生成反射光；遞歸
     如果表面透明，生成折射光；遞歸
     使用 最近物體 和 最近T 來計算著色函數
     以著色函數的結果填充該像素
  }
}

即時光線追蹤

人們已經進行了許多努力，改進如電腦與電動遊戲這些互動式三維圖形應用程式中的即時光線追蹤速度。
OpenRT 專案包含一個高度最佳化的光線跟蹤軟體核心，並且提供了一套類似於 OpenGL 的 API 用於替代目前互動式三維圖形處理中基於光柵化（rasterization）的實現方法。
一些光線跟蹤硬體，如 Saarland 大學開發的實驗性光線處理單元，都是設計用來加速光線跟蹤處理中那些需要大量計算的操作。
自從二十世紀九十年代末開始，一些演示場景愛好者就已經開發了一些光線跟蹤的即時三維引擎軟體。但是，演示中的光線跟蹤為了實現足夠高的影格速經常使用一些不正確的近似甚至是欺騙的手段。
2008年6月12日，英特爾展示了一個名為《雷神戰爭：光線跟蹤》的特殊版本《深入敵後：雷神戰爭》，其使用光線跟蹤技術進行彩現，在720p的解析度下每秒14-29影格。該演示採用16核（4路×4核）Xeon Tigerton系統，執行頻率為2.93 GHz。
AMD在Radeon Vega 系列顯示卡上通過GPUOpen Radeon ProRender實現即時光線追蹤。Nvidia已經宣布在Quadro RTX工作站顯示卡上可進行即時光線追蹤，GeForce 20系列顯示卡已經具有即時光線追蹤功能。