本文轉自公眾號:虛幻引擎
1.簡介
在我們開始之前……
這是一本中高級指南,主要介紹Nanite組件工作流程 - 而不是建模或網格體創建。
我假設你已經熟悉了Houdini和Solaris。
如果你想繼續操作,還需要從GitHub源構建虛幻引擎5.7。
當UE5.6的《巫師》技術演示發布時,我對植被的變化感到非常興奮 - 卻發現它們實際上要到5.7版本才會實現。快進到上周,我意識到UE主分支現在已是5.7了。完美。 是時候構建它并開始測試了。
Nanite體素化是一個巨大的進步,但仍然缺少一塊拼圖:Nanite組件。
通過深入研究源代碼,我能夠弄清楚如何讓它們工作——至少對于靜態網格體來說。我將在以后的文章中嘗試弄清楚骨骼網格體。
Nanite組件似乎需要具有特定元數據的USD格式。就我而言,我使用Houdini的Solaris來創建網格體并導出它們。
2.快速工作流程概述
1.Houdini中的模型與準備
為每個網格體賦予唯一的名稱和部分屬性。
將網格體保持在世界遠點。
2.在Solaris中設置
SOP導入 → 根據你的組件命名。
配置圖元:類型=xform,類型=組裝。
通過部分屬性將實例網格體分配到點上。
3.添加API模式
根基元→NaniteAssemblyRootAPI+meshType標記。
每個部分基元→NaniteAssemblyExternalRefAPI。
在USDA中手動添加或通過Houdini Python注入。
4.導出USD/USDA
使用.usda用于調試,.usd用于最終的緊湊文件。
5.導入虛幻引擎
啟用r.Nanite.AllowAssemblies=1和Nanite植被。
禁用USD交換:Interchange.FeatureFlags.Import.USD 0。
通過內容瀏覽器導入(不要使用USDStage)。
關閉大型組件的異步加載。
示例:
我的測試樹(1個樹干+6個樹枝變化,實例化200次)有850萬個三角形,沒有紋理或不透明度貼圖。
3.Houdini/Solaris工作流程
1. SOP設置
1. 網格體屬性
1). 添加“名稱”屬性,以便Solaris將每個網格體視為唯一。
2). 添加“部分”屬性作為片段屬性,以便點知道要接收哪個網格體。
2. 網格體定位
1). 在復制到點之前,將所有網格體放置在世界原點。
2). 這確保實例化期間不會出現偏移。
3. 復制到點
1). 我們將遵循帶有變化的標準復制到點方法。在SOP中,最好使用copytopoints節點來測試這一點。在Solaris中,我們將切換到Instancer LOP,將所有組合網格體作為原型,將點集作為實例源。
2). 在早期測試中保持光線充足(例如,立方體/圓柱體而不是完整的植被)。
Solaris設置
1.導入網格體
使用SOP導入LOP,并以你的程序集命名(例如“Tree_assembly”)。
2.導入時配置Root
使用配置Primitive來設置:
類型=xform
種類=組裝
3.材質
將SOP組作為子集導入,然后分配材料(例如,樹葉/樹皮)。
4.實例化
5.使用帶有“part”屬性的Instancer LOP將網格體分配給點。(標準復制到點工作流程)
這是虛幻所期望的層次結構。
4.出口結構要求
只有在以下情況下,虛幻才會將USD視為Nanite Assembly:
根基元元素有:
apiSchemas = [“NaniteAssemblyRootAPI”]
統一標記unreal:naniteAssembly:meshType = "staticMesh"
每個部件基元具有:
apiSchemas = ["NaniteAssemblyExternalRefAPI"]
如果沒有這些,USD將作為普通靜態網格導入,沒有實例。
問題:Houdini/Solaris本身不支持這些API,因此無法使用配置Primitives LOP直接添加它們。
解決方案:在導出之前通過Python注入它們或手動添加到.USDA文件
5.方法1 — 在USDA中手動添加API
1. 導出為USDA(ASCII,可編輯)。
2. 在文本編輯器中打開。
3. 手動添加模式。
上一節中的屏幕截圖展示了USDA文件需要更新的位置。
根基元示例:
def Xform "Tree_assembly"
( kind = "assembly"
(apiSchemas = ["NaniteAssemblyExternalRefAPI"])
Ref基元示例:
之前:
def網格體“樹干”
之后:
def網格體“樹干”
(apiSchemas = ["NaniteAssemblyExternalRefAPI"])
{ ...}
虛幻的USDNaniteAssemblyTranslator在觸發程序集導入邏輯之前會檢查這些API。
6. 方法2 — 通過Houdini Python添加API
如果你不想手動進行USDA編輯,則可以在使用Python LOP導出之前直接在Houdini中注入所需的NaniteAssemblyRootAPI和NaniteAssemblyExternalRefAPI。
我已將Python腳本準備為可下載的PDF,因此你可以將它們直接復制并粘貼到Python LOP中,而無需在本博客文章中搜索代碼:腳本下載:Google Drive鏈接https://drive.google.com/drive/folders/1ZRsUoQ-XDt6J404Vdb2JPKstIYqGjn25
- 這些腳本是在ChatGPT的幫助下生成的——它們目前可以按預期工作,但將來肯定可以得到清理和優化。
如何使用:
1.下載PDF并復制腳本內容。
2.在Solaris中,創建一個Python腳本LOP。
3.粘貼相關腳本:
用于裝配根基元的根API腳本。
每個網格體部分基元元素的ExternalRefAPI腳本。
4.編輯腳本中的primPath或路徑變量,以便它們與Solaris中的基元名稱完全匹配。
5. 導出之前運行Python LOP。
提示:
如果虛幻無法識別該程序集,請仔細檢查腳本中的基元名稱是否與Solaris中的名稱完全匹配(區分大小寫)。
同時打開導出的.usda在文本編輯器(例如記事本)中打開文件,確認所需的NaniteAssemblyRootAPI和NaniteAssemblyExternalRefAPI行已添加到正確的位置。
7.虛幻導入步驟
1. 啟用Nanite植被
在項目設置中,打開Nanite植被。
2. 允許組件
在DefaultEngine.ini中添加:
r.Nanite.AllowAssemblies=1
3. 禁用USD Interchange
運行此控制臺命令:
Interchange.FeatureFlags.Import.USD 0
4. 適用于大型組件
在編輯器偏好設置→實驗中,禁用所有異步加載/編譯(避免崩潰)
5.
USDStage將無法工作——直接通過內容瀏覽器導入。
導入你的USD文件并......等待。具有高多邊形數量的大型組件可能需要一段時間。我還沒有發現硬性限制,但在極端情況下我確實讓虛幻引擎崩潰了。
8.Unreal如何讀取API
在USDNaniteAssemblyTranslator.cpp中:
檢查根基元的NaniteAssemblyRootAPI和meshType。
使用NaniteAssemblyExternalRefAPI查找每個部件基元。
使用NaniteAssemblyDataBuilder來:
注冊部分
來自PointInstancer的地圖變換
應用材質
將數據直接應用于UStaticMesh或USkeletalMesh。
如果缺少任一API,GetNaniteAssemblyRootType()將返回None并且虛幻將跳過組件導入。
9.故障排除和提示
大量導入時崩潰→禁用異步編譯/加載。
未出現任何內容→檢查基元名稱和API模式位置。
錯誤的變換→確保零件在原點建模。
調試→導出USDA并使用文本編輯器驗證模式。
10.最后的想法
無論你選擇手動USDA編輯還是Python自動化,關鍵都是正確獲取這些API模式 - 因為虛幻的導入路徑完全依賴于它們。
這個過程經過了大量的反復試驗(在ChatGPT的大量幫助下),但它確實有效——而且我已經在一片巨大的森林中成功測試了它,并且性能非常好。
我希望這個工作流程在最終的UE5.7版本中會變得更簡單一些,但現在它讓我們有機會開始測試資產創建工作流程和技術優勢。
以下視頻是在5.7版本中使用開放世界默認地圖上的新森林模板拍攝的。它也比環境層面上的森林更加茂密。打開字幕獲取更多信息。
如果你遇到問題,請隨時聯系我們。隨時樂意效勞。
全文完
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.