此為 Jacobian 矩陣 系列文章 - 第 2 篇:
前言
前一篇文章中,我們詳細介紹了 Jacobian 矩陣 的數學定義與幾何意義。我們了解到,Jacobian 矩陣本質上就是多變數向量函數的「一階導數」,它代表了一個複雜的非線性變換在空間中某一點附近的局部線性近似
今天我們來學習 Jacobian 矩陣在 3D 電腦圖學領域中發揮的關鍵作用,探討一篇極具影響力的經典論文 — EWA Volume Splatting (Zwicker et al., 2001) 是如何巧妙地利用 Jacobian 矩陣與 Gaussian 的數學特性,讓 Volume Rendering (體積渲染) 這件原本只能靠緩慢的 Ray Marching (光線步進) 完成的任務大幅加速,甚至奠定了近年爆紅的 3D Gaussian Splatting 即時渲染技術的數學基礎
背景:三維渲染的挑戰 Ray Marching vs. Splatting
要理解 EWA Volume Splatting 的偉大之處,我們得先看看傳統是怎麼渲染三維體積資料(例如:醫療 CT 掃描、雲霧、或是點雲)的
Ray Marching (光線步進):緩慢的傳統演算法
傳統體積渲染最常用的方法是 Ray Marching (光線步進)。它的作法是從虛擬相機的視角出發,對螢幕上的「每一個像素」射出一條光線穿過 3D 場景。光線在穿過體積資料的過程中,必須沿途不斷地「步進」取樣,計算每一小步的顏色與透明度,最後將整條光線上所有取樣點的結果積分起來,才能決定該像素的最終顏色。這也造就了它的效能瓶頸:只要場景稍微複雜、解析度稍微高一點,就得射出數百萬條光線,每條光線又要取樣成百上千次,計算量極為龐大;再加上取樣時需要不斷在 3D 空間中插值查詢資料,記憶體存取非常缺乏效率,在早期的硬體上根本不可能做到即時渲染
Splatting (拋濺法):擁抱 GPU 的演算法
為了解決這個效能問題,電腦圖學家們提出了 Splatting (拋濺法)。這是一種思路完全反過來的演算法:
與其從螢幕射出光線去尋找 3D 資料,不如我們直接拿著 3D 資料,把它們像「砸雪球」一樣,一顆一顆直接「砸 (Splat)」到 2D 螢幕上!
在 Splatting 中:
- 空間中的資料被表示為一顆一顆重疊的 3D 球體 (通常是 3D 高斯橢球)
- 渲染的過程,就是將這每一顆 3D 橢球,經過相機投影,變成 2D 螢幕上的一個 2D 橢圓
- 最後只要把這些 2D 橢圓整個疊加起來,就完成了一張畫面
這套流程之所以有潛力,是因為它完全打中了現代硬體的強項 — 把 3D 座標投影到 2D、再於螢幕上繪製 2D 圖形,正是 GPU Rasterizer (光柵化硬體) 最擅長的事情。數以萬計的 2D 繪製指令可以同時被平行處理,這讓 Splatting 天生就具備大幅加速的本錢
不過,要把這個想法真正付諸實行,還得先跨過一道非常棘手的數學難題