發(fā)布時間:2024-04-09 17:59:09 瀏覽量:215次
編輯:David 桃子
實時全局光照(Real-time GI)一直是計算機圖形學的圣杯。
多年來,業(yè)界也提出多種方法來解決這個問題。
常用的方法包通過利用某些假設(shè)來約束問題域,比如靜態(tài)幾何,粗糙的場景表示或者追蹤粗糙探針,以及在兩者之間插值照明。
在虛幻引擎中,全局光照和反射系統(tǒng)Lumen這一技術(shù)便是由Krzysztof Narkowicz和Daniel Wright一起創(chuàng)立的。
目標是構(gòu)建一個與前人不同的方案,能夠?qū)崿F(xiàn)統(tǒng)一照明,以及類似烘烤一樣的照明質(zhì)量。
近期,在SIGGRAPH 2022上,Krzysztof Narkowicz和團隊講述了他們構(gòu)建Lumen技術(shù)之旅。
當前的硬件光線追蹤缺少強大的GPU算力支持。我們不知道硬件光線追蹤速度有多快,甚至不知道新一代控制臺是否支持它。
因此,軟件光線追蹤方法運用而出。事實證明,它確實是一個非常好用的工具,可以用于縮放或支持有大量重疊實例的場景。
軟件光線追蹤提供了一種可能性,那便是可以使用各種各樣的追蹤結(jié)構(gòu),比如三角形、距離場(distance fields)、面元(surfels),或者高度場(heightfields)。
在此,Krzysztof Narkowicz放棄了研究三角形,簡要研究了面元,但是對于那些需要相當高密度才能表示的幾何圖形,對其進行更新或追蹤面元是相當昂貴的。
經(jīng)過初步探索,高度場是最合適的,因其能夠很好地映射到硬件中,并提供表面表示和簡單的連續(xù) LOD。
因為我們可以使用所有的POM算法,比如最小-最大四叉樹,因此它的追蹤速度是非常快的。
此外,多個高度場可以表示復(fù)雜幾何,類似于柵格化邊界卷層次結(jié)構(gòu)。
若將其視為面元的加速結(jié)構(gòu)也非常有趣,一個單獨的texel就是一個受限于常規(guī)網(wǎng)格的面元。
除了高度場,Lumen還有其他屬性,如反照率或照明,這樣就能夠計算出每次的照明。
在Lumen中,開發(fā)者將這張帶有表面數(shù)據(jù)的完整貼花式投影命名為卡(Cards),即捕獲位置。
柵格化的三角形
Raymarched cards光線步進卡(高度場)
對于場景中的每一張卡來說,進行光線步進太慢。因此需要一種卡的加速結(jié)構(gòu),開發(fā)者選擇了一個4節(jié)點的BVH。它是為一個完整的場景構(gòu)建的,每一幀都在 CPU 上,并上傳到 GPU。
然后在追蹤著色器中,我們將進行基于堆棧的遍歷,并對節(jié)點進行動態(tài)排序,以便首先遍歷最接近的節(jié)點。
BVH 調(diào)試視圖
這里最棘手的部分是如何放置高度場,以便捕捉整個網(wǎng)格。
Krzysztof Narkowicz稱,「其中一個想法是基于GPU的全局距離場。每一幀我們都會追蹤一小組主射線來尋找沒有被卡覆蓋的射線。
接下來,對于每一個未發(fā)現(xiàn)的射線,我們將使用表面梯度遍歷全局距離場,以確定一個最佳的卡方向和范圍,從而產(chǎn)生一個新的卡。
全局距離場的捕獲位置
一方面,它被證實可以為整個合并場景生成卡,而不必為每個網(wǎng)格去生成卡。另一方面,事實證明它在實踐中相當挑剔,因為每次相機移動時都會產(chǎn)生不同的結(jié)果。
另一個想法就是把每個網(wǎng)格的卡作為一個網(wǎng)格導(dǎo)入步驟。通過構(gòu)建幾何學的 BVH 來做到這一點,其中每個節(jié)點將被轉(zhuǎn)換為 N 張卡。
如下:
柵格化的三角形
光線步進卡(高場)
卡位置視圖
這一方法在在尋找一個好的位置時遇到了問題,因為BVH節(jié)點并不是放置卡的好代理。
那么,研究人員又提出了另一個想法:遵循紫外線展開技術(shù),并嘗試聚類表面元素。
因為要處理數(shù)百萬個由Nanite提供的多邊形,因此他們將三角形換成面元。
同時,他們還切換到了一個較少的約束自由導(dǎo)向卡,以嘗試與表面匹配更好。
自由導(dǎo)向的卡位置
通過嘗試,這個方法對于簡單的形狀非常有效,但是在在收斂到更復(fù)雜的形狀上就出現(xiàn)了問題。
最后,Narkowicz又切換回軸對齊的卡片,但是這次是由面元集群和每個網(wǎng)格生成的。
追蹤高度場的獨特性質(zhì)還可以實現(xiàn)錐形追蹤。
錐形追蹤對于降低噪聲非常有效,因為一個預(yù)先過濾的單個錐體跟蹤代表了數(shù)千條單獨的射線。
光線追蹤
錐形追蹤
對于每個卡,開發(fā)者還存儲了一個完整的預(yù)過濾 mip-map鏈表面高度、照明和材料屬性。
在追蹤時,根據(jù)圓錐足跡選擇合適的步進光線,并對其進行射線追蹤。
無卡邊和帶卡邊的跟蹤
在軟件中追蹤大量的非相干射線是非常慢的。理想情況下,可以使用單一的全局結(jié)構(gòu),而非多個高度場。
當錐形足跡越來越大時,實際上并不需要精確的場景表示,可以用更近似的表示替代,以獲得更快的速度。
一個更復(fù)雜的場景,有幾十張卡片來追蹤每個光線
第一個成功的方法是實現(xiàn)純體素圓錐跟蹤,整個場景在運行時是體素化的,就像經(jīng)典的「Interactive Indirect Illumination Using Voxel Cone Tracing」一文中的那樣實現(xiàn)。
柵格化的三角形
光線步進卡 (高度場)
體素圓錐追蹤
光線步進卡繼續(xù)與體素錐跟蹤
而這種方法的主要缺點是,由于場景幾何體的過度融合而導(dǎo)致泄漏,這種現(xiàn)象在跟蹤粗低映射時尤其明顯。
第一種降低圖像泄漏的技術(shù)是,對全局距離場進行跟蹤,只在靠近表面的地方進行體素采樣。在采樣過程中,隨著采樣范圍擴大積累不透明度,停止追蹤時,不透明度將達到1。這樣總是在幾何體附近進行精確采樣,實現(xiàn)降低圖形泄露的目的。
第二種技術(shù)是對網(wǎng)狀內(nèi)部進行體素化。這大大減少了在較厚的壁處的泄露,不過這樣也會造成一些過度遮擋。
其他的實驗包括跟蹤稀疏體素位塊和每面透明通道的體素。這兩個實驗的目的都是為了解決射線方向體素插值問題,即對于不垂直于壁面的射線,軸對齊的實心壁將變得透明。
體素位磚是將每個體素存儲一個位在一個8x8x8的磚塊中,以指示給定的體素是否為空。然后使用兩級 DDA 算法進行光線步進。具有透明面的體素相似,但 DDA相同,并且沿著光線方向透明度不斷上升。結(jié)果表明,這兩種方法在表示幾何體方面的效果都不如距離域,而且速度相當慢。
帶有透明度的體素
最早的跟蹤合并表示的方法是,對全局距離字段和使用全局每個場景卡的著色命中進行錐形跟蹤。即遍歷一個 BVH,找出場景中的哪些卡影響采樣點,然后根據(jù)錐形足跡對每張卡的適度滑步水平進行采樣。
本文放棄了這種方法,因為當初沒有考慮只用它來表示遠場軌跡,而是把它看作是高場光線步進的直接替代。有點諷刺的是,這種被拋棄的方法與我們兩年后最終達成的解決方案最為接近。
到這里,已經(jīng)可以產(chǎn)生一些相當不錯的結(jié)果了:
盡管如此,還是遇到了很多圖形泄漏的問題,而且在這個簡單的場景中,即使在一個高端 PC GPU 上,性能也不是很理想。
為了解決泄漏問題,以處理更多的實例、在PS5上以8毫秒以下時間完成處理。這個demo堪稱是真正的催化劑。
與以往的方案相比,第一個變化也是最大的變化是,用距離場跟蹤取代高度場跟蹤。
為了遮蔽生命點,從卡片上插入生命點的光線,因為距離場沒有頂點屬性,這樣,未覆蓋的區(qū)域只會導(dǎo)致能源損失,而不是泄漏。
出于同樣的考慮,將體素錐形追蹤改為全局距離場射線追蹤。
與此同時,我們還做了很多不同的優(yōu)化,并通過緩存方案對Lumen的不同部分進行了時間分流。值得注意的是,如果沒有錐體追蹤,我們必須更積極地去噪和緩存追蹤,但這又是一個漫長而復(fù)雜的故事。
這是我們發(fā)送第一個演示后的最終結(jié)果,在PS5上一直低于8ms,包括所有共享數(shù)據(jù)結(jié)構(gòu)的更新,如全局距離字段。目前的性能表現(xiàn)甚至更好了,比如最新demo的完成時間接近4毫秒,質(zhì)量上也有明顯的改進。
總之,本文對整個Lumen進行了全面重寫,還有許多不同的想法沒有實施。另一方面,有些東西被重新利用。就像最初我們用卡片作為追蹤表示,但現(xiàn)在用來作為緩存網(wǎng)格表面的各種計算方式。和軟件追蹤類似,開始是我們主要的追蹤方法,主要是圓錐體追蹤,但最后成為一種縮小規(guī)模和支持具有大量重疊實例的、復(fù)雜重度場景的方法。
參考資料:
https://knarkowicz.wordpress.com/2022/08/18/journey-to-lumen/
https://advances.realtimerendering.com/s2022/index.html#Lumen
https://www.youtube.com/channel/UC9V4KS8ggGQe_Hfeg1OQrWw
熱門資訊
探討游戲引擎的文章,介紹了10款游戲引擎及其代表作品,涵蓋了RAGE Engine、Naughty Dog Game Engine、The Dead Engine、Cry Engine、Avalanche Engine、Anvil Engine、IW Engine、Frostbite Engine、Creation引擎、Unreal Engine等引擎。借此分析引出了游戲設(shè)計領(lǐng)域和數(shù)字藝術(shù)教育的重要性,歡迎點擊咨詢報名。
2. 手機游戲如何開發(fā)(如何制作傳奇手游,都需要準備些什么?)
?如何制作傳奇手游,都需要準備些什么?提到傳奇手游相信大家都不陌生,他是許多80、90后的回憶;從起初的端游到現(xiàn)在的手游,說明時代在進步游戲在更新,更趨于方便化移動化。而如果我們想要制作一款傳奇手游的
3. B站視頻剪輯軟件「必剪」:免費、炫酷特效,小白必備工具
B站視頻剪輯軟件「必剪」,完全免費、一鍵制作炫酷特效,適合新手小白??靵碓囋?!
游戲中玩家將面臨武俠人生的掙扎抉擇,戰(zhàn)或降?殺或放?每個抉定都將觸發(fā)更多愛恨糾葛的精彩奇遇?!短烀嬗肪哂卸嗑€劇情多結(jié)局,不限主線發(fā)展,高自由...
5. Bigtime加密游戲經(jīng)濟體系揭秘,不同玩家角色的經(jīng)濟活動
Bigtime加密游戲經(jīng)濟模型分析,探討游戲經(jīng)濟特點,幫助玩家更全面了解這款GameFi產(chǎn)品。
6. 3D動畫軟件你知道幾個?3ds Max、Blender、Maya、Houdini大比拼
當提到3D動畫軟件或動畫工具時,指的是數(shù)字內(nèi)容創(chuàng)建工具。它是用于造型、建模以及繪制3D美術(shù)動畫的軟件程序。但是,在3D動畫軟件中還包含了其他類型的...
7. 3D動漫建模全過程,不是一般人能學的會的,會的多不是人?
步驟01:面部,頸部,身體在一起這次我不準備設(shè)計圖片,我從雕刻進入。這一次,它將是一種純粹關(guān)注建模而非整體繪畫的形式。像往常一樣,我從Sphere創(chuàng)建它...
8. 如何自己開發(fā)一款游戲(游戲開發(fā)入門必看:五大獨立游戲開發(fā)技巧)
?游戲開發(fā)入門必看:五大獨立游戲開發(fā)技巧無論您是剛剛起步開發(fā)自己的第一款游戲,還是已經(jīng)制作了幾款游戲,本篇文章中的5大獨立游戲開發(fā)技巧都可以幫助您更好地設(shè)計下一款游戲。無論你對游戲有著什么樣的概念,都
?三昧動漫對于著名ARPG游戲《巫師》系列,最近CD Projekt 的高層回應(yīng)并不會推出《巫師4》。因為《巫師》系列在策劃的時候一直定位在“三部曲”的故事框架,所以在游戲的出品上不可能出現(xiàn)《巫師4》
10. 3D打印技巧揭秘!Cura設(shè)置讓你的模型更堅固
想讓你的3D打印模型更堅固?不妨嘗試一下Cura參數(shù)設(shè)置和設(shè)計技巧,讓你輕松掌握!
最新文章
同學您好!