UE5的Nanite刷屏?Unity破解Nanite幾十億面渲染只需三招


UE5宣傳片發佈以後,沸騰的不僅是技術行業,不少其餘行業的人都表示,朋友圈也都被刷屏,一臉懵逼。Nanite宣稱能夠渲染160億的三角面,這些對大家行外人來講固然看不懂,咱們行內人也是看的一臉懵逼。算法


在官方沒有放出技術細節以前,很多大佬都在猜想背後的實現原理。主要來講,分兩個方向,第一個就是 Mesh Shader的渲染管線,一個是Geometry Image的技術方案。微信


Mesh Shader的我昨天的文章大概說了下原理。學習


而 Geometry Image的方案 知乎 張心欣大佬說的比較詳細。url

張心欣破Nanite招數於此 https://zhuanlan.zhihu.com/p/140943267spa


但這兩個方案是不衝突的,Geometry Image 能夠在 Task Shader 階段去作。.net


若是須要破功,就先要了解下Geometry Image這麼神祕的專業詞究竟是什麼。如下一小部份內容摘自張心欣的知乎文章。翻譯


和Texture同樣, Geometry Image實質上是一種可以增長物體表面細節的貼圖方法, 只不過, 紋理貼圖貼的是圖案, Geometry Image,貼的是幾何。什麼叫貼的是幾何?


             

好比像這種, 原來好好一個兔子, 往它身上貼一個高度紋理, 並按照那個高度把頂點拉伸出來, 就出現了新的幾何凹凸, 這就是Geometry Image貼圖。

額,我想說無論哪一個行業,作實驗都要用小兔子。。。3d


至於Epic宣傳的160億面,是虛的,是不可能所有真實去渲染的。因此他們本身也提到,Nanite的超多面渲染技術叫作 虛擬微多邊形幾何體orm


這麼多面的場景能夠放入工程,可是絕對不可能所有進入渲染管線裏面。blog

也就是說,他們的技術方案厲害的地方不是在於爲何能支持這麼多的多邊形渲染,而是如何將這麼多的多邊形處理成能用Image表達的數據,而且可以在運行時快速的尋找和映射這些數據。


這裏已經提過的一個方案叫作,Virtual Texture。這個技術方案知乎的 李兵 大佬也有詳細講解過。

淺談Virtual Texture https://zhuanlan.zhihu.com/p/138484024


主要內容就是將超大紋理分塊存儲在磁盤上,這部分叫作虛擬紋理,而在內存中有若干個紋理,這些紋理叫作物理紋理。任什麼時候候當遊戲視野發生變化的時候,須要根據一些方案或者規則去維護這些物理紋理,不用的剔除掉,用的再從虛擬紋理中加載。

             

這樣的機制不只僅減小了帶寬消耗和內存(顯存)消耗,也帶來了其餘好處,好比有利於合批,不用由於使用不一樣的Texture而打斷合批,這樣能夠根據需求來組織幾何,使得更利於Culling,固然合批的好處是states change 變少。LightMap也能夠預計算到一張大的Virtual Texture上,用來合批。


配合SSD的高速硬盤的時候,這些操做並不會特別耗時。


技術方案不可能憑空的誕生,都是逐漸迭代出來的。因此這個方案應該是靠譜的。若是官方公佈的方案和你們猜想的不同,那也不要緊,再去學習新知識就行了。


知道了Nanite的實現以後,要破解就很容易了。這裏,我分爲三步去攻破,都是Unity2017就已經支持的技術。一樣這裏要感謝 Jasper 的貢獻的教程。


個人翻譯工做已經所有完成,正在 微信公衆號:壹種念頭、知乎和Unity官方Connect:放牛的星星 上連載,歡迎關注。


接下來咱們要使用的組合拳法包括:

一:Unity標準着色器的功能,視差。這是基礎渲染教程第二十篇要介紹的內容。目前公衆號已經放出了10章了。

二:曲面細分,OpenGL ES 目標級別4.6級以上能夠支持的功能,Unity2017.1便可支持。

三:表面移位,基於曲面細分的具體應用,實現動態調整GPU頂點位置,處理曲面細分以後的陰影,以及剔除不可見細分。

其中,第一步闡述了Geometry Image在Unity上的實現方式,第二步介紹如何動態的生成超多面和高低關係,第三步則是支持巨量「虛擬」三角面的核心,剔除。

以上的這幾個步驟理論上都是能夠放入 Mesh Shading管線的 Task階段去完成的。

下面進入正題:

 

視差


什麼是視差?

因爲視角的緣由,當咱們調整觀測點時,觀察到的事物的相對位置會發生變化。這種視覺現象稱爲視差。可能咱們平時遊戲開發叫透視。好比,在高鐵上看窗外的風景,附近的物體看起來很大而且移動迅速,而遠處的背景看起來很小而且移動較慢。

那麼咱們遊戲開發中經常使用的一個方式叫法線,它能夠幫助咱們產生必定程度的立體感和光照計算,好比下面就是一張正常的紋理和它的法線:

             

             

當咱們只使用正常紋理的時候,Unity裏的表現以下:

             

導入法線以後,會好很是很是多,以下:

             

法線很是好用也很是重要,可是因爲它是向量,只能表示該點的或者面的方向,沒法表達高度。就比如 一張紙平放在1樓和平放在10樓法線都是同樣的。


要真正的可以表達海拔高度,須要另一個貼圖叫作高度貼圖。有了這個信息以後,配合法線咱們就能準確的進行「僞造」視差效果。

             

這是一張灰度圖,白色表示最高點,黑色表示最低點。由於這張貼圖,一般用來作視差效果,因此咱們叫它視差貼圖而不是高度貼圖。


有了高度貼圖以後,咱們就能夠把它和原紋理、法線進行採樣,調和計算以後,造成以下效果。

       

     

這個技術並沒不是隻有這麼簡單,它涉及了很是多的方面和技術來解決由高度差帶來的投影,自陰影和接受投影,光照等等技術內容,這會在我更新到具體章節的時候介紹,由於和主題無關先略過。


到這裏的話咱們能夠想象一下這個方案的極致運用,是否是隻要有足夠精度和數量的法線貼圖,高度貼圖就能建立出很是完美的真實場景?固然是在完美處理的光影的狀況下。

 

曲面細分


答案固然不是,由於如今這個技術是基於平面的,3A遊戲固然不可能只有一個平面。那麼接下來要打的第二拳叫曲面細分。

看看心欣的例子,低模的小兔子:

             

曲面細分後動態生成的小兔子:

             

曲面細分的原理和咱們遊戲開發中經常使用的高模低模相似。只不過咱們經常使用的都是兩套資源,先作高模烘法線,光影等信息,而後再朝低模上面貼。


曲面細分則是根據算法動態生成。好處就是咱們徹底不須要將咱們不關係的東西加載進來。若是算法合理,極致狀況下,咱們能夠所有用一個平面來表示,而後根據須要來生成模型和頂點。


這是OpenGL ES的新的渲染管線。在頂點程序以前,還有一個Tessellation的過程。

             

 

下面能夠看一看例子,這是一個普通的正方形,有2個三角面。

             

經過一些算法(具體算法和代碼 教程更新到這裏的時候會都會介紹),咱們可讓它變成這樣:

             

這樣:

             

或者是這樣:

             

來個動圖看看:

       

     

既然咱們能夠控制細分三角的數量,固然也能夠把視距、光照、遮擋等其餘因素考慮進來,做爲因子共同影響曲面對三角形的細分。好比下面就是根據攝像機距離來控制細分的數量。

             

那麼介紹到這裏,曲面細分的這拳打完了,大家可能會說,你特麼這不仍是平面麼。有個毛用?


額,嚴格來講這是個招式,爲後面的拳法作起手準備。在極致狀況下,咱們能夠用高模的法線貼圖、視差貼圖、攝像機的相關參數或者其餘因素來控制三角面的生成。


背面或者被遮擋的地方,甚至能夠徹底不用生成。


再來看下心欣的例子:

             

原理幾乎是一致的。只是咱們的例子太簡陋了。

 

表面移位


接下來就是破解Nanite的最後一招了。咱們如今已經可以自動生成面數了,可是全部的面和頂點都在一個平面上,就像這隻兔子被液壓機壓成了一張紙同樣。


若是咱們能根據某些算法或者貼圖或者參考將這些頂點移位到合適的位置,是否是就能還原出整個兔子了?


要實現這一個目標,就須要把前面的視差貼圖和曲面細分結合使用。視差貼圖實際上就是一個置換貼圖,前面的動圖裏咱們能夠看到它能夠用來僞造惟一,既然能夠僞造,那麼固然也能夠將相同的貼圖用於實際的移位。


咱們仍然使用前面的視差貼圖:

             

通常來講把視差貼圖按照法線方向移動就沒什麼問題了。

       

     

曲面細分是有基礎三角形上作算法計算出來的,理論上算法足夠好的時候,生成的三角形和高模的差距不會太大,可是若是算法不夠好的狀況下,基礎三角形的數量會影響曲面生成的質量。越多的基礎三角形生成的質量越高。


好比下面兩個效果:

       

     

       

     

在淺視角下看看咱們動態生成的效果,要記得這個是根據視差貼圖動態生成出來的哦。

             

好了,到這裏三套拳都打完了。固然全部其餘不相關的內容都略去了,好比陰影,光照、剔除等等內容,細節實現的都會在教程更新的時候,和源碼一塊兒給出。


下面給出稍微正式一點的效果,以下:

       

     

這裏是已經考慮了光照和陰影的效果。


總結一下,目前Untiy要實現Nanite相似的效果,技術上要攻克的是如何將ZBrush或者CAD進行正確的烘焙,以便導出響應的低模,法線、視差貼圖、LOD貼圖等等。除此以外,還要作一套良好的內存管理和紋理映射,以便可以在運行時快速定位和生成曲面信息。

 

歡迎關注 個人 微信公衆號:壹種念頭、知乎和Unity官方Connect:放牛的星星 


本文分享自微信公衆號 - 壹種念頭(OneDay1Idea)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索