空間分割加速三維資料的查詢

來源:互聯網
上載者:User

最近在對一些模型進行輕量化的處理,需要壓縮模型的大小,並且要求可以較快的讀取載入。原始的模型由3DMax匯出的FBX獲得,鑒於上述要求與FBX模型的格式就選擇了與渲染時的Vertex Buffer最接近的方式來對模型進行儲存,儲存結構如下:

Triangle Data->Vertex Data

其中每個Triangle data儲存其所對應的頂點的索引,每個頂點資料中又儲存其對應的Position, Normal, Tangent, UV[n]...,每個Vertex Data均不相同(相同的條件為包含所有元素Position, Normal, Tangent均相同),首先嘗試直接以這種結構對模型進行儲存,但發現得到的binary模型依然較大。而且通過output發現其中的Vertex Data均不相同,但其中包含的Position, Normal, Tangent等均包含較多的重複元素,因而想到再加一層線性索引來剔除這些幾何資料中的冗餘元素。

首先需要考慮的是這樣的再索引會不會不僅不能減小模型的大小,反倒使之增大。於是判斷:用索引的Vertex Data需要儲存5個UINT的索引(UV通道為2),5 X 4 = 20 Bytes, 而一個Float3的大小為3 x 4 = 12 Bytes, 直觀上這樣改變會帶來不小的空間優勢。感覺用統計之類的方法來分析有些麻煩,於是決定直接實現之再來驗證。而實驗的結果也符合自己的預期,模型的大小減少得還是比較可觀的。用了CryTek的Sponza來進行測試(Max修改過):

三角形數目:182665

刪除冗餘幾何資料前:40.4MB, Vertex Data: 547995

刪除冗餘幾何資料後:18.5MB, Position:94983, Normal&Tangent: 361846, UV: 9692

模型大小控制的目的達到了,但帶來了另外一個非常致命的問題:冗餘頂點的搜尋效率。對於上述可以達到十萬層級的頂點數量,直接的搜尋簡直是*_*!!。不過對其也進行了測試,對於該模型處理進間甚至達到好幾十分鐘,若不加速則一點可行性都沒有。首先想到的是GPU來加速,但是覺得對於這樣的一種搜尋結構不太適合。之後就想到了用空間劃分來進行加速,這有些類似於用KD-Tree進行光線跟蹤,BSP進行碰撞檢測。

以空間頂點的Position為例,其對於某一個頂點,它不可以與旁邊相跟很遠的頂點有相同關係進而是冗餘點,因而只需要檢索判斷空間位置處於其周圍的那些鄰居點就可以了,這樣就可以將每個點待判斷的點的數日大大減少。對於向量,UV進行分割加速方法與Position類似,向量的話就以大體方向把各向量歸成一堆。那麼現在如何確定那些點是這個點的鄰居點呢?這就需要用到各種空間分割來施展它們的作用了,什麼OCTree, KDTree, BVH, BSP各種,你想用那種就用那種^0^。為了簡單起見這些用了OCTree,簡單易行。

實現之後得到的加速效果很明顯,對於上述模型進行處理只需要4,5s以內的時間(用的樹還很淺,懶得深分了,這個也只是邊角工作)。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.