FluidNinja的創建者Andras Ketzer分享了有關如何在Unreal的視覺效果系統Niagara中構建基本紋理採樣發射器的分步指南。
計劃
在本教程中,我們將從頭開始構建兩個Niagara系統。通過採樣簡單的流圖紋理來設置初始粒子屬性的方法-並通過對其進行修改來設置第二個系統,該系統通過對活動簿進行採樣來動態更改條件。提供的所有資產:打包為2.4 MB ZIP。
我們第二個系統的示例數據是Kármán渦街的活動簿渲染速度圖,這是重複的渦旋旋渦的經典流體動力學現象,在Unreal Editor中使用FluidNinja模擬並烘焙。
完成本教程後,我們將看到以下場景:
介紹
利用流體動力學是VFX社區的一項持續性工作,並為創建逼真的氣體,液體和各種空靈效果(無論是妖魔召喚還是空間扭曲)提供了基礎。
我們即將在遊戲中使用實時模擬:看看Niagara中用於基於粒子的模擬的新Simulation Stages功能和“體積插件”(Volumetrics Plugin),能夠在固定網格系統中體素化網格並模擬流體行為。
在嘗試實時流體並等待硬件增長以完成此任務時,我們使用的是預先計算(烘焙)的流體sim數據,這些數據實際上存儲為一系列幀,折疊為單個紋理:一個活頁簿。
動畫書示例:
默認情況下,我們使用翻頁書的方式與使用經典紋理的方式相同:使用材質對其進行採樣並將其映射到場景幾何圖形上。看一下從Mandragora遊戲(火與水)中捕獲的這些典型示例:
Niagara提供了一個替代用例:利用樣本紋理數據接口,我們可以直接使用Niagara模塊對流體數據進行採樣(不需要任何材料),並將紋理存儲的值解釋為float / vector / color類型變量,以驅動任意粒子參數。我們可以用流體數據驅動大量GPU粒子。
與幾何圖形化紋理不同,“粒子紋理化”不應是紋理空間與粒子空間之間的一對一拓撲映射:流體數據可以(1)為動態模擬提供初始條件,(2)驅動抽象參數或(3)相加使用。關鍵是我們正在改變粒子行為而不是確定。
也許最壯觀的例子是使用來自流體模擬的速度數據來加速粒子。而不是覆蓋固有速度,我們將粒子推向模擬定義的方向,同時允許與場景幾何體發生碰撞。與經典的烘焙VFX不同,我們的系統可以響應物理。
創建一個簡單的紋理採樣發射器
想像一下,我們在二維平面上運動,並且我們的運動方向和速度(統稱為速度)由顏色描述。水平運動用紅色陰影表示:值50%表示我們站立,100%表示全速左,0%表示全速右。垂直移動為綠色:上升0%,站立50%,下降100%。想像一下攪拌一碗液體,並從頂部開始對錶面進行圖片/快照,然後根據給定點處的流體運動速度為圖片上的每個採樣點分配紅色和綠色值。我們將使用存儲為紋理的2D矢量場來描述運動數據-這是速度圖又稱為流圖的概念。速度活頁簿是一系列的速度映射,描述了流體系統速度矢量的時間變化。
我們不需要流體模擬器就可以製作單個流程圖-多虧了Teck Lee Tan,我們有了一個簡單,穩定,免費的7 MB軟件來手繪此類地圖:FlowMapPainter v0.9.2,自2012年起開始提供。
我鼓勵您下載該工具並玩玩!通過切換FlowLines和VertColor標誌,您可以可視化上述矢量和顏色。您也可以預覽動畫流程。創建一個流程圖並將其拖到虛幻內容瀏覽器中以開始開發!我做了一個簡單的,順時針的圓形筆觸-此流程圖描述了循環流,這將是我們第一個系統的樣本數據。
FlowMap Painter:
啟動虛幻引擎,在內容瀏覽器中創建一個工作文件夾,將流程圖導入到該文件夾。右鍵單擊空白區域,然後選擇FX / NiagaraEmitter /從模板創建新的發射器-然後選擇“空”類型。
創建一個新的發射器:
進入Niagara編輯器後,保存空白系統。第一步,我們將添加一個生成位置模塊。單擊“粒子生成”旁邊的綠色加號(+),然後選擇“位置/網格位置”。出現模塊-帶有警告。不用擔心,GridLoc需要另一個模塊作為前提條件。選擇“修復問題”。在“發射器更新”(Emitter Update)組下創建第二個“網格中的生成粒子”模塊-第二個警告。再次,選擇解決此問題。完成後,我們將獲得兩個新模塊。
添加了“網格位置”和“生成粒子”模塊:
右鍵單擊GridLocation模塊,然後選擇“在上方插入”,然後在模塊瀏覽器中開始輸入“紋理”-您是否看到“樣本紋理”模塊?選取。
添加樣本紋理模塊:
樣本紋理模塊已添加。接下來,選擇堆棧頂部的Emitter Properties模塊,並將Sim Target從CPU設置為GPU(只有GPU發射器可以對紋理進行採樣)。另外,將本地空間標誌設置為ON。
發射器特性:
同時,停止重複播放時間線(底部的黃色條,將垂直定位器拖動到3-4秒)+轉到視口頂部,單擊“點亮”,轉到“曝光”,關閉“自動”並將EV100設置為2 。
我們將回到SampleTexture模塊。選擇流程圖作為“紋理”輸入。
樣本紋理:
接下來,我們將通過UV坐標處理紋理到粒子的映射。公理:我們可以使用2D坐標系尋址(採樣)紋理像素-兩個軸(U和V)描述了採樣頭的水平和垂直位置。圖像的左下像素為0,0,右上角為1,1。要將紋理信息分配(映射)到粒子,我們可以使用3D XYZ粒子位置的第一個和第二個值(X,Y)作為UV坐標。我們的粒子已經排列在2D平面/矩形網格上。我們需要做的是:讀取粒子位置並以最小-最大坐標值適合0-1範圍的方式轉換值。要執行此轉換,我們需要縮放(乘法)和偏移(加法)。
單擊UV數據行右側的小箭頭。輸入“ break”-並選擇Break Vector 2D-這樣我們就可以分別處理U,V。
中斷向量2D:
現在,我們將要(1)從XYZ粒子坐標中選擇X值,(2)對其進行轉換,(3)將其用作U。單擊X旁邊的箭頭,然後從Vector中選擇Make Float。選擇“ X”作為頻道。對Y(V)執行相同的操作,但選擇“ Y”作為通道。
從向量浮點:
請看上面的屏幕截圖:我們將使用“黃色”彩色值作為U,V。
現在,我們為輸入字段配備了轉換工具(add,mult)。單擊小箭頭,鍵入“添加”,選擇“添加向量”。對U,V(X,Y)都執行此操作。
添加向量:
請注意,我們現在有A和B行-我們將B添加到A。現在,單擊_the A row_旁邊的小箭頭,然後鍵入“ mult”,然後選擇“乘以Float乘以矢量”。對U,V(X,Y)都執行此操作。我們應該像這樣結束(參見下圖)。
將向量乘以Float:
我們擁有將粒子坐標轉換為UV 0-1值所需的一切-下一步,我們要求粒子坐標!看看上面的圖片-我們將用XYZ粒子pos(分別僅使用X,Y)填充黃色的輸入字段。
單擊輸入字段旁邊的小箭頭,轉到“鏈接輸入/粒子”,然後選擇“粒子位置”。
粒子位置:
讓我們仔細看一下這個Sample Texture模塊。雙擊堆棧中的模塊。彈出圖形編輯器(Niagara模塊編輯器)。
樣本紋理模塊:
請注意Map Set節點中兩行的第一個:OUTPUT MODULE SampledColor-這是模塊輸出,即採樣的紋理數據,我們將在模塊堆棧的下游(下部)使用其他模塊。現在關閉模塊編輯器。返回通用模塊堆棧查看器。選擇“初始化粒子”模塊。單擊“顏色”輸入字段旁邊的小箭頭。轉到“鏈接輸入/輸出”,然後選擇以前看到的“輸出樣本紋理”。
初始化粒子-選擇輸出SampledColor:
我們剛剛將採樣的紋理數據導入了粒子-您可能已經註意到視口中(默認情況下為)粒子顏色發生了變化。粒子已經“紋理化”,但是紋理縮放錯誤。還有一件事:將“ Sprite Size”設置為15(默認為5)。
我們將返回到“樣本紋理”模塊,並進行一些粒子坐標到UV的轉換。將浮點乘數設置為0.001(比例),並將偏移矢量的X,Y值設置為0.5。
粒子與UV轉換的坐標:
希望我們最終可以將我們的粒子網格顏色正確地映射到流程圖。顏色映射只是一個參考-這樣,我們就可以看到運動矢量場。請記住,顏色代表速度和方向。那麼,讓我們將此數據引導至速度模塊!
單擊“粒子生成”組標題旁邊的綠色加號(+),鍵入“ velo”,然後選擇“添加速度”模塊。不用擔心警告:單擊“修復問題”:從理論上講,這是在堆棧底部添加一個求解器-應該會出現“ Solve Fores and Velocity”模塊。如果沒有,我們將通過單擊除粒子更新之外的綠色加號(+)並手動選擇它來創建一個。還有一件事:在我們的第一個示例中,我們想設置初始粒子速度-讓我們將“添加速度”模塊向上拖動到堆棧中的一步-應該在“施加初始力”模塊之上。我們應該像這樣結束(參見下圖)。
Velo模塊已添加:
選中“施加初始力”,應啟用“對速度施加力”標誌。選擇添加速度模塊。接下來,我們將從採樣的4通道顏色數據(RGBA)中得到3通道速度矢量(XYZ),並將其用作模塊輸入。請記住:採樣的顏色數據使用50%的紅色和綠色值作為零點,而使用0%-100%作為相反的最大值。這是因為紋理通常不能容納負值。現在…工程師喜歡描述(-100%)(0%)(+ 100%)範圍內的速度…所以我們需要在此處進行轉換。單擊小箭頭,鍵入“添加”,然後選擇“添加矢量”。專注於A行:小箭頭,鍵入“ make”,然後從Color中選擇Make Vector3。我們的velo輸入面板應如下所示(請參見下圖)。
Velo輸入和轉換:
單擊顏色輸入字段旁邊的小箭頭,轉到“鏈接輸入/輸出”,然後選擇“輸出採樣顏色”。將增加的偏移量(向量B)設置為(-0.25)。單擊vecB下方的向下小箭頭,然後將“縮放已添加速度”設置為(250,-250,0)。第二個值是負值,因為愚蠢的FlowMap Painter正在翻轉綠色通道。您可以在“初始化粒子”模塊中調整粒子壽命,並在“發射器更新”模塊中調整髮射器壽命/回收。為了使粒子能夠很好地進行淡入淡出效果,請在“粒子更新”中添加一個“縮放顏色”模塊,並為alpha繪製一個鐘形曲線(使用“曲線浮動”功能)。
教程第1部分完成後,在時間軸上按Play鍵-在視口處觀察,我們的粒子應以我們的紋理定義的速度開始其生命-在我的情況下,它們以循環流的形式運動(請參見下圖)。
粒子速度集:
創建動畫書播放器
我們的第一個發射器是基於紋理設置初始參數。我們將修改此發射器以使用存儲在活動簿中的烘焙模擬來連續更改粒子運動。
在“粒子生成”組中禁用“添加速度”。在“粒子更新組”頂部,將“樣本紋理”模塊向下拖動。在“粒子更新”中使用綠色加號(+)添加“ Sub UV Texture Sample”模塊。堆棧應如下圖所示。
添加SubUV模塊:
我們將通過合併SampleTexture和SubUV來製作一個新的Niagara模塊。雙擊SampleTexture。我們在圖編輯器中。點擊左上角的“瀏覽”。我們已經在Content Browser中對模塊進行了本地化-並將其克隆。右鍵單擊模塊資產,選擇“複製”,然後根據需要命名。我將其命名為“ SampleTextureFlipbook”。保存。回到Niagara。禁用“樣本紋理”和“子UV模塊”。除粒子更新外,還使用綠色加號(+)將新創建的模塊添加到堆棧中。將其向上拖動到堆棧中兩個禁用模塊的下方。雙擊以打開圖形編輯器-將圖形保持打開狀態並切換回Niagara堆棧視圖:雙擊SubUV也可以為此打開圖形。我們在兩個選項卡上同時打開了自定義模塊和SubUV。
複製粘貼模塊節點:
將活動選項卡更改為SubUV。選擇MapGet和SubUVTxtureCoordintes節點。Ctrl + C(複製到剪貼板)。將選項卡更改為我們的自定義模塊。Ctrl + V(粘貼)。連接與配置類似的節點,如下圖所示。
新模塊:
返回堆棧視圖:選擇我們的自定義書本閱讀器模塊。選擇隨附的速度活頁簿作為“紋理”輸入(T_Fluidninja_Velocity_Flipbook.uasset)。
將X計數設置為7,將Y計數設置為6。我們將復制粘貼上次對“紋理樣本”模塊完成的UV設置。請選擇“採樣紋理”模塊,將鼠標懸停在UV行的空白區域(在紋理選項下方)。右鍵單擊,選擇“複製”。此操作將UV行下的整個層次結構複製到剪貼板。請回到我們的自定義Flipbook閱讀器模塊,將鼠標懸停在UV行中的空白區域,右鍵單擊“粘貼”。層次結構應該出現。在模塊詳細信息的頂部,單擊“階段”行旁邊的小箭頭-並鍵入“時間”,然後選擇引擎時間。這個不斷增長的值將引起活動簿上幀到下一幀的跳躍(播放)。與之前的情況一樣,我們希望進行顏色預覽。
同樣,在“鏈接輸入/輸出”下,“ SampledColor”(小心,禁用的SampleTexture模塊的輸出也在列表中-請勿選擇該選項)。按播放。希望您會在視口中看到該動畫書(請參見下圖)。
在視口中播放的Velo活頁簿:
接下來,我們將使用此顏色信息來加速粒子。右鍵單擊“求解力”模塊,然後選擇“在上方插入”,然後選擇“加速力”模塊。選擇新模塊。在調用採樣的顏色數據之前,我們準備進行轉換。單擊加速行旁邊的小箭頭,然後找到“乘浮點乘向量”。
加速模塊,多個:
下一步:單擊矢量行旁邊的小箭頭,然後找到“添加矢量”。單擊Vector-A旁邊的小箭頭,然後以與Color(鏈接輸入/輸出)相同的方式找到活動簿模塊的輸出。將Vector-B設置為(-0.5,-0.5、0),並將以下Float設置為3000。將坐標空間設置為Local。
將“拖動”模塊添加到“粒子更新”組,將其拖動到“加速力”模塊下方(均應在“求解器”上方),並將“拖動值”設置為3。現在,我們應該看到粒子在旋轉。
加速模塊,參數:
讓我們做一些調整!選擇發射器狀態模塊,並將循環持續時間設置為0.5。選擇初始化粒子模塊。將“生存時間”設置為4,將精靈大小設置為5。轉到“網格位置”模塊,然後啟用“在單元內隨機放置”。您可能在上一個示例中創建了“縮放顏色”模塊-如果沒有,請轉到“顏色”模塊,按“輸出鏈接”下方的箭頭,然後在新出現的面板區域上,為“縮放Alpha”設置“曲線上的浮動”,如下所示(如下圖所示)。
顏色,比例Alpha,曲線浮動:
最後一步,向“粒子更新”組添加“碰撞”模塊,在“拖動”和“加速”之間移動它。強制模塊,並設置以下值(如下圖所示)。
碰撞模塊參數:
還有一件事:讓我們嘗試將粒子發射區域限制為一個小的矩形,該矩形靠近Kármán渦流的假定起點,而不是用粒子淹沒整個區域。
選擇“在網格中生成粒子”模塊,並將X,Y計數都設置為20(減少粒子數)。接下來,選擇“網格位置”模塊,並將“ XYZ尺寸”設置為(2,3,2),將“隨機化”設置為(10,10,10),將“偏移”設置為(0,400,0)。注意:Y = 400偏移值會將粒子發射矩形從中場推到底場。
網格重新配置:
注意2:要將新創建的發射器放置在水平面上,我們應該將其嵌入到NiagaraSystem中。在內容瀏覽器中創建一個,右鍵單擊FX,Niagara System,“來自選定發射器的新系統”-並選擇先前創建的發射器-然後將系統拖到水平上。系統應在不按播放按鈕的情況下工作(在“關卡編輯器”標準模式下)。嘗試將對象移動到粒子流中並進行碰撞實驗。
我們已經完成了第二個發射器-恭喜,如果您已逐步完成此過程,請完成。希望你喜歡!如果出現問題,請不要擔心:所有資產都在這裡可用(在UE 4.25下版本),只需將它們複製到內容文件夾中,然後將您的工作與現有資產進行比較即可。
編輯器中的Kármán渦街:
後記
有很多事情可以做!同時使用密度和速度活頁簿,在粒子云上計算基於陰影的實時光線移動,並嘗試使用抽象參數。您可以繼續閱讀並觀看下面的更多示例視頻: