即時渲染視訊級別的電腦三維圖形,是計算圖形領域的終極目標,與現在普遍使用的光柵化渲染技術相比,「光線追蹤」普遍被視為視覺技術的未來方向,可帶來近乎真實的真正電影級圖形和光影物理效果,光線追蹤演算法是達到這個目標的聖杯,經過幾十年的努力,終於要接近這個理想了。
| 光線追蹤的定義和原理
精美的CG效果圖,與真實,相信大家對這些並不陌生。而大家在遊戲中對水面之類的場景並不陌生,不過它所生成的畫面效果,好像永遠都不那麼真實。即使人們盡再大的努力,它的畫面始終還是動畫,和人們心目中的“電影級別的畫質”總是差那麼一點。這是因為,我們目前的遊戲,無一例外都在使用光柵化演算法。而在這些電影中,則採用的是光線追蹤演算法。
在3DSMax、Maya、SoftimageXSI等軟體中,也都無一例外地採用了這一演算法。
光線追蹤技術是由幾何光學通用技術衍生而來。它通過追蹤光線,與物體表面發生的交互作用,得到光線經過路徑的模型。
簡單地說,3D技術裡的光線追蹤演算法,就是先假設螢幕內的世界是真實的,顯示器是個透明的玻璃,只要找到螢幕內能透過人眼的光線,加以追蹤就能構建出完整的3D畫面。
說到光線追蹤,就不得不提光柵化。
光柵化是指把景物模型的數學描述,及其色彩資訊轉換至電腦螢幕上像素的過程。使用光柵化,我們可以將幾何圖形轉化成螢幕上的像素。
Direct3D使用掃描線的渲染來產生像素。當頂點處理結束之後,所有的像素將被轉化到螢幕空間,在螢幕空間的單位就是像素。點,線,三角形通過一組光柵規則被轉化成像素。光柵規則定義了一套統一的法則來產生像素。光柵得到的像素一般會攜帶深度值,一個RGB Adiffuse顏色,一個RGB specular顏色,一個霧化係數和一組或者多組紋理座標。這些值都會被傳給流水線的下一個階段像素的處理,然後注入到渲染目標。
由於即時3D渲染程式,要求對使用者的即時操作做出迅速反應,因此通常要求每秒至少20幀以上的渲染速率,這也使得高效率的“光柵化”渲染技術,成為當今最受青睞的3D即時成像技術。但是光柵化的缺點也很明顯,那就是無法計算真實的光線,導致很多地方失真。
光線追蹤演算法分為兩種:正向追蹤演算法和反向追蹤演算法。
其中,正向追蹤演算法是大自然的光線追蹤方式,即由光源發出的光,經環境景物間的多次反射、透射後投射到景物表面,最終進入人眼。
反向追蹤演算法正好相反,它是從觀察者的角度出發,只追蹤那些觀察者所能看見的表面投射光。就目前而言,所有3D製作軟體的光線追蹤演算法,都是採用反向追蹤法,原因是這種演算法,能夠最大程度地節省電腦的系統資源,而且不會導致渲染品質的下降。
在現實世界中,射到物體表面上通常有三種情況:折射,反射,吸收。光線在經過反射到不同的地方,被選擇性吸收,從而光譜發生改變,再多次反射與折射,最終進入我們自己的眼睛。而光線追蹤技術要做的就是模擬這一過程。
在渲染中,光線追蹤會賦予每一個像素幾條,甚至幾十條光線,然後光在場景中傳播,與場景中各個物體產生交匯,而場景中的物體,在事先就已經被開發者設置好了屬性,從而導致光束發生各種改變,最終聚集在螢幕上。從而被我們感知。
而反向追蹤方式則是,計算最終射入我們眼睛的光線的反向光路,即眼睛—物體—光源的過程。因為這麼做的話,可以省掉很多並不需要計算的光路,在光線追蹤中,並不是每一束光都有用。有些光最終並沒有射入我們自己的眼睛,但是如果依舊計算的話,就會造成不必要的計算資源浪費。
在光線追蹤中,光同樣也被分類,假設一條主光線是不可見的,那麼系統則會拋棄掉整條光路,如果可見的話,那麼輔助光線(反射,折射,陰影)的計算就開始了。在完成主光線的判別之後,輔助光線的其他屬性(透明度,色彩)操作也已經基本完成了。
| 光線追蹤在圖形渲染中的應用
將光線追蹤演算法應用於圖形渲染,最初是由Arthur
Appel於1968年提出,那時還叫ray casting。
1979年Turner Whitted帶來了新的研究突破:遞迴光線追蹤演算法《Recursive Ray Tracing Algorithm》。
1984年,Carpenter等人發表了一篇分散式光線追蹤的論文《Distributed Ray Tracing》,影響甚廣。發展到今天,大多數的照片級渲染系統,都是基於光線追蹤演算法的。基本的光線追蹤演算法並不難,相信大部分電腦圖形學的同學都寫過的,難的是如何優化提高效率。
說到皮克斯直到《汽車總動員》才開始大規模使用光線追蹤。皮克斯的《汽車總動員》於2006年6月在美國上映,如今已經8年多過去了。皮克斯一直使用的是自家開發的渲染器RenderMan,基於REYES(Renders Everything You
Ever Saw)。
REYES是另一種渲染演算法,它對於處理複雜場景非常高效。
1984年的時候皮克斯有考慮過光線追蹤,但最終還是堅持使用REYES。那篇關於《汽車總動員》的論文《Ray Tracing 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(Ray Processing Unit)。
RPU跟GPU一樣都是完全可程式設計架構,能夠提供對材質、幾何以及光照等的即時程式設計支持。
RPU除了具有傳統GPU的高效性外,最引人矚目的就是支持光線追蹤計術。其使用的指令集跟GPU一樣,因此也能夠對著色程式做最佳化處理。
此外,由於整合了專用的硬體單元,RPU可以支援高速光線跟蹤演算法,跟遞迴函數調用,對於遞迴光線追蹤演算法同樣行之有效。為了提高執行效率,RPU通常將4束光線打包處理,同时多线程计术的支持,也保證了硬體資源的高效利用。
SaarCOR在SIGGRAPH 2005展示的RPU原型機用FPGA來構建,頻率運行在66MHz,記憶體頻寬也只有350MB/s,但是得益於特別設計的專用架構,其性能可以跟P4 2.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其實獲得了NVIDIA 2.5萬美元的贊助,之前的FPGA原型其實就是在NVIDIA資助下進行的。SaarCOR至今未能量產,隨後SaarCOR專案併入了OpenRT光線追蹤開發專案中。
早在十多年前的2004年,德國青年 Daniel Pohl將一款電腦遊戲,應用光線追蹤技術作為其學術研究專案。因為ID software的開源,所以《Quake3》成為了他的選擇,並開始移植。
他用OpenRT對其渲染核心進行改造,令人驚訝的是在《Quake3》傳統的光柵化渲染上,實現光線追蹤,居然顯得出奇的簡單。例如在每個像素的動態、即時陰影僅需要10行左右的代碼指令,來描述光線追蹤的模型。光線追蹤技術的加入,令整個遊戲的光影效果煥然一新。畫面甚至超過了很多後來發佈的新遊戲。
之後的幾年裡,Daniel Pohl更將注意力放到了《Quake 4》、《Quake War》等遊戲上,試圖在這些遊戲中,實現即時光線追蹤演算法。有趣的是,Daniel Pohl的即時光線追蹤技術完全不依賴於GPU,僅僅是借助多核CPU的運算能力。也正因為如此,Daniel Pohl隨後被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月,一家名不見經傳的初創公司Caustic Graphics突然浮出水面,帶來了一種具有突破性意義的即時光線追蹤軟硬體解決方案,號稱可提速200倍,業內震驚。
其管理團隊聚集了來自蘋果、Autodesk、ATI、Intel、NVIDIA等業界巨頭的技術與圖形專家,三位元創始人James McCombe、Luke Peterson、Ryan Salsbury曾經在蘋果共事,其中McCombe被譽為是OpenGL世界的“第三號人物”,同時也是iPhone、iPod等嵌入式、低功耗平臺光柵化渲染演算法的首席架構師。
CausticGraphics聲稱,一舉解決了光線追蹤演算法效率低下的難題。
根據該公司的說法,他們的演算法之所以獨特,是因為它解決了傳統光線追蹤演算法,偏向隨機性的問題。新演算法大幅提高了光線追蹤計算的局部性,但這部分的演算法需要一顆輔助處理器來完成。
Caustic Graphics的工程師們相當明智,他們對於該硬體的定位僅僅是一顆專注於光線追蹤運算的輔助處理器,而絕不會幹越俎代庖的蠢事,著色之類的傳統光柵化處理依舊由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似乎也開始走上了這條逆襲之路。
(藉這篇文章紀念以前佳鋒科技總經理劉鴻鈞先生,他是台灣在影像晶片運算的專家。)
0 comments:
張貼留言