閆 潤,黃立波,郭 輝,王永鑫,張鑫鋮,張鴻儒
國防科技大學(xué) 計算機學(xué)院,長沙410073
渲染是將三維場景的描述轉(zhuǎn)換為二維圖像的過程。在動畫[1-2]、電影特效[3]、高端游戲[4]、幾何建模、紋理處理等應(yīng)用中都必須通過某種形式的渲染過程傳遞3D 場景的結(jié)果。渲染主要包括光柵化(rasterization)[5]和光線追蹤[6]兩種方式。光柵化渲染采用局部光照原理,根據(jù)光源照射到物體上直接可見的光照效果,將場景中的幾何圖元映射到圖像的像素點上。這種方式用硬件實現(xiàn)較為簡單,且便于并行處理,通常用作實時渲染處理。光線追蹤采用全局光照模型,通過物理原理對光線和物質(zhì)之間的交互行為進行建模,不僅考慮直接光照的效果,也考慮物體間相互光照影響,比傳統(tǒng)的光柵化渲染效果更加立體,色彩更柔和更逼真,通常用于離線渲染處理。兩種渲染方式的區(qū)別如圖1 所示。
圖1 光柵化與光線追蹤Fig.1 Rasterization and ray tracing
由于光線追蹤渲染計算量巨大且非常耗時,實時光線追蹤存在很多挑戰(zhàn)。首先,光線追蹤算法需要迭代測試光線與場景圖元是否相交,并計算光線與圖元的最近交點,這個計算量是巨大的;其次,光線的反射和折射會產(chǎn)生大量的二次光線(secondary rays),這些光線隨著迭代次數(shù)的增加會變得越來越不連續(xù)(incoherent),不規(guī)則的內(nèi)存訪問會導(dǎo)致帶寬的瓶頸。針對這些問題,研究者做了大量的工作,為給后續(xù)研究者提供參考。本文從商用光線追蹤平臺、算法優(yōu)化、硬件優(yōu)化三方面綜述光線追蹤的發(fā)展,并對未來可能的研究方向做出展望。
1979 年Whitted[6]利用光線的可逆性,提出了光線追蹤算法。這個算法模擬真實的光照效果,在場景中的光線與物體相交后會因反射、折射和陰影等產(chǎn)生二次光線,二次光線再次到場景中進行相交測試。如此進行迭代計算,直到光線的反彈次數(shù)達到預(yù)期設(shè)置的值。
光線追蹤的本質(zhì)在于尋找與光線相交的最近物體。為了加快遍歷速度,最初的方式是有規(guī)律地劃分空間網(wǎng)格(grid)[7-8],但這種方法存在著空間劃分不合理、冗余計算較多等問題。在后續(xù)的研究中提出加速數(shù)據(jù)結(jié)構(gòu)(acceleration structure)的概念,其思路是將場景中的圖元劃分到不同的分層空間結(jié)構(gòu)(hierarchical spatial structure)中,在這種結(jié)構(gòu)下,可以快速剔除那些不相關(guān)的空間,進而識別出與光線最接近的圖元?,F(xiàn)在廣泛應(yīng)用在學(xué)術(shù)界和工業(yè)界的是一種樹形數(shù)據(jù)結(jié)構(gòu),樹的葉節(jié)點包含所有場景圖元,樹的內(nèi)部節(jié)點用于將一個較大的空間表示細分為多個較小的空間區(qū)域kd-tree[9]或?qū)鼍爸械膶ο蠓纸鉃楦〉膶ο蠹螧VH(bounding volume hierarchy)[10]。為簡化運算,通常采用軸對齊邊界框(axis-aligned bounding box,AABB)進行場景的劃分。
kd-tree 之前被認為是最適合光線追蹤的加速數(shù)據(jù)結(jié)構(gòu)[11],但由于kd-tree 在判斷包圍盒與圖元是否有交集等方面存在的局限性,越來越多的研究傾向于使用BVH。相比kd-tree,BVH 有著可預(yù)測內(nèi)存、更好的魯棒性、更有效的遍歷和多變的構(gòu)建算法等[12]優(yōu)勢,使得BVH 成為離線和實時渲染領(lǐng)域應(yīng)用的標準加速數(shù)據(jù)結(jié)構(gòu)。
現(xiàn)代計算機、移動平臺和游戲機使用GPU 進行渲染,為滿足日益增長的視覺需求,GPU 已經(jīng)成為最強大的單芯片計算單元。GPU 通常分為兩類,通用GPU 和移動端GPU,這兩種GPU 是針對不同應(yīng)用場景和硬件資源約束下設(shè)計的。前者允許更高的硬件開銷來追求高性能,而后者需要考慮能耗開銷的限制。目前,NVIDIA 和AMD 是高端通用GPU 的兩大廠商,Intel 在中低端GPU 市場占有相當大的份額。移動端GPU 市場主要包括Imagination Technologies(Power VR)、ARM(Immortalis)和Qualcomm(Snap-Dragon)等。本文選擇NVIDIA Ampere 架構(gòu)[13]、AMD RDNA 2 架 構(gòu)[14]和Imagination PowerVR Photon 架 構(gòu)[15]進行介紹。
NVIDIA 于2018 年在Turing 架構(gòu)[16]中推出初代RT core,RT core 被集成到Turing 架構(gòu)的流多處理器(streaming multiprocessors,SM)中。在2021 年推出的Ampere 架構(gòu)[13]對初代RT core 進行了升級,該架構(gòu)的GPU 集成了84 個二代RT core,相對于初代RT core,光線與三角形相交測試的速率提升了一倍。二代RT core見圖2[13]。
圖2 二代RT coreFig.2 The second generation of RT core
兩代支持光線追蹤的GPU 均采用多指令多數(shù)據(jù)流(multiple-instruction,multiple-data,MIMD)架構(gòu)。RT core 可以執(zhí)行BVH 的遍歷以及光線與三角形相交測試,光線從流多處理器發(fā)送到RT core,RT core獲取并解碼BVH 的內(nèi)存,使用專用的硬件測試每條光線與BVH 的相交,判斷出當前節(jié)點是內(nèi)部節(jié)點或是葉子節(jié)點,如此迭代有選擇地找到最近的交點。確定合適的交點后,將結(jié)果返回到流多處理器進行進一步處理。二代RT core 中增加了差值三角形位置單元,主要用于光線追蹤中的運動模糊[17]功能。NVIDIA 推出的深度學(xué)習(xí)超級采樣(deep learning super sampling,DLSS)[18]技術(shù)結(jié)合GeForce RTX GPU上的Tensor Core,利用深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)來提高幀率,將視覺保真度提升至全新高度。
2020 年,AMD 不僅在游戲中引入了對實時光線追蹤的支持,而且還發(fā)布了RX 6000 系列的三款GPU。與此同時,引入一些RDNA 2 架構(gòu)設(shè)計的關(guān)鍵元素來實現(xiàn)這一功能,為了提高光線追蹤的性能,在核心計算單元設(shè)計中加入了光線加速器(ray accelerator)[14],該加速器是用于處理光線相交計算的專用硬件。RX 6600 XT 集成28 個光線加速器,2022 年推出RX 6950 XT 集成80 個光線加速器。RDNA 2 架構(gòu)采用了AMD Infinity Cache 的高效緩存技術(shù),能夠以低功耗和低延遲提供卓越的帶寬性能,整個顯卡核心均可訪問這個全局高速緩存。除此之外,還采用了AMD FidelityFXTMSuper Resolution(FSR)[19]的優(yōu)化升級技術(shù),能夠在無需用戶升級顯卡的情況下幫助提高部分游戲的幀率,帶來高質(zhì)量、高分辨率的游戲體驗。
2016 年,Imagination 公司推出了世界上首個滿足實時光線追蹤的加速器專用芯片。2021 年,Imagination 將PowerVR Photon 架構(gòu)[15]的光線加速集群(ray acceleration cluster,RAC)加入到C 系列的GPU中,為手機市場提供光線追蹤的IP 技術(shù)。
在IMG CXT 中,使用RAC 來完成所有的光線追蹤活動,示意圖可見圖3[15]。本文對RAC 的主要模塊進行簡要說明。每個RAC 包含多個光線測試單元(ray testing units),也即框圖中的BTU(box tester unit)、DTTU(dual triangle tester unit)和PTU(procedural tester unit),這個模塊主要完成光線和BVH 的遍歷和光線與圖元的測試。為了提高執(zhí)行效率,在硬件上設(shè)計了高度并行的“雙三角形測試(DTTU)單元”,可以同時進行光線對兩個三角形的相交測試,并將測試結(jié)果用于過程性測試單元(procedural tester unit),過程性測試單元主要用于與API 的交互著色;光線存儲(ray store)單元用于保證RAC 中所有單元的高帶寬讀寫訪問;連續(xù)光線束收集(packet coherence gather)單元主要用來分析所有活躍的光線,并創(chuàng)造軌跡相似的連續(xù)(coherence)光線的分組,這里涉及到光線重排序的概念,具體內(nèi)容將在本文3.3 節(jié)中進行描述。光線任務(wù)調(diào)度(ray task scheduler)單元主要負責RAC 與GPU 的交互以及RAC 內(nèi)部各處理階段之間的協(xié)調(diào)通信。Power VR 架構(gòu)包括許多受專利保護的創(chuàng)新,其中包括延遲渲染(tile-based deferred rendering,TBDR)技術(shù)、Imagination 圖像壓縮(IMGIC)技術(shù)、去中心化多核(decentralised multi-core)技術(shù)等。
圖3 Imagination PowerVR RAC 架構(gòu)Fig.3 Architecture of imagination PowerVR RAC
Imagination Power IMG CXT 的GPU 分為單核和多核兩款,分別應(yīng)用于移動端配置和非移動端配置,峰值性能可以達到1.3 Gray/s和7.8 Gray/s。
表1 列出了三款GPU 的詳細對比數(shù)據(jù)??梢钥闯?,AMD RX 6900 XT 系列光線加速器與NVIDIA GeForce RTX30 系列RT core 相比在光線追蹤功能上相似,但RT core 已經(jīng)是第二代產(chǎn)品,在技術(shù)和架構(gòu)上都有了很多改進,包括使用GPU 中的Tensor Core 利用DLSS 技術(shù)擴展性能,這使得RT core 比AMD 的光線加速器實現(xiàn)更高效、更強大的光線追蹤性能。AMD 的RX 6950 XT 采用了更先進的工藝,具有更高的時鐘頻率。NVIDIA 的GeForce RTX 3090 Ti 擁有更強大的性能和幾乎兩倍的內(nèi)存帶寬。另一個主要區(qū)別是功耗,NVIDIA 的GPU 比AMD 的多出115 W的功率。除此之外,二者的價格差距也非常明顯,NVIDIA GeForce RTX 3090 Ti 價格約為AMD RX 6950 XT 價 格 的1.7 倍。Imagination PowerVR 架 構(gòu) 主要面向移動端的IP 市場,相對于兩款桌面系統(tǒng)的GPU 性能稍差,但是由于其架構(gòu)的優(yōu)異性,可以預(yù)見,將來會廣泛應(yīng)用在移動端市場。
表1 支持光線追蹤GPU 的比較Table 1 Comparison of supporting ray tracing GPU
由于光線追蹤算法需要遞歸地檢查光線與加速數(shù)據(jù)結(jié)構(gòu)和圖元的相交,最終找到與光線相交最近的圖元,這個過程運算量大耗時長。為滿足實時性需求,研究者提出了基于硬件架構(gòu)的算法優(yōu)化方法,包括光線束并行、無棧遍歷、光線重排序和多分支BVH 等。另一方面,將降噪技術(shù)和神經(jīng)網(wǎng)絡(luò)技術(shù)與光線追蹤相結(jié)合,可以實現(xiàn)更好的交互性和實時性。
在早期利用單指令多數(shù)據(jù)流(single-instruction,multiple-data,SIMD)架構(gòu)進行光線遍歷的方法中,光線束是最簡單的并行組織形式,將多條光線當作一個光線束,調(diào)度到GPU 的線程束(warp)或CPU 的不同線程中進行處理,不同光線共享遍歷棧。因此同一個光線束遍歷的順序是一致的。只要其中的一條光線與某個節(jié)點相交,那么整個光線束都遍歷該節(jié)點的子樹,如圖4 所示。光線會訪問一組節(jié)點,包括它們不相交的節(jié)點,如果光線的連續(xù)性很好,那么這種方式性能會十分理想,但是如果連續(xù)性較差,那么執(zhí)行效能會因為冗余的計算大打折扣,此外該方式的性能也受到內(nèi)存帶寬的限制。
圖4 光線束遍歷Fig.4 Ray packet traversal
Wald等[20]使用CPU 的SSE(streaming SIMD extensions)向量指令最早提出了光線束的遍歷算法,連續(xù)光線和陰影光線性能得到了巨大提升。Boulos 等[21]主要探索在BVH 作為加速數(shù)據(jù)結(jié)構(gòu)的情況下,將二次光線分成陰影光線、反射光線和折射光線三種光線束來進行光線追蹤,使得光線束的組合更加合理,性能得到較大的提升。Gunther 等[22]采用了BVH 在GPU 上進行光線束的并行處理,同時利用GPU 快速構(gòu)建BVH,通過實驗結(jié)果來看,渲染速度在1 024×1 024 的分辨率下,可以達到3 FPS(frame per second)。Mansson 等[23]探索了使用不同的方式來重新組織光線束的連續(xù)性,并在研究中限制4×4 光線束,僅在文獻[24]中的算法使用。Overbeck 等[25]在總結(jié)優(yōu)化先前研究成果基礎(chǔ)上,提出了一種32×32 光線束的更寬遍歷范圍的優(yōu)化算法。Aila等[26]使用NVIDIA GTX285 GPU 對各類光線追蹤算法進行了測試。實驗數(shù)據(jù)表明,由于連續(xù)的內(nèi)存訪問,在訪問少量冗余節(jié)點的情況下,光線束的性能可能會達到模擬的最佳性能,但實際性能不如預(yù)期。一種可能的解釋是即使連續(xù)光線性能也受到內(nèi)存帶寬的限制,或者也可能是在實踐中未能充分發(fā)揮架構(gòu)的運算能力。Benthin 等[27]提出將光線束遍歷和單條光線遍歷的方式相結(jié)合,根據(jù)光線束的利用率在兩種方式之間進行切換。Fuetterling等[28]結(jié)合向量指令提出了一種新穎的單條光線遍歷的WiVe 算法,將這個算法作為塊來構(gòu)建基于光線束的遍歷用于處理連續(xù)光線。相較于經(jīng)典的光線束遍歷的方式,該方式采用了區(qū)間運算(interval arithmetic,IA)的方式減少了包圍盒相交測試的次數(shù)。根據(jù)他們的工作,總結(jié)光線束遍歷方法如表2 所示。
表2 光線束遍歷的方法Table 2 Methods of ray packet traversal
無棧遍歷算法是光線追蹤中常用的技術(shù)。這種算法的提出源于GPU 或CPU 中有限的寄存器空間,棧的編程復(fù)雜度和定制化硬件單元有限的片上存儲資源。無棧的遍歷算法帶來了兩點好處:一是按照特定的格式構(gòu)造加速數(shù)據(jù)結(jié)構(gòu)在遍歷時可以減少內(nèi)存的訪問;二是無棧的遍歷算法在GPU 平臺可以提高并行度,提升計算性能。但通常需要在加速數(shù)據(jù)結(jié)構(gòu)中設(shè)置標記位或進行冗余操作才可以完成無棧遍歷。
Smits[29]提出了無棧的方法,使用跳躍指針(skip pointers)的方式將傳統(tǒng)子節(jié)點的連接替換成命中(hit)或未命中(miss)的連接,在遍歷的過程中,選擇合適的連接。在當時的硬件體系結(jié)構(gòu)中獲得了大幅度的加速,但該方法導(dǎo)致代碼的復(fù)雜度顯著提升。Foley 等[30]最早提出了兩種基于kd-tree 的無棧遍歷方法:kd-restart 以及kd-backtrack。其中kd-backtrack 實現(xiàn)較為復(fù)雜,因此并不常用,之后的許多研究基于kdrestart 進行改進,兩種算法雖然都實現(xiàn)了遍歷加速數(shù)據(jù)結(jié)構(gòu),但是大量的重復(fù)節(jié)點遍歷,導(dǎo)致效率并不理想。Thrane 等[31]采用BVH 作為加速數(shù)據(jù)結(jié)構(gòu),指出無棧的遍歷方式會促進GPU 的高效實現(xiàn),但是受制于算法對訪存帶寬的需求,性能提升仍是有限的。Popov 等[32]提出了可以顯著提升GPU 性能的基于光線束的無棧算法。在這種算法中,采用繩索(ropes)將節(jié)點進行連接。該算法在迭代遍歷的過程中,光線束中的一些光線可能不活躍,但是在遞歸返回父節(jié)點時,會再次激活這些光線。Laine[33]采用了無堆棧的重啟軌跡技術(shù),其主要思路是從根節(jié)點多次遍歷,跳過之前訪問過的子樹,然后繼續(xù)訪問尚未訪問的子樹。為了做到這一點,每個層次結(jié)構(gòu)設(shè)置一位,在遍歷時設(shè)置一組短棧,當短棧不能被彈棧時,遍歷會重啟。Hapala 等[34]提出了一種新的迭代遍歷算法,這個算法基于三種狀態(tài),為每個節(jié)點存儲一個父指針,使用簡單的邏輯狀態(tài)推斷下一步要遍歷的節(jié)點。這就意味著整個BVH 不但可以從上到下遍歷,還可以通過父節(jié)點方向回溯,結(jié)合標記可以到達對應(yīng)的上一個待遍歷的節(jié)點。如圖5 所示,當遍歷完當前節(jié)點C之后,假設(shè)遍歷過程中記錄了節(jié)點C是較近的節(jié)點,那么需要遍歷節(jié)點F,因此可以通過讀取父節(jié)點來得到節(jié)點F的地址后繼續(xù)遍歷。如果當前節(jié)點是較遠的,可知節(jié)點N已經(jīng)遍歷過了,再根據(jù)父節(jié)點做類似的決策。但是這樣的算法缺點是顯而易見的,即每次回溯都需要讀取父節(jié)點的數(shù)據(jù),會造成冗余的讀寫操作。Binder 等[35]提出了一種具有恒定時間回溯的高效無棧算法。其主要思路是設(shè)置位集(bitset)來保存編碼的當前節(jié)點路徑,遍歷的路徑是顯式存儲的。為了在恒定時間回溯,作者提出了使用完美哈希表將編碼路徑轉(zhuǎn)換為節(jié)點索引的方法。Vaidyanathan 等[36]在文獻[33]的基礎(chǔ)上將加速數(shù)據(jù)結(jié)構(gòu)擴展到多分支BVH 無棧遍歷的光線追蹤應(yīng)用中。光線追蹤的無棧算法主要相關(guān)工作的總結(jié)與分析如表3 所示。
圖5 無棧遍歷Fig.5 Stackless traversal
表3 無棧算法的比較Table 3 Comparison of stackless approaches
現(xiàn)代光線追蹤技術(shù)如路徑追蹤由于漫反射和光澤反射會產(chǎn)生越來越不連續(xù)的光線。光線束的遍歷方法也需要連續(xù)的光線才能夠保證高性能。此外不連續(xù)的光線會造成更高的內(nèi)存帶寬、更高的cache 缺失率和計算分支。光線重排序的方法可以在一定程度上緩解這一問題。
通過不同的方法可以實現(xiàn)不連續(xù)光線的重排序,其中運用最廣泛的是將多維光線空間映射到使用標準排序算法排序鍵的一維空間,這個方法主要包括如下幾種實現(xiàn)方式:(1)源點。按照源點對光線進行重排序是最簡單的辦法,形成一個3D 空間填充曲線,得到的子集有一致的源點,但這種方法排序的光線方向可能會大相徑庭。(2)源點-方向。Reis 等[37]將方向的低位排到鍵中來參數(shù)化方向,使用這個鍵來對相同的源點進行排序,而后整合到同一個光線子集中,這個子集的光線個數(shù)是由排序鍵中表示分配的位數(shù)來確定。這種技術(shù)提高了光線的連續(xù)性,但是如果使用太多位數(shù)排序方向,光線的子集可能會覆蓋整個方向范圍。(3)方向-源點。該方法是源點-方向的一種替代方法,由Costa 等[38]提出主要用于陰影光線(shadow)和環(huán)境光遮蔽(ambient occlusion)排序,這種技術(shù)解決了排序鍵中方向和源點位數(shù)分配的問題。(4)源點-方向交叉。Aila 等[39]利用該技術(shù)研究了追蹤不連續(xù)光線的行為。該策略采用排序鍵交替編碼了源點和方向,因此它對于源點或方向占據(jù)的位數(shù)并不敏感。(5)兩點鍵排序。該方法由Moon 等[40]提出,主要通過光線源點和終點來對光線進行排序來增強它們的連續(xù)性。這種劃分方法會導(dǎo)致空間中不相交的光線子集重疊更小。但問題在于排序鍵需要知道光線的終點。(6)估計終點。Meister等[41]提出了兩種估計終點的方法。第一種是設(shè)置恒定的比例(0.25)來估計光線的長度,另一種是基于自適應(yīng)緩存之前的追蹤路徑的長度,而后采用一個空間哈希表來評估。基于上述幾種評估方法,文獻[41]采用RTX 2080Ti GPU 進行了性能測試比較??梢园l(fā)現(xiàn),通過光線重排序的方法使用DirectX[42]性能可以提高1.4 到2.0 倍,OptiX[43]可以提高1.3 到1.9 倍。不同方式在相同硬件下測算性能可見表4[41]。由于對光線排序需要大量的運算,在實踐中收益可能不如表中的數(shù)據(jù)明顯。由此可以看出,設(shè)計定制化的光線重排序硬件將對實時光線追蹤產(chǎn)生深遠的意義。
表4 不同方法光線重排序效率比較Table 4 Performance comparison of different approaches for ray reorder
為了解決非連續(xù)光線的問題,研究人員提出了多分支(wide)BVH 的概念,該方法在每次遍歷時只處理一條光線,在遍歷某個節(jié)點時,加載某個子節(jié)點數(shù)據(jù)的同時,光線可以同時跳去處理另外一個子節(jié)點,這樣的方式可以隱藏訪存延時。隨著子節(jié)點變寬,樹的節(jié)點變小,棧的深度也減少。如果所有子節(jié)點的序號是連續(xù)的,那么棧只需要記錄第一個序號和有效子節(jié)點的數(shù)量即可,因此也可以起到節(jié)省棧內(nèi)存的作用。圖6 以八叉樹為例說明這種優(yōu)化方式,可以看出這樣的算法訪存效率也會比較高,因為比常規(guī)二叉樹包含更少的內(nèi)部節(jié)點。但是這樣的加速數(shù)據(jù)結(jié)構(gòu)面臨新的問題,對于多分支樹,確定遍歷需要比二叉樹更多的比較和交換運算,造成巨大硬件資源的開銷,此外還有一個缺陷就是多分支BVH 可能包含太多的空槽,每個節(jié)點也需要一個標記位來記錄哪些節(jié)點是它的子節(jié)點,隨著分支的增多,標記位需要占據(jù)更多的內(nèi)存。
圖6 八叉BVH 遍歷Fig.6 8-wide BVH traversal
電影《賽車總動員(cars)》[44]是皮克斯公司使用光線追蹤的第一部動畫作品,該動畫采用了多分支包圍盒的方式進行渲染。Wald 等[45]和Aila 等[26]做了多分支樹的探索,但是僅將一條光線分配到幾個線程中。Ernst 等[46]首次提出了多個BVH(multi bounding volume hierarchies,MBVH)的概念。該算法將高度為2 的子樹折疊為存儲4 個BVH 的SIMD 節(jié)點,另外還需要每個葉節(jié)點都恰好包圍4 個三角形,很好地提高了數(shù)據(jù)處理的并行性,使用CPU 處理對于隨機光線追蹤可以有2.8 倍的加速。Guthe[47]合并了四叉BVH,在NVIDIA Kepler和Fermi架構(gòu)下,將不連續(xù)的光線性能提高20%。Ylitie 等[48]提出了一種壓縮八叉BVH 的概念,這種設(shè)計可以減少內(nèi)存帶寬,主要是將子節(jié)點邊界量化到一個局部網(wǎng)絡(luò),在NVIDIA Maxwell 和Pascal 架構(gòu)下將不連續(xù)光線的性能提高3.3倍。Benthin 等[49]引入了專用的壓縮葉子節(jié)點,通過只壓縮葉子節(jié)點,降低了訪存的需求,但是性能下降。Lier 等[50]在GPU 上使用模擬了傳統(tǒng)應(yīng)用在CPU上遍歷的方法,分別測試了二叉樹、四叉樹和八叉樹光線追蹤的性能。這種方法使得GPU 上可以簡單地實現(xiàn)各種寬度的BVH,同時會在不連續(xù)光線的實現(xiàn)上提高性能。
隨著最新GPU 實時光線追蹤解決方案的出現(xiàn),在降噪領(lǐng)域的研究也逐步興起。目前的降噪技術(shù)主要是基于蒙特卡洛的渲染技術(shù)進行解決。蒙特卡洛渲染是基于隨機樣本的累積來近似給定場景光線追蹤結(jié)果的算法。目前降噪技術(shù)主要包括濾波技術(shù)、機器學(xué)習(xí)驅(qū)動的濾波器、改進采樣和近似技術(shù)等。
圖像濾波技術(shù)是在盡量保留圖像細節(jié)特征的條件下對目標圖像的噪聲進行抑制。McGuire 等[51]提出全局光照效果下球的邊界處會產(chǎn)生可見的不連續(xù)性,在有限球體內(nèi)使用3D 高斯衰減函數(shù)可平滑光照;Park 等[52]認為雙邊濾波由于可以同時考慮圖像的空域信息(domain)和值域信息(range),用于光線追蹤的降噪會取得較好的效果;Dammertz 等[53]提出了àTrous 濾波的降噪方式,這個方法利用蒙特卡洛計算的半球積分可能與相鄰像素的半球積分非常相似的事實,使用à-Trous小波變換對全噪聲圖像進行運算,產(chǎn)生的結(jié)果接近于每個像素點具有更多采樣點的方案;Schied 等[54]提出了一種基于低采樣進行重構(gòu)圖像的時空差異導(dǎo)向濾波器(spatiotemporal varianceguided filtering,SVGF),結(jié)合時間和空間上的信息一起做濾波,根據(jù)歷史幀信息引導(dǎo)當前幀的濾波。Mara 等[55]結(jié)合中值濾波的方式消除蒙特卡洛渲染圖像的部分模糊和單采樣點的“螢火蟲”現(xiàn)象。Rousselle 等[56]在蒙特卡洛渲染中使用非局部均值濾波的方法迭代降噪。這種方法是一款基于特征的濾波器。
機器學(xué)習(xí)驅(qū)動的濾波器效果通常比傳統(tǒng)的濾波器更優(yōu)。Kalantari 等[57]認為基于特征的濾波器在噪聲場景和理想濾波器參數(shù)之間存在著復(fù)雜的關(guān)系,因此采用非線性回歸模型來學(xué)習(xí)這種關(guān)系,使用多層感知機神經(jīng)網(wǎng)絡(luò),同時在訓(xùn)練和測試期間將其與匹配濾波器相結(jié)合,經(jīng)過訓(xùn)練的神經(jīng)網(wǎng)絡(luò)驅(qū)動的濾波器參數(shù)可以生成近似基準圖像的效果。Vogels 等[58]提出了一種用于降噪渲染圖像噪聲的模塊卷積架構(gòu),主要通過將內(nèi)核預(yù)測網(wǎng)絡(luò)與一些特定任務(wù)的模塊相結(jié)合,并使用非對稱損失優(yōu)化這一組合體,從而擴展了內(nèi)核預(yù)測網(wǎng)絡(luò)的功能。Xu 等[59]提出一種對抗性的蒙特卡洛降噪方法,生成對抗性網(wǎng)絡(luò)通過從一組高質(zhì)量蒙特卡洛光線追蹤圖像中學(xué)習(xí)分布,幫助降噪網(wǎng)絡(luò)生成更真實的高頻細節(jié)和全局照明效果。
Yang 等[60]對隨機采樣反鋸齒算法(temporal antialiasing,TAA)進行了綜述,指出用TAA 的時間濾波器可以有效去除以極低采樣率渲染的光線追蹤路徑的噪聲,但無法從根本上消除噪聲。Schied 等[61]提出了一種新的基于時間的濾波器,可以隨著時間的推移分析信號,從而得到每個像素的自適應(yīng)時間累積因子,并重新調(diào)整著色采樣的子集,以稀疏采樣重構(gòu)時間梯度。Koskela 等[62]提出了一種新的基于回歸的重構(gòu)流水線,叫作分塊多階特征回歸(blockwise multi-order feature regression,BMFR),專門針對1 spp(sample per pixel)輸入的實時光線追蹤,相比其他的重構(gòu)方法速度快1.8 倍,同時生成更好的渲染質(zhì)量。
除此之外,還有通過近似技術(shù)優(yōu)化光線追蹤算法的實現(xiàn)。NVIDIA 在RTX 全局光照(RTXGI)[63]采樣探針(probe)的數(shù)據(jù)結(jié)構(gòu)中,進行實時計算和過濾照明與距離信息,構(gòu)建具有可見性信息的高質(zhì)量多次反彈照明緩存,主要通過光線追蹤中的低頻近似,為實時應(yīng)用程序提供了質(zhì)量和性能之間的理想平衡。近年來已經(jīng)運用到商業(yè)游戲引擎中[64]。不同降噪技術(shù)的主要區(qū)別如表5 所示。
表5 降噪技術(shù)的比較Table 5 Comparison of denoising techniques
基于神經(jīng)網(wǎng)絡(luò)的實時光線追蹤技術(shù)除在降噪方面表現(xiàn)出強勁勢頭外,還可以用于圖像的重構(gòu)、神經(jīng)輻射場(neural radiance fields,NeRF)優(yōu)化、光線采樣和圖像超分辨率上采樣等技術(shù)。
Chaitanya 等[65]采 用RNN(recurrent neural network)和自動編碼器的神經(jīng)網(wǎng)絡(luò)方式,提出了一種適合蒙特卡洛渲染中噪聲類別的網(wǎng)絡(luò)變體,能夠考慮更大的像素域,自動編碼器可以完成圖像的降噪和重構(gòu)。Hofman 等[66]利用神經(jīng)自適應(yīng)采樣技術(shù),對光線追蹤進行降噪和重構(gòu),可在單GPU上以1 920×1 080的分辨率交互運行。Kettunen 等[67]利用卷積神經(jīng)網(wǎng)絡(luò)提出了一種新的梯度域渲染重構(gòu)方法,實驗結(jié)果顯著提高了光線追蹤渲染中梯度域的質(zhì)量,效果比使用其他降噪技術(shù)更優(yōu)。
Verbin 等[68]結(jié)合NeRF 技術(shù)無法準確渲染光滑表面的情況,引入Ref-NeRF 的方式來解決這一情況,它用反射輻射的表示代替了NeRF 的視覺相關(guān)輸出輻射的參數(shù)化,并使用空間變化的場景屬性集合來構(gòu)造函數(shù),該模型顯著提高了鏡面反射的真實性和準確性。
Dahm 等[69]證明了增強學(xué)習(xí)方程和光傳輸模擬方程是相關(guān)的積分方程,基于這一對應(yīng)關(guān)系,推導(dǎo)出了一種在采樣路徑空間時學(xué)習(xí)重要性的方案。主要是通過增強學(xué)習(xí)的Q-Learning 方式學(xué)習(xí)光線追蹤路徑散射的重要性采樣,對零貢獻的光采樣大大減少,進而能夠在固定的時間內(nèi)生成噪聲更少圖像。
Dong 等[70]提出了一種單圖像超分辨率(superresolution,SR)的深度學(xué)習(xí)方法,采用直接學(xué)習(xí)低/高分辨率圖像之間端到端的映射,還擴展了神經(jīng)網(wǎng)絡(luò)以同時處理三個彩色通道,生成更好的圖像質(zhì)量。Ledig 等[71]提出了一種用于圖像超分辨率的生成性對抗網(wǎng)絡(luò)(super-resolution generative adversarial network,SRGAN),能夠以4 倍放大因子推斷照片級自然圖像。Xiao 等[72]將基于神經(jīng)網(wǎng)絡(luò)的超分辨率上采樣技術(shù)與實時渲染結(jié)合,通過現(xiàn)代渲染器中可用的特定信息(如深度和密度運動矢量)與一種新穎的時間網(wǎng)絡(luò)設(shè)計相結(jié)合,能夠在提供實時性能的同時最大限度地提高渲染質(zhì)量,最高可以支持4×4 的上采樣系數(shù)。Thomas 等[73]將基于機器學(xué)習(xí)的降噪技術(shù)和超采樣技術(shù)結(jié)合,提出了一種用于實時渲染的新型神經(jīng)網(wǎng)絡(luò)架構(gòu),比使用兩個單獨的網(wǎng)絡(luò)成本更低,效果優(yōu)于與神經(jīng)網(wǎng)絡(luò)上采樣相結(jié)合的最先進的濾波器。在工業(yè)界,NVIDIA 的深度學(xué)習(xí)超級采樣(DLSS 2.0)[18]和Intel 的Xe 超采樣技術(shù)(XeSS)[74]采用低分辨率輸入重構(gòu)高分辨率的輸出,雖然這些方法的細節(jié)沒有公開,但目前被廣泛用于實時光線追蹤中。與神經(jīng)網(wǎng)絡(luò)結(jié)合的方式及特點如表6 所示。
表6 與神經(jīng)網(wǎng)絡(luò)結(jié)合的技術(shù)Table 6 Techniques combined with artificial neural network
長期以來,實時光線追蹤是研究者們孜孜以求的目標,但是巨大的計算強度限制了它在各類場景中的應(yīng)用,研究者們對如何通過硬件的方式提升性能也進行了許多探索,主要包括基于GPU 進行光線追蹤和采用定制化的設(shè)計來進行加速。
由于早期的GPU 還不支持通用計算,光線追蹤在GPU 上實現(xiàn)難度非常大。Carr 等[75]首次使用了GPU 硬件對光線追蹤進行加速,但僅僅實現(xiàn)了圖元求交部分。Purcell 等[76]提出了完整的光線追蹤流程,劃分了各個模塊,從求交直至生成二次光線。由于GPU硬件架構(gòu)限制嚴重,只支持不帶有分支的kernel,導(dǎo)致功能模塊并不能很好地加速,硬件限制了算法優(yōu)化。此時以GPU 作為硬件基礎(chǔ)的光線追蹤實現(xiàn)依舊不及CPU 實現(xiàn)版本。Aila 等[26]研究并探討了多種在GPU 上實現(xiàn)光線追蹤的策略,并提出了一種利用常駐線程代替GPU 硬件調(diào)度任務(wù)的技術(shù),測試結(jié)果顯示,這種技術(shù)比最基本的GPU 光線追蹤策略快2倍。但是,當時的GPU 對這種常駐線程技術(shù)并不敏感[77]。Hanika 等[78]、Heinly 等[79]、Keely[80]、Vaidyanathan 等[81]、Liktor 等[82]對光線追蹤的精度要求進行了系統(tǒng)研究,提出了一種降低精度和計算復(fù)雜度且可以集成到GPU 中的解決方案。Lü等[83]提出了在GPU中增加動態(tài)光線調(diào)度(dynamic ray shuffling,DRS)的設(shè)計,該設(shè)計用來解決光線追蹤中控制流分支的問題,主要記錄不同光線的遍歷狀態(tài),分為取數(shù)據(jù)、遍歷BVH 和葉子節(jié)點處理三種。通過DRS 可以將處于相同狀態(tài)的光線調(diào)度到同一線程束(warp)中。通過GPGPU-Sim 模擬器[84]測試性能,在僅增加0.11%芯片面積的情況下,光線追蹤性能平均可以提升1.79倍。Liu 等[85]結(jié)合當前GPU 整合光線追蹤硬件加速單元的實際,提出了光線相交預(yù)測器,預(yù)測執(zhí)行省略了部分的冗余操作,可以使得光線直接與圖元進行測試。該方法主要是設(shè)置了一個哈希函數(shù)并提供足夠的空間信息來識別冗余的遍歷。模擬結(jié)果表明在一個帶有光線追蹤加速單元的移動端GPU 上,給流多處理器(streaming multiprocessor)添加5.5 KB 的預(yù)測器,對環(huán)境光遮罩(ambient occlusion,AO)的性能可以提升26%。為解決光線追蹤在GPU 大量光線遍歷造成的不規(guī)則內(nèi)存請求的問題,Ni等[86]提出了聚集內(nèi)存和線程調(diào)度(agglomerative memory and thread scheduling)的調(diào)度機制,該機制將加速數(shù)據(jù)結(jié)構(gòu)(kd-tree)劃分為子樹,完全加載到流多處理器的片上L1 cache 中,而后將線程重新分組到線程束上進行調(diào)度。研究成果可以集成到如今的高端GPU 上,只需要很小的開銷,就可以將性能提升47.4%。不同GPU優(yōu)化方式的比較如表7 所示。
表7 GPU 優(yōu)化方式比較Table 7 Comparison of GPU-based optimization approaches
對于光線追蹤硬件加速,除了基于GPU 進行優(yōu)化實現(xiàn)的研究,通過專用硬件加速也是一種途徑[87-88]。Fender 等[89]最早在FPGA(field programmable gate array)上實現(xiàn)了BVH 的遍歷測試。早期物理渲染專用硬件設(shè)計主要關(guān)注的是加速單個光線追蹤,比較有影響的是薩爾蘭大學(xué)的光線處理單元(ray processing unit,RPU)[90]和SaarCOR[91-92]。SaarCOR 和RPU 都是通過FPGA 技術(shù)實現(xiàn)。SaarCOR 重點關(guān)注光線遍歷和求交運算的硬件實現(xiàn),而RPU 則重點研究光線追蹤的可編程渲染過程的實現(xiàn)。在后續(xù)研究中,Woop等[93-94]又提出了基于ASIC(application specific integrated circuit)的可處理動態(tài)場景的DRPU(dynamic ray processing unit)設(shè)計實現(xiàn)。而后Nah 等也提出了專用的光線遍歷和求交單元——T&I 引擎[95],并在此基礎(chǔ)上設(shè)計了一個完整的光線追蹤體系結(jié)構(gòu)Ray-Core[96]。Lee 等[97-98]將并行T&I 引擎與三星可重構(gòu)處理器相結(jié)合,設(shè)計實現(xiàn)了SGRT(Samsung reconfigurable GPU based on ray tracing),集成了光線生成與著色功能。Nah 等[99]采用混合架構(gòu)的HART,采用專用光線追蹤硬件完成BVH 的更新和光線遍歷,CPU用于重構(gòu)BVH。Kim 等[100-101]提出了一種可重構(gòu)的流多處理器MRTP(mobile ray tracing processor)。Yan等[102]結(jié)合三種優(yōu)化設(shè)計實現(xiàn)了一款高效的光線追蹤硬件加速架構(gòu)RT engine。
在并行光線追蹤架構(gòu)方面,Spjut 等[103]為了更好地應(yīng)對在追蹤二次光線時產(chǎn)生的光線分支問題,提出了基于多線程MIMD 架構(gòu)的TRaX。Kopta 通過共享cache 和功能單元等硬件資源對TRaX 架構(gòu)進行了優(yōu)化[104]。在隨后的工作中,Kopta 等又對TRaX 進行了重新設(shè)計并提出STRaTA[105-106],使其根據(jù)子樹[39]來處理光線流,從而提升cache 命中率。Shkurko 等[107]提出雙流(dual streaming)光線追蹤硬件加速器的體系結(jié)構(gòu)設(shè)計,將場景分為場景流和光線流,將內(nèi)存訪問組織成兩個可以預(yù)測的數(shù)據(jù)流。這些流的可預(yù)測性允許完美預(yù)取,使得內(nèi)存訪問模式與DRAM 內(nèi)存系統(tǒng)的行為非常匹配。Vasiou 等[108-109]提出了Mach-RT 的體系結(jié)構(gòu),通過一個大型片上緩沖區(qū)作為分布在多個芯片上的存儲,最大限度地減少了對場景數(shù)據(jù)的訪問,擴展了雙流的概念,優(yōu)化了主存訪問,使同一內(nèi)存系統(tǒng)可以同時服務(wù)于多個處理器芯片。與現(xiàn)有的學(xué)術(shù)和商業(yè)架構(gòu)相比,提高了性能同時保持著合理的能耗。表8 為不同硬件架構(gòu)的比較。每秒百萬條光線(million rays per second,MRPS)是光線追蹤性能測試時常用的計量單位。
表8 不同光線追蹤架構(gòu)比較Table 8 Comparison of ray tracing architectures
長期以來,基于光線追蹤的物理渲染被視為提升視覺體驗的最有效方法,但是由于過大的計算強度限制了其在實時應(yīng)用領(lǐng)域的使用。近年來,隨著算法研究和硬件技術(shù)的發(fā)展,已經(jīng)處于傳統(tǒng)光柵化渲染方式到消費者平臺實時光線追蹤的轉(zhuǎn)折點。但是,基于實時光線追蹤的研究還遠未結(jié)束,目前該領(lǐng)域還有一些關(guān)鍵性的問題有待進一步研究。
在圖像真實感方面,光線追蹤的模型是基于理想模型做光線路徑的模擬,由于真實場景中光線的折射會造成能量損失,距離完全真實地描繪3D 場景還具有一定差距。如果要更進一步地模擬光線的傳遞,還需要考慮輻射度量學(xué)的內(nèi)容。除此之外,紋理空間技術(shù)(texture space techniques)、可變速率光線追蹤(variable rate ray tracing)等新穎的提升圖像真實感技術(shù)如何與光線追蹤技術(shù)相結(jié)合可能是后續(xù)研究的重點方向。在算法和硬件優(yōu)化方面,神經(jīng)網(wǎng)絡(luò)技術(shù)與實時光線追蹤結(jié)合愈發(fā)緊密,在降噪處理、圖像重構(gòu)和超分辨率等方面發(fā)展迅速,下一步可能會引領(lǐng)人們進入神經(jīng)網(wǎng)絡(luò)渲染的新時代。從近年來的研究成果來看,硬件更傾向于“存儲墻”的解決。利用定制的高效光線重排序硬件或者近存計算等會成為實時光線追蹤進一步發(fā)展的突破口。此外,同樣值得研究的是光線追蹤硬件是否可以推廣到其他不規(guī)則應(yīng)用程序的架構(gòu)中,可以充分發(fā)揮現(xiàn)代光線追蹤GPU 架構(gòu)的優(yōu)勢。