實時渲染影片級別的計算機三維圖形是計算圖形領域的終極目標,與現在普遍使用的光柵化渲染技術相比,光線追蹤普遍被視為視覺技術的未來方向,可帶來近乎真實的真正電影級圖形和光影物理效果,光線追蹤演算法是達到這個目標的聖盃,經過幾十年的努力,終於要接近這個理想了。
| 光線追蹤的定義和原理精美的CG效果圖,與真實,相信大家對這些並不陌生。而大家在遊戲中對水面之類的場景並不陌生,不過它所生成的畫面效果,好像永遠都不那麼真實。即使人們盡再大的努力,它的畫面始終還是動畫,和人們心目中的“電影級別的畫質”總是差那麼一點。這是因為,我們目前的遊戲,無一例外都在使用光柵化演算法。而在這些電影中,則採用的是光線追蹤演算法。在3DSMax、Maya、SoftimageXSI等軟體中,也都無一例外地採用了這一演算法。
光線追蹤技術是由幾何光學通用技術衍生而來。它透過追蹤光線與物體表面發生的互動作用,得到光線經過路徑的模型。
簡單地說,3D技術裡的光線追蹤演算法,就是先假設螢幕內的世界是真實的,顯示器是個透明的玻璃,只要找到螢幕內能透過人眼的光線,加以追蹤就能構建出完整的3D畫面。
說到光線追蹤,就不得不提光柵化。
光柵化是指把景物模型的數學描述及其色彩資訊轉換至計算機螢幕上畫素的過程。使用光柵化,我們可以將幾何圖形轉化成螢幕上的畫素。
Direct3D使用掃描線的渲染來產生畫素。當頂點處理結束之後,所有的圖元將被轉化到螢幕空間,在螢幕空間的單位就是畫素。點,線,三角形透過一組光柵規則被轉化成畫素。光柵規則定義了一套統一的法則來產生畫素。光柵得到的畫素一般會攜帶深度值,一個RGB Adiffuse顏色,一個RGB specular顏色,一個霧化係數和一組或者多組紋理座標。這些值都會被傳給流水線的下一個階段畫素的處理,然後注入到渲染目標。由於實時3D渲染程式要求對使用者的即時操作做出迅速反應,因此通常要求每秒至少20幀以上的渲染速率,這也使得高效率的“光柵化”渲染技術成為當今最受青睞的3D即時成像技術。但是光柵化的缺點也很明顯,那就是無法計算真實的光線,導致很多地方失真。
光線追蹤演算法分為兩種:正向追蹤演算法和反向追蹤演算法。
其中,正向追蹤演算法是大自然的光線追蹤方式,即由光源發出的光經環境景物間的多次反射、透射後投射到景物表面,最終進入人眼。
反向追蹤演算法正好相反,它是從觀察者的角度出發,只追蹤那些觀察者所能看見的表面投射光。就目前而言,所有3D製作軟體的光線追蹤演算法都是採用反向追蹤法,原因是這種演算法能夠最大程度地節省計算機的系統資源,而且不會導致渲染質量的下降。
在現實世界中射到物體表面上通常有三種情況:折射,反射,吸收。光線在經過反射到不同的地方,被選擇性吸收,從而光譜發生改變,再多次反射與折射,最終進入我們自己的眼睛。而光線追蹤技術要做的就是模擬這一過程。
在渲染中,光線追蹤會賦予每一個畫素幾條甚至幾十條光線,然後光在場景中傳播,與場景中各個物體產生交匯,而場景中的物體在事先就已經被開發者設定好了屬性,從而導致光束髮生各種改變,最終聚集在螢幕上。從而被我們感知。
而反向追蹤方式則是計算最終射入我們眼睛的光線的反向光路,即眼睛—物體—光源的過程。因為這麼做的話,可以省掉很多並不需要計算的光路,在光線追蹤中,並不是每一束光都有用。有些光最終並沒有射入我們自己的眼睛,但是如果依舊計算的話就會造成不必要的計算資源浪費。在光線追蹤中,光同樣也被分類,假設一條主光線是不可見的,那麼系統則會拋棄掉整條光路,如果可見的話,那麼輔助光線(反射,折射,陰影)的計算就開始了。在完成主光線的判別之後,輔助光線的其他屬性(透明度,色彩)操作也已經基本完成了。
| 光線追蹤在圖形渲染中的應用將光線追蹤演算法應用於圖形渲染最初是由Arthur Appel於1968年提出,那時還叫ray casting。
1979年Turner Whitted帶來了新的研究突破:遞迴光線追蹤演算法《Recursive RayTracing Algorithm》。
1984年,Carpenter等人發表了一篇分散式光線追蹤的論文《Distributed RayTracing》,影響甚廣。發展到今天,大多數的照片級渲染系統都是基於光線追蹤演算法的。基本的光線追蹤演算法並不難,相信大部分計算機圖形學的同學都寫過的,難的是如何最佳化提高效率。
說到皮克斯直到《汽車總動員》才開始大規模使用光線追蹤。皮克斯的《汽車總動員》於2006年6月在美國上映,如今已經8年多過去了。皮克斯一直使用的是自家開發的渲染器RenderMan,基於REYES(Renders Everything You Ever Saw)。
REYES是另一種渲染演算法,它對於處理複雜場景非常高效。
1984年的時候皮克斯有考慮過光線追蹤,但最終還是堅持使用REYES。那篇關於《汽車總動員》的論文《RayTracing for the Movie“Cars”》裡提到五年前他們就啟動了新增光線追蹤功能到RenderMan這個專案,同期《汽車總動員》正在製作中。REYES在處理反射強烈的汽車表面材質方面有些捉襟見肘,只能用環境貼圖,但仍然達不到光滑閃耀的質感。而這正是光線追蹤擅長的。
下面介紹幾個使用光線追蹤的主流渲染器:
Mentalray,NVIDIA出品,已經整合到3D建模軟體Autodesk的Maya和3ds Max中。
Arnold近些年日漸風行,Sony Pictures Imageworks,Digital Domain,ILM,Luma Pictures等著名特效公司均有使用該渲染器。
VRay,比Arnold大眾一點,近幾年也在瘋長,它目前有CPU版本和GPU版本(V-Ray和V-Ray RTGPU)。
光線追蹤目前多用於影視特效中做靜幀渲染,但對大眾最有影響的3D圖形遊戲領域顯然還沒有光線追蹤的蹤影,這是為什麼呢?
光線追蹤遲遲不能應用在遊戲行業中的原因很簡單——它那恐怖的計算量。即便是用了反向追蹤演算法之後也是如此。
根據Intel的說法,要用光線追蹤渲染出達到現代遊戲的畫面質量,同時跑出可流暢執行的幀數,每秒需要計算大概10億束光線。這個數字包括每幀每畫素需要大概30束不同的光線,分別用來計算著色、光照跟其它各種特效,按照這個公式,在1024×768這樣的入門級解析度下,一共有786432個畫素,乘以每畫素30束光線以及每秒60幀,我們就需要每秒能運算141.5億束光線的硬體。
而即便到了今天,頂級的Corei7每秒能處理的光線還不足千萬條。而且這只是運算量上的差距,由於光線追蹤的輔助光線每一條都沒有任何相關性,這意味著包括各種快取技術在內的“投機取巧”方式都沒有用武之地,計算光線追蹤輔助光線的所有的計算都將直接讀取記憶體,這對於記憶體延遲和頻寬來說都是驚人的考驗。而且對於視訊記憶體容量也是一個不小的挑戰,十幾甚至幾十GB的視訊記憶體會變的非常有必要。
雖然在遊戲領域引入光線追蹤是有極大挑戰的事情,但這項技術一直有研究機構和圖形處理器廠商在投入研究。光線追蹤若想要應用到遊戲中就需要做到實時渲染,就是大家所說的實時光線追蹤(Real-time raytracing)。
光線追蹤演算法前面說過了,那什麼樣才是實時的?
6FPS左右就可以產生互動感,15FPS可稱得上實時,30fps不太卡,60FPS感覺平滑流暢,72FPS再往上肉眼就已經分辨不出差別。
所謂實時就是需要達到每秒渲染30幀以上,否則就達不到畫面的流暢度要求,就沒有實用價值。實時的光線追蹤的難點就在於場景複雜度和需要的真實感渲染效果決定了遍歷和相交檢測的巨大計算量(場景分割資料結構的重構和光線與場景的相交測試是兩項主要計算)。
這是渲染領域以及任何模擬計算領域裡終極的矛盾:效率和質量的矛盾。
|實時光線追蹤技術發展歷史隨著德國薩爾蘭大學計算機圖形小組所開發的OpenRT庫的完成,光線追蹤技術應用在電腦遊戲的實時渲染中在理論上逐漸成為可能。
OpenRT函式庫是源自薩爾蘭大學的一個計算機圖形小組的實時光線追蹤專案,OpenRT實時光線追蹤專案的目標是為3D遊戲加入實時的光線追蹤效果,該專案會包含以下幾個部分:一個高效的光線追蹤處理核心、以及語法與目前OpenGL類似的OpenRT 應用程式介面,客戶程式設計師透過這部分接觸之前高效的光線追蹤處理核心的功能,並在遊戲場景設計中呼叫這些應用程式介面。
薩爾蘭大學除了開發出了OpenRT函式庫外,還設計了一個實時光線追蹤的硬體架構——SaarCOR。SaarCOR研究小組在2005年的SIGGRAPH上展示了第一個實時光線追蹤加速硬體——RPU(RayProcessingUnit)。
RPU跟GPU一樣都是完全可程式設計架構,能夠提供對材質、幾何以及光照等的實時程式設計支援。
RPU除了具有傳統GPU的高效性外,最引人矚目的就是支援光線追蹤計術。其使用的指令集跟GPU一樣,因此也能夠對著色程式做最佳化處理。
此外,由於整合了專用的硬體單元,RPU可以支援高速光線跟蹤演算法跟遞迴函式呼叫,對於遞迴光線追蹤演算法同樣行之有效。為了提高執行效率,RPU通常將4束光線打包處理,同時多執行緒計術的支援也保證了硬體資源的高效利用。
SaarCOR在SIGGRAPH 2005展示的RPU原型機用FPGA來構建,頻率執行在66MHz,記憶體頻寬也只有350MB/s,但是得益於特別設計的專用架構,其效能可以跟P42.6G的CPU跑OpenRT軟體光線追蹤的效能相媲美。
這樣的效能充分體現出RPU架構在處理光線追蹤方面的高效性,要知道NV當時的高階GPU可是具有RPU原型機23倍的浮點運算能力以及100多倍的頻寬。
更令人興奮的是,由於光線追蹤特別適用於並行處理的天生特性,RPU可以像CPU一樣採用多核架構,原型機可以搭配不同數量的FPGA晶片,比如兩片FPGA就可以提供雙倍於單FPGA的運算能力,而SaarCOR試驗室已經測試過四FPGA的原型機。
就在SaarCOR展示了RPU之後不久,這個研究計劃的人員接觸到了IBM德國的技術人員,獲得了一臺擁有一枚CELL處理器的工程樣機。在IBM技術人員的協助下,SaarCOR在短短兩週的時間裡就在這臺機器上實現了全屏的實時光線追蹤渲染效果。SaarCOR的研究人員目前已經在Cinema 4D上以外掛方式實現了實時光線追蹤。他們還透露了另外一個鮮為人知的訊息,那就是SaarCOR其實獲得了NVIDIA2.5萬美元的贊助,之前的FPGA原型其實就是在NVIDIA資助下進行的。SaarCOR至今未能量產,隨後SaarCOR專案併入了OpenRT光線追蹤開發專案中。
早在十多年前的2004年,德國青年DanielPohl將一款電腦遊戲應用光線追蹤技術作為其學術研究專案。因為ID software的開源,所以《Quake3》成為了他的選擇,並開始移植。
他用OpenRT對其渲染核心進行改造,令人驚訝的是在《Quake3》傳統的光柵化渲染上實現光線追蹤居然顯得出奇的簡單。例如在每個畫素的動態、實時陰影僅需要10行左右的程式碼指令來描述光線追蹤的模型。光線追蹤技術的加入令整個遊戲的光影效果煥然一新。畫面甚至超過了很多後來釋出的新遊戲。之後的幾年裡,DanielPohl更將注意力放到了《Quake4》、《QuakeWar》等遊戲上,試圖在這些遊戲中實現實時光線追蹤演算法。有趣的是,DanielPohl的實時光線追蹤技術完全不依賴於GPU,僅僅是藉助多核CPU的運算能力。也正因為如此,DanielPohl隨後被Intel高薪聘用,正式加盟其“視覺運算部”,由此可以看出Intel決心令實時光線追蹤成為現實。
Intel想進軍獨立顯示卡市場已經不是一天兩天了。上世紀末intel就曾經出過一款獨顯,名叫i740。但是也僅僅就這一款而已。一心想要重返顯示卡市場的intel想以光線追蹤來抗衡AMD與NVIDIA,所以研究光線追蹤的天才程式設計師DanielPohl被intel收歸門下,進行顯示卡的開發。
在2007年的IDF上,Intel正式揭開獨立顯示卡——代號“Larrabee”的神秘面紗,Larrabee隸屬於其萬億次運算專案(Tera-scale),也將是Intel的第一款實用級萬億次運算處理器,其處理能力“大大超過”一萬億次浮點每秒;根據Intel首席架構師EdDavis的簡報,Larrabee基於可程式設計架構,主要面向高階通用目的計算平臺,至少有16個核心,主頻1.7-2.5GHz,功耗則在150W以上,支援JPEG紋理、物理加速、反鋸齒、增強AI、光線追蹤等特性。
由於天生的CPU傳統架構血統,Larrabee特別適合用來計算光線追蹤。
在IDF2007的技術演示中,Intel也特意大張旗鼓地宣傳Larrabee在實時光線追蹤領域所取得的最新成就。但是Larrabee卻並沒有想象中的那麼順利,在2009年的IDF大會上,我們看到了新的Corei7系列,Atom雙核,而Larrabee卻被冷落在一旁,這不得不令人惋惜。、
作為一款中途夭折的產品,Larrabee在很多人的心目中應該一直都保留著幾分神秘色彩,最後該專案的不了了之,還是給實時光線追蹤的發展帶來了些許遺憾。大家也都知道最後Larrabee的技術是用到了“眾核架構”(MIC)的XeonPhi協處理器當中,成為Intel在高效能運算領域和GPU廠商的加速卡競爭的利器
就在Larrabee專案中途夭折以後,實時光線追蹤技術似乎裹足不前了。但在2009年3月,一家名不見經傳的初創公司CausticGraphics突然浮出水面,帶來了一種具有突破性意義的實時光線追蹤軟硬體解決方案,號稱可提速200倍,業內震驚。
其管理團隊聚集了來自蘋果、Autodesk、ATI、Intel、NVIDIA等業界巨頭的技術與圖形專家,三位創始人James McCombe、Luke Peterson、Ryan Salsbury曾經在蘋果共事,其中McCombe被譽為是OpenGL世界的“第三號人物”,同時也是iPhone、iPod等嵌入式、低功耗平臺光柵化渲染演算法的首席架構師。
CausticGraphics聲稱一舉解決了光線追蹤演算法效率低下的難題。
根據該公司的說法,他們的演算法之所以獨特是因為它解決了傳統光線追蹤演算法偏向隨機性的問題。新演算法大幅提高了光線追蹤計算的區域性性,但這部分的演算法需要一顆協處理器來完成。CausticGraphics的工程師們相當明智,他們對於該硬體的定位僅僅是一顆專注於光線追蹤運算的協處理器,而絕不會幹越俎代庖的蠢事,著色之類的傳統光柵化處理依舊由GPU來完成。
除此以外,在2009年8月的SIGGRAPH會議上,圖形處理器巨頭Nvidia釋出了OptiX,這是一個基於Nvidia GPU的實時光線追蹤加速引擎。
在功能上,Optix引擎與前面介紹的OpenRT類似,都是一組光線追蹤的函式庫,Nvidia在介紹中說optix引擎基於CUDA架構,開發者可以使用C語言程式設計,創造出基於GPU運算的光線追蹤應用。我們有足夠的理由相信,Optix所用的光線追蹤模型,極有可能與SAARCOR的OpenRT引擎相同,或者說OPTIX只是OpenRT的NVIDIA商用化版本。但由於光線追蹤的演算法和傳統光柵化處理演算法區別較大,現有SIMD架構的GPU核心在計算光線追蹤演算法時的效率不高,完全用傳統GPU來加速光線追蹤的做法至今也沒有成功進入遊戲領域。
另外,NVIDIA目前已經有virtual GPU技術,類似於雲端計算,不需要本地的GPU,但該技術進入大眾消費市場應該還有很長的路要走。
| Imagination夢想照進現實可能很多人不知道的是,在移動GPU領域呼風喚雨的另一個隱形巨頭Imagination,其實也在努力摘取這個3D影像處理皇冠上的明珠,只不過它的做法比較出人意料,在2010年底突然收購了前文介紹過的創業公司Caustic Graphics,並在2013年初推出了光線追蹤專用加速卡,不過該產品只針對專業市場,並未掀起業界的大波瀾。但在去年3月的GDC2014遊戲開發者大會上,Imagination正式釋出了全新的“PowerVR Wizard”GPU家族,號稱可在適合移動、嵌入式應用的功耗水平下,提供高效能的光線追蹤、圖形和計算能力,這次真正震動了業界(筆者看到這個新聞的時候的確是不敢相信)。
新家族的第一名成員是PowerVR GR6500,基於最新一代的四陣列移動GPU PowerVR Rogue設計而來,整合了PowerVR Series6 XT系列的所有特性,並加入了強大的光線追蹤硬體加速電路。
硬體的最佳化可以分為採用GPU和SIMD的最佳化以及專門的光線追蹤硬體。前者就是對軟體演算法進行針對GPU或SIMD的最佳化,同時一些並行環境下的數學庫函式和其他基本演算法,如排序等也間接起到了加速的作用。後者就是指將光線追蹤中獨有的相交檢測,場景分割等部分採用專門的硬體來最佳化,G6500就是使用後面一種最佳化,這些專用加速電路包括:
光線資料主控(Ray Data Master):為主排程器提供光線互動資料,準備給著色器執行,並評估光線的最終資料屬性。
光線追蹤單元(Ray Tracing Unit):使用固定函式(不可程式設計)執行光線追蹤遍歷佇列,並彙總光線一致性,以降低功耗和頻寬需求。
場景層次生成器(Scene Hierarchy Generator):加速動態物體的更新。
幀收集器快取(Frame Accumulator Cache):提供對幀緩衝的寫入合併鬆散式訪問。
從晶片的架構圖圖可以看出,所有這些設計都可以和GPU架構的其他模組高效整合、完美通訊,生成實時、互動的光線追蹤畫面,而且不僅適用於移動、嵌入式平臺,還能擴充套件到主機和主流遊戲PC。更重要的是,這些模組不會影響傳統圖形流水線的著色效能,因為它們並非依賴著色器的浮點效能來執行光線追蹤,效率最多可以達到純GPU計算或者軟體演算法的100倍。
那麼,PowerVR GR6500的光線追蹤效能究竟如何呢?
Imagination宣稱,600MHz頻率下每秒可追蹤最多3億束光線,進行240億次節點測試,生成1億個動態三角形。由於還沒有實體的晶片問世,現在只有理論數值。當年Caustic Graphics曾經透露,完全光線追蹤化的遊戲引擎還得等很多年,並估計至少四五年後他們的硬體才能在1920×1080解析度下達到60FPS的有效幀率。
當時是2009年,這兩年正好是這個時候,我們相信由於Imagination的支援,效能應該能夠達到當年Caustic Graphics的預測水平,從而達到主流遊戲的執行要求。
Imagination還開發了跨平臺的OpenRL API,並放出了SDK,希望開發人員能夠參與其中。
據說OpenRL還在申請成為國際標準,希望成為OpenGL這樣的跨平臺標準API。當然這個API也是來自於原來Caustic Graphics的軟體開發層Caustic GL,由於其創始人具有非常強的OpenGL專業背景,Caustic並沒有自己去開發一套專用的API,而是基於OpenGL ES2.0編寫擴充套件子集,並將其命名為Caustic GL。
採用OpenRL的最大優勢,就是允許開發人員像往常編寫著色程式那樣來編寫新的光線追蹤著色程式,而一些原本非常複雜的光影著色程式(用於建立複雜的光照跟投影效果)則可以由簡單的光線追蹤著色程式來代替,這樣既可以減輕程式設計師的負擔還可以提升硬體效率。
開發人員還可以將OpenRL與其他圖形API相結合,比如OpenGL3/3.1,未來甚至能夠與DX混合呼叫。另一個有趣的特性是OpenRL並非光線追蹤硬體加速電路專用,它同樣支援GPU,所以在沒有硬體加速電路的系統裡,光線追蹤計算也可以交由GPU來負責,當然效率將大打折扣。
從以上的介紹我們可以看出Imagination已經徹底把CausticGraphics的軟硬體技術整合到自己的GPU裡面,並由此提供了極具競爭力的實時光線追蹤效能,而仍舊保持了低功耗和低成本的特色,將會給整個圖形市場帶來顛覆性的影響。
移動GPU第一次走在了桌面GPU的前面,相信這對於Imagination擴大整體GPU市場佔有率會帶來極大的推動力。Imagination也可以藉此進入被NV和AMD所把持的桌面和專業圖形市場。
當年ARM處理器由於效能不佳,只能退守深耕移動和嵌入式市場,不料反倒獲得巨大成功成為當代最有影響力的處理器指令集架構,甚至開始進軍桌面和伺服器市場,Imagination似乎也開始走上了這條逆襲之路。