給定一組三維高斯點,渲染步驟大致為:1.camera?space轉(zhuǎn)成ray space 2.對像平面進行分塊,然后對高斯排序 3.正投影發(fā)出射線進行α-blending
1. camera?space->ray space,3D Gaussian->2D Gaussian
這個步驟將NeRF中的投影過程變?yōu)榱苏队?,引入了ray space的概念,讓3D Gaussian 變?yōu)?D Gaussian.
- 透視投影和正投影? ? ? ? ? ? ? ? ? ?
一般的渲染過程都是透視投影,所有發(fā)出的ray都從camera發(fā)出,故而有個交點。splatting的方法則是用正投影,發(fā)射的ray全部平行于像平面。
3D Gaussian splatting的前期步驟就是將camera?space轉(zhuǎn)成ray space,本質(zhì)就是將透視投影轉(zhuǎn)變?yōu)檎队埃?D Gaussian轉(zhuǎn)變?yōu)?D Gaussian,這樣就免去了一大堆光線求交的計算。
- ray space
給定一個ray space的坐標點(x0,x1,x2),其中(x0,x1)代表該點透視投影到圖像上的坐標點,x2代表視點即camera到該點的距離。
假如給定其對應的camera space坐標點為(u0,u1,u2),則兩者轉(zhuǎn)換為:
- 3D Gaussian->2D Gaussian
?camera space->ray space 的變換有一個特點:非仿射變換。仿射變換是可以用一個統(tǒng)一的線性變換矩陣將所有點的坐標進行轉(zhuǎn)換,而根據(jù)上面的兩個式子可以發(fā)現(xiàn),每個點的ray space坐標都是以自身的camera space坐標為自變量的非線性函數(shù),故并沒有一個統(tǒng)一的變換矩陣。
?為了解決這個問題,作者采用了一個近似的方法,即用每個三維高斯的中心點的變換矩陣近似為各自的變換矩陣,這樣對于每個高斯來講,都是仿射的變換。而這個矩陣被稱為雅可比矩陣J。
當然這樣也使得每個高斯的大小不能太大,否則就會產(chǎn)生精度問題。
結(jié)合上述,則對于每個給定的三維高斯的協(xié)方差矩陣V'',以及其world space下的中心點坐標(u0,u1,u2),我們可以求得ray space下的高斯協(xié)方差。由于給的是world space下的坐標,所以得先乘以旋轉(zhuǎn)平移矩陣W轉(zhuǎn)化為camera space坐標,然后通過中心點坐標求出雅可比矩陣J,ray space下的高斯協(xié)方差就如下:
由于是正投影,故直接取最后的三維高斯協(xié)方差的前兩行兩列就是投影到像平面上的二維高斯協(xié)方差矩陣。?
二維高斯的中心點坐標就是camera space下的u0,u1除以第三維u2,即(u0/u2,u1/u2)
這樣就將空間中的三維高斯轉(zhuǎn)化為像平面上的二維高斯。
2. 分塊排序??
為了渲染時能正確考慮到高斯之間的遮擋關(guān)系,需要對高斯進行基于深度的升序排序。
算法中還采用了分塊的策略,將像平面分為16*16,每一塊選取投影到這一塊的二維高斯,對于覆蓋多個塊的高斯,每個覆蓋塊都會選取到它。然后每一塊將選取好的高斯基于深度進行基數(shù)排序,得到距離像平面從近到遠的16*16個各自排序好的高斯列表?。
對于為什么要分塊,筆者猜測應該是為了渲染時能夠減少計算量,否則每個像素顏色值可能根據(jù)所有高斯繼續(xù)計算。
3. α-blending?
3D Gaussian splatting 也是對每個像素發(fā)出一條射線。
首先根據(jù)高斯的sh參數(shù),得到高斯的顏色c
接著,計算高斯的不透明度alpha,即f(p),alpha要根據(jù)高斯的不透明度參數(shù)α以及像素點坐標和二維高斯中心的距離得到。
文章來源:http://www.zghlxwxcb.cn/news/detail-807774.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-807774.html
到了這里,關(guān)于3D Gaussian Splatting 渲染過程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!