Nanite就是Progressive Mesh chunk/clustered化,然後利用mesh/compute shader來做View Dependent的運算。
但直覺化hierachy clustered 的 Progressive Mesh是行不通的。因為要避免邊界有t-junction/crack,邊界的vertices都會鎖住,無法簡化。
會像這樣,邊界一堆面數,無法簡化下來。
https://i.imgur.com/bqNAXS8.png
quick-vdr用方法才可以真正簡化。差異92%
https://i.imgur.com/IdxL4iw.png
https://gamma.cs.unc.edu/QVDR/
Nanite就是用quick-vdr的方法
https://i.imgur.com/gtcixEA.png
https://i.imgur.com/2fUrRTO.png
quick-vdr的方法不是很直覺。traversal也要多花判斷。運算建立hierarchy也蠻麻煩。
其實要避開邊界的問題很簡單。
https://i.imgur.com/mBsScBK.png
原來的chunk不要沿著原來的邊界切開,基本上是對角切,所以128tri的chunk,對角切成64tri,4個不同chunk的64tri合併起來,再simplify成128tri的另一層chunk。
這樣的好處是hierarchy是tree而不是DAG,邊界自動避開。這樣就把Nanite的演算法改良好。QED
但現在的chunk還是需要mesh/compute shader來運算。但其實仔細想想,是不需要的。Tree Hierarchy是很容易用sliding window的index buffer來render。
想到了方法後,也才發現原來2004年就有人提出類似的方法。sliding window VIPM。
https://www.graphicon.ru/html/2004/Proceedings/Technical/2[4].pdf
Sliding window的概念。
https://i.imgur.com/qzPMkTu.png
然後再延伸一下,其實我們不需要chunk,重點在tree的層次。第0層10000tri,第一層5000tri,第二層2500tri,簡單的PM運算法就行了,還不需要graph partition這種麻煩。Continuous LOD is so easy。
這種Sliding Window的好處是完全不需要gpu update,任何古早gpu都可用。缺點是index buffer會好幾倍大。
Nanite是vdpm所以效能應該會比較好,但複雜,支援的gpu也少。
很想踢自己一腳,當初看到Tom Forsyth的Sliding Window時,完全沒有看到解決方案就在眼前了。