西風(fēng) 發(fā)自 凹非寺
量子位 | 公眾號 QbitAI
距離新模型Marble 1.1&1.1-Plus發(fā)布不到一個周,李飛飛空間智能獨角獸World Labs再度傳來新消息——
開源3D高斯濺射渲染引擎Spark 2.0。
我們?yōu)?D高斯濺射(3D Gaussian Splatting)打造了可流式傳輸?shù)腖oD系統(tǒng),重新定義了web 3D渲染的可能性。
Spark 2.0基于Three.js構(gòu)建,用戶可以通過WebGL2,將包含1億+splats(3D高斯點/潑濺點)的超大規(guī)模3D世界,流式傳輸?shù)饺我庠O(shè)備上,包括桌面、iOS、Android、VR。
![]()
例如下面的Coit Tower場景由超4000萬個splats構(gòu)成,卻能在瀏覽器中實現(xiàn)完全交互:
![]()
在官方Blog中還有更多3D場景可以點開體驗:
![]()
傳統(tǒng)3D建模通過帶紋理映射的三角形,一塊一塊拼出物體的表面。
3D高斯濺射(3D Gaussian Splatting)則采用數(shù)百萬個半透明橢球體(也就是splats),通過這些橢球體的色彩融合,呈現(xiàn)出超寫實的細(xì)節(jié)效果:
![]()
什么是splat?
每一個splat都由位置、XYZ三軸縮放、旋轉(zhuǎn)角度、顏色、不透明度這5個屬性定義。
將splat渲染到屏幕上最常見的方法是畫家算法(painter’s algorithm)。
就像畫畫時先畫遠(yuǎn)處的、再畫近處的,把幾百萬個小橢球按從遠(yuǎn)到近的順序排好,一層一層疊上去,實時算出最終畫面。
這就像是數(shù)字版點彩畫,只不過用的是3D高斯分布輪廓來作畫。
![]()
對于這項成果,李飛飛第一時間給到了評論:
Spark 2.0現(xiàn)已可在任意設(shè)備上流式渲染超1億splats!能為基于網(wǎng)頁的3D高斯濺射渲染開源生態(tài)貢獻(xiàn)力量,我深感自豪!
![]()
Spark系統(tǒng)設(shè)計
Spark前身是World Labs開發(fā)的一款內(nèi)部3D高斯濺射渲染引擎。
彼時市面上的web渲染引擎均存在明顯短板,例如,部分引擎一次只能正確渲染一個3D高斯濺射對象;部分引擎無法不能動態(tài)動畫化splats;還有些引擎基于小眾3D框架開發(fā),或采用尚未普及的WebGPU技術(shù),導(dǎo)致設(shè)備兼容性受限。
這款內(nèi)部渲染引擎曾亮相于團(tuán)隊2024年發(fā)布的大型世界模型研究預(yù)覽,以及早期場景展示項目Lofi Worlds。
![]()
為了讓更多開發(fā)者都能打造交互式3D高斯濺射web體驗,團(tuán)隊整合技術(shù)積累,在去年開源了一款通用型3D高斯濺射渲染引擎。
當(dāng)時名字還叫做Forge,量子位當(dāng)時也有介紹,后改名Spark。
![]()
Spark基于主流THREE.js框架構(gòu)建而成。同時,團(tuán)隊將技術(shù)底座定為WebGL2,這是目前唯一能在幾乎所有設(shè)備上穩(wěn)定運(yùn)行的3D web API。
團(tuán)隊表示,Spark的研發(fā)過程始終與Marble同步推進(jìn)。
官方Blog中詳細(xì)介紹了Spark的技術(shù)細(xì)節(jié)。
全新Spark 2.0實現(xiàn)了超大規(guī)模3D高斯濺射場景在網(wǎng)頁端的預(yù)處理、流式加載與跨設(shè)備渲染。
![]()
視頻鏈接:https://mp.weixin.qq.com/s/4m-RUPdLnzvXSx-cyBqhsQ
關(guān)鍵在于融合了三項技術(shù):
- 細(xì)節(jié)層次技術(shù)(LoD,Level-of-Detail):預(yù)先生成不同分辨率的splats數(shù)據(jù),并根據(jù)相機(jī)視角智能篩選需要渲染的splats子集。對于距離過遠(yuǎn)、肉眼無法分辨細(xì)節(jié)的區(qū)域,減少渲染的splats數(shù)量,從而顯著提升渲染性能。
- 漸進(jìn)式流式加載(Progressive Streaming):采用“從粗到精”的加載策略,優(yōu)先下載能最優(yōu)化當(dāng)前視角細(xì)節(jié)的數(shù)據(jù)。隨著數(shù)據(jù)逐步下載,場景會不斷細(xì)化,實現(xiàn)流暢的漸進(jìn)式呈現(xiàn)。
- 虛擬內(nèi)存(Virtual Memory):為splats頁表分配固定的GPU內(nèi)存池,根據(jù)用戶在場景中的位置,自動置換3D高斯濺射數(shù)據(jù)塊。借助這一技術(shù),即使是通過網(wǎng)絡(luò)獲取的海量跨對象splats數(shù)據(jù),也能被高效訪問。
下面具體來看。
Level-of-Detail
在計算機(jī)圖形學(xué)領(lǐng)域,Level-of-Detail是處理大型3D場景的經(jīng)典方案就是。它能根據(jù)物體與觀察者的距離,自動調(diào)整渲染細(xì)節(jié)。當(dāng)需要提升幀率時,可以降低細(xì)節(jié)等級;當(dāng)用戶靜止觀察時,則可以提高細(xì)節(jié)等級,呈現(xiàn)更精細(xì)的畫面。
Level-of-Detail的典型應(yīng)用是Mipmap紋理映射:
將一張紋理圖片逐級下采樣,生成一組分辨率依次減半的紋理金字塔,最頂層是單個像素。這一技術(shù)能確保在任意距離下,都能快速采樣到與屏幕像素尺寸匹配的紋理數(shù)據(jù)。
Level-of-Detail的實現(xiàn)方案可分為離散型與連續(xù)型兩大類。
離散型方案需要預(yù)先生成多套不同splat數(shù)量的模型版本,再根據(jù)物體包圍盒與相機(jī)的距離,切換渲染不同版本。這種方法存在明顯缺陷:
當(dāng)用戶在場景中移動時,模型細(xì)節(jié)的突然切換會產(chǎn)生“跳變”偽影;同時,將splats分塊處理時,塊與塊之間的邊界也會清晰可見。
Spark采用的是連續(xù)型Level-of-Detail,核心是為所有splats構(gòu)建一個層級化結(jié)構(gòu)——Level-of-Detail Gaussian splat tree。
![]()
Spark會沿著該樹的邊界,精準(zhǔn)篩選出最適合當(dāng)前視口的splats子集,實現(xiàn)平滑無斷層的細(xì)節(jié)過渡。
![]()
Spark 2.0內(nèi)置了兩種Level-of-Detail Gaussian splat tree生成算法:
- Tiny-LoD算法:一種快速且輕量的算法,默認(rèn)用于網(wǎng)頁端的實時生成場景。
- Bhatt-LoD算法:一種高精度算法,默認(rèn)用于命令行工具的離線處理場景。
這兩種算法均為無訓(xùn)練依賴的方案,無需參考圖像或其他額外輸入數(shù)據(jù),直接對3D高斯濺射數(shù)據(jù)進(jìn)行處理即可。除此之外,Spark也兼容其他第三方生成算法,例如NanoGS。
Progressive Streaming
Spark 2.0定義了一種全新的文件格式——.RAD(全稱Radiance Fields,輻射場)。該格式不僅能有效壓縮3D高斯濺射數(shù)據(jù),還支持隨機(jī)訪問流式加載,實現(xiàn)了場景的漸進(jìn)式精細(xì)化渲染,完美適配網(wǎng)絡(luò)傳輸場景。
采用RAD格式后,3D高斯濺射對象能立即以一個包含64Ksplats的粗糙版本呈現(xiàn),隨后系統(tǒng)會根據(jù)用戶視角,優(yōu)先獲取用于優(yōu)化可見區(qū)域細(xì)節(jié)的數(shù)據(jù)塊,實現(xiàn)動態(tài)的優(yōu)先級調(diào)整。
![]()
LoD splat tree本質(zhì)上是一個四維結(jié)構(gòu):包含三維空間維度與一維細(xì)節(jié)層次維度。
要實現(xiàn)流式加載的漸進(jìn)式精細(xì)化渲染,必須將LoD splats ,以合理的方式劃分到RAD文件的各個數(shù)據(jù)塊中。
實現(xiàn)這一目標(biāo)的策略有很多,Spark采用的策略核心是空間鄰近性優(yōu)先:
將三維空間遞歸劃分為更小的區(qū)域,每個數(shù)據(jù)塊都會按“從大到小”的順序,填充對應(yīng)空間區(qū)域內(nèi)的splats,確保每個數(shù)據(jù)塊都能最大化呈現(xiàn)該區(qū)域的細(xì)節(jié)。
![]()
視頻鏈接:https://mp.weixin.qq.com/s/4m-RUPdLnzvXSx-cyBqhsQ
Virtual Memory
虛擬內(nèi)存是一種經(jīng)典的內(nèi)存管理技術(shù),通過劃分固定大小的內(nèi)存頁,構(gòu)建頁表映射關(guān)系,用有限的物理內(nèi)存,模擬出容量巨大的虛擬內(nèi)存空間。
Spark 2.0將這一技術(shù)創(chuàng)新性地應(yīng)用于3D高斯濺射渲染:
它會在GPU中預(yù)先分配一個固定大小的內(nèi)存池(容量為1600萬個splats),并構(gòu)建一套頁表映射機(jī)制,將GPU中的 64K splats“內(nèi)存頁”,與RAD文件中的64K潑濺點數(shù)據(jù)塊一一對應(yīng)。
![]()
數(shù)據(jù)塊的加載與置換規(guī)則如下:
- 根據(jù)LoD splat trees的遍歷結(jié)果,將高優(yōu)先級的數(shù)據(jù)塊加載到空閑的GPU內(nèi)存頁中。
- 當(dāng)GPU內(nèi)存池被占滿,且需要加載新的高優(yōu)先級數(shù)據(jù)塊時,會采用LRU算法,將優(yōu)先級最低的內(nèi)存頁中的數(shù)據(jù)塊置換出去。
Spark的這一設(shè)計具備極高的靈活性:它支持同時加載多個RAD文件,并讓這些文件共享同一個GPU內(nèi)存池。對于每個RAD文件,Spark都會維護(hù)兩套映射關(guān)系:從數(shù)據(jù)塊到內(nèi)存頁的映射,以及從內(nèi)存頁到文件和數(shù)據(jù)塊的反向映射。
在對多個細(xì)節(jié)層次潑濺樹進(jìn)行遍歷時,Spark會統(tǒng)一記錄所有文件的數(shù)據(jù)塊訪問順序,最終生成一個全局?jǐn)?shù)據(jù)塊優(yōu)先級列表,從而實現(xiàn)跨所有3D高斯濺射對象的加載與存儲優(yōu)化。
官方Blog中還介紹了更多技術(shù)細(xì)節(jié),感興趣的童鞋傳送門在這里:
https://www.worldlabs.ai/blog/spark-2.0#lod-splat-tree
參考鏈接:https://x.com/i/trending/2044161909943918948
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.