超逼真渲染!虛幻引擎技術(shù)大牛解讀全局光照系統(tǒng)Lumen
實(shí)時(shí)全局光照(Real-time GI)一直是計(jì)算機(jī)圖形學(xué)的圣杯。
多年來(lái),業(yè)界也提出多種方法來(lái)解決這個(gè)問(wèn)題。
常用的方法包通過(guò)利用某些假設(shè)來(lái)約束問(wèn)題域,比如靜態(tài)幾何,粗糙的場(chǎng)景表示或者追蹤粗糙探針,以及在兩者之間插值照明。
在虛幻引擎中,全局光照和反射系統(tǒng)Lumen這一技術(shù)便是由Krzysztof Narkowicz和Daniel Wright一起創(chuàng)立的。
目標(biāo)是構(gòu)建一個(gè)與前人不同的方案,能夠?qū)崿F(xiàn)統(tǒng)一照明,以及類(lèi)似烘烤一樣的照明質(zhì)量。
近期,在SIGGRAPH 2022上,Krzysztof Narkowicz和團(tuán)隊(duì)講述了他們構(gòu)建Lumen技術(shù)之旅。
軟件光線追蹤——高度場(chǎng)
當(dāng)前的硬件光線追蹤缺少?gòu)?qiáng)大的GPU算力支持。我們不知道硬件光線追蹤速度有多快,甚至不知道新一代控制臺(tái)是否支持它。
因此,軟件光線追蹤方法運(yùn)用而出。事實(shí)證明,它確實(shí)是一個(gè)非常好用的工具,可以用于縮放或支持有大量重疊實(shí)例的場(chǎng)景。
軟件光線追蹤提供了一種可能性,那便是可以使用各種各樣的追蹤結(jié)構(gòu),比如三角形、距離場(chǎng)(distance fields)、面元(surfels),或者高度場(chǎng)(heightfields)。
在此,Krzysztof Narkowicz放棄了研究三角形,簡(jiǎn)要研究了面元,但是對(duì)于那些需要相當(dāng)高密度才能表示的幾何圖形,對(duì)其進(jìn)行更新或追蹤面元是相當(dāng)昂貴的。
經(jīng)過(guò)初步探索,高度場(chǎng)是最合適的,因其能夠很好地映射到硬件中,并提供表面表示和簡(jiǎn)單的連續(xù) LOD。
因?yàn)槲覀兛梢允褂盟械腜OM算法,比如最小-最大四叉樹(shù),因此它的追蹤速度是非??斓?。
此外,多個(gè)高度場(chǎng)可以表示復(fù)雜幾何,類(lèi)似于柵格化邊界卷層次結(jié)構(gòu)。
若將其視為面元的加速結(jié)構(gòu)也非常有趣,一個(gè)單獨(dú)的texel就是一個(gè)受限于常規(guī)網(wǎng)格的面元。
除了高度場(chǎng),Lumen還有其他屬性,如反照率或照明,這樣就能夠計(jì)算出每次的照明。
在Lumen中,開(kāi)發(fā)者將這張帶有表面數(shù)據(jù)的完整貼花式投影命名為卡(Cards),即捕獲位置。
柵格化的三角形
Raymarched cards光線步進(jìn)卡(高度場(chǎng))
對(duì)于場(chǎng)景中的每一張卡來(lái)說(shuō),進(jìn)行光線步進(jìn)太慢。因此需要一種卡的加速結(jié)構(gòu),開(kāi)發(fā)者選擇了一個(gè)4節(jié)點(diǎn)的BVH。它是為一個(gè)完整的場(chǎng)景構(gòu)建的,每一幀都在 CPU 上,并上傳到 GPU。
然后在追蹤著色器中,我們將進(jìn)行基于堆棧的遍歷,并對(duì)節(jié)點(diǎn)進(jìn)行動(dòng)態(tài)排序,以便首先遍歷最接近的節(jié)點(diǎn)。
BVH 調(diào)試視圖
捕獲位置
這里最棘手的部分是如何放置高度場(chǎng),以便捕捉整個(gè)網(wǎng)格。Krzysztof Narkowicz稱(chēng),「其中一個(gè)想法是基于GPU的全局距離場(chǎng)。每一幀我們都會(huì)追蹤一小組主射線來(lái)尋找沒(méi)有被卡覆蓋的射線。
接下來(lái),對(duì)于每一個(gè)未發(fā)現(xiàn)的射線,我們將使用表面梯度遍歷全局距離場(chǎng),以確定一個(gè)最佳的卡方向和范圍,從而產(chǎn)生一個(gè)新的卡。
全局距離場(chǎng)的捕獲位置
一方面,它被證實(shí)可以為整個(gè)合并場(chǎng)景生成卡,而不必為每個(gè)網(wǎng)格去生成卡。另一方面,事實(shí)證明它在實(shí)踐中相當(dāng)挑剔,因?yàn)槊看蜗鄼C(jī)移動(dòng)時(shí)都會(huì)產(chǎn)生不同的結(jié)果。
另一個(gè)想法就是把每個(gè)網(wǎng)格的卡作為一個(gè)網(wǎng)格導(dǎo)入步驟。通過(guò)構(gòu)建幾何學(xué)的 BVH 來(lái)做到這一點(diǎn),其中每個(gè)節(jié)點(diǎn)將被轉(zhuǎn)換為 N 張卡。
如下:
柵格化的三角形
光線步進(jìn)卡(高場(chǎng))
卡位置視圖
這一方法在在尋找一個(gè)好的位置時(shí)遇到了問(wèn)題,因?yàn)锽VH節(jié)點(diǎn)并不是放置卡的好代理。
那么,研究人員又提出了另一個(gè)想法:遵循紫外線展開(kāi)技術(shù),并嘗試聚類(lèi)表面元素。
因?yàn)橐幚頂?shù)百萬(wàn)個(gè)由Nanite提供的多邊形,因此他們將三角形換成面元。
同時(shí),他們還切換到了一個(gè)較少的約束自由導(dǎo)向卡,以嘗試與表面匹配更好。
自由導(dǎo)向的卡位置
通過(guò)嘗試,這個(gè)方法對(duì)于簡(jiǎn)單的形狀非常有效,但是在在收斂到更復(fù)雜的形狀上就出現(xiàn)了問(wèn)題。
最后,Narkowicz又切換回軸對(duì)齊的卡片,但是這次是由面元集群和每個(gè)網(wǎng)格生成的。
錐形追蹤
追蹤高度場(chǎng)的獨(dú)特性質(zhì)還可以實(shí)現(xiàn)錐形追蹤。
錐形追蹤對(duì)于降低噪聲非常有效,因?yàn)橐粋€(gè)預(yù)先過(guò)濾的單個(gè)錐體跟蹤代表了數(shù)千條單獨(dú)的射線。
光線追蹤
錐形追蹤
對(duì)于每個(gè)卡,開(kāi)發(fā)者還存儲(chǔ)了一個(gè)完整的預(yù)過(guò)濾 mip-map鏈表面高度、照明和材料屬性。
在追蹤時(shí),根據(jù)圓錐足跡選擇合適的步進(jìn)光線,并對(duì)其進(jìn)行射線追蹤。
無(wú)卡邊和帶卡邊的跟蹤
合并場(chǎng)景表示
在軟件中追蹤大量的非相干射線是非常慢的。理想情況下,可以使用單一的全局結(jié)構(gòu),而非多個(gè)高度場(chǎng)。
當(dāng)錐形足跡越來(lái)越大時(shí),實(shí)際上并不需要精確的場(chǎng)景表示,可以用更近似的表示替代,以獲得更快的速度。
一個(gè)更復(fù)雜的場(chǎng)景,有幾十張卡片來(lái)追蹤每個(gè)光線
第一個(gè)成功的方法是實(shí)現(xiàn)純體素圓錐跟蹤,整個(gè)場(chǎng)景在運(yùn)行時(shí)是體素化的,就像經(jīng)典的「Interactive Indirect Illumination Using Voxel Cone Tracing」一文中的那樣實(shí)現(xiàn)。
柵格化的三角形
光線步進(jìn)卡 (高度場(chǎng))
體素圓錐追蹤
光線步進(jìn)卡繼續(xù)與體素錐跟蹤
而這種方法的主要缺點(diǎn)是,由于場(chǎng)景幾何體的過(guò)度融合而導(dǎo)致泄漏,這種現(xiàn)象在跟蹤粗低映射時(shí)尤其明顯。
第一種降低圖像泄漏的技術(shù)是,對(duì)全局距離場(chǎng)進(jìn)行跟蹤,只在靠近表面的地方進(jìn)行體素采樣。在采樣過(guò)程中,隨著采樣范圍擴(kuò)大積累不透明度,停止追蹤時(shí),不透明度將達(dá)到1。這樣總是在幾何體附近進(jìn)行精確采樣,實(shí)現(xiàn)降低圖形泄露的目的。
第二種技術(shù)是對(duì)網(wǎng)狀內(nèi)部進(jìn)行體素化。這大大減少了在較厚的壁處的泄露,不過(guò)這樣也會(huì)造成一些過(guò)度遮擋。
其他的實(shí)驗(yàn)包括跟蹤稀疏體素位塊和每面透明通道的體素。這兩個(gè)實(shí)驗(yàn)的目的都是為了解決射線方向體素插值問(wèn)題,即對(duì)于不垂直于壁面的射線,軸對(duì)齊的實(shí)心壁將變得透明。
體素位磚是將每個(gè)體素存儲(chǔ)一個(gè)位在一個(gè)8x8x8的磚塊中,以指示給定的體素是否為空。然后使用兩級(jí) DDA 算法進(jìn)行光線步進(jìn)。具有透明面的體素相似,但 DDA相同,并且沿著光線方向透明度不斷上升。結(jié)果表明,這兩種方法在表示幾何體方面的效果都不如距離域,而且速度相當(dāng)慢。
帶有透明度的體素
最早的跟蹤合并表示的方法是,對(duì)全局距離字段和使用全局每個(gè)場(chǎng)景卡的著色命中進(jìn)行錐形跟蹤。即遍歷一個(gè) BVH,找出場(chǎng)景中的哪些卡影響采樣點(diǎn),然后根據(jù)錐形足跡對(duì)每張卡的適度滑步水平進(jìn)行采樣。
本文放棄了這種方法,因?yàn)楫?dāng)初沒(méi)有考慮只用它來(lái)表示遠(yuǎn)場(chǎng)軌跡,而是把它看作是高場(chǎng)光線步進(jìn)的直接替代。有點(diǎn)諷刺的是,這種被拋棄的方法與我們兩年后最終達(dá)成的解決方案最為接近。
第一個(gè)演示
到這里,已經(jīng)可以產(chǎn)生一些相當(dāng)不錯(cuò)的結(jié)果了:
盡管如此,還是遇到了很多圖形泄漏的問(wèn)題,而且在這個(gè)簡(jiǎn)單的場(chǎng)景中,即使在一個(gè)高端 PC GPU 上,性能也不是很理想。
為了解決泄漏問(wèn)題,以處理更多的實(shí)例、在PS5上以8毫秒以下時(shí)間完成處理。這個(gè)demo堪稱(chēng)是真正的催化劑。
與以往的方案相比,第一個(gè)變化也是最大的變化是,用距離場(chǎng)跟蹤取代高度場(chǎng)跟蹤。
為了遮蔽生命點(diǎn),從卡片上插入生命點(diǎn)的光線,因?yàn)榫嚯x場(chǎng)沒(méi)有頂點(diǎn)屬性,這樣,未覆蓋的區(qū)域只會(huì)導(dǎo)致能源損失,而不是泄漏。
出于同樣的考慮,將體素錐形追蹤改為全局距離場(chǎng)射線追蹤。
與此同時(shí),我們還做了很多不同的優(yōu)化,并通過(guò)緩存方案對(duì)Lumen的不同部分進(jìn)行了時(shí)間分流。值得注意的是,如果沒(méi)有錐體追蹤,我們必須更積極地去噪和緩存追蹤,但這又是一個(gè)漫長(zhǎng)而復(fù)雜的故事。
這是我們發(fā)送第一個(gè)演示后的最終結(jié)果,在PS5上一直低于8ms,包括所有共享數(shù)據(jù)結(jié)構(gòu)的更新,如全局距離字段。目前的性能表現(xiàn)甚至更好了,比如最新demo的完成時(shí)間接近4毫秒,質(zhì)量上也有明顯的改進(jìn)。
尾聲
總之,本文對(duì)整個(gè)Lumen進(jìn)行了全面重寫(xiě),還有許多不同的想法沒(méi)有實(shí)施。另一方面,有些東西被重新利用。就像最初我們用卡片作為追蹤表示,但現(xiàn)在用來(lái)作為緩存網(wǎng)格表面的各種計(jì)算方式。和軟件追蹤類(lèi)似,開(kāi)始是我們主要的追蹤方法,主要是圓錐體追蹤,但最后成為一種縮小規(guī)模和支持具有大量重疊實(shí)例的、復(fù)雜重度場(chǎng)景的方法。