UE4中快速實現簡單GPU流體模擬

遊戲領域在渲染方面一直是跟著電影行業走的,影視行業使用的離線渲染器不僅僅能在光照方面完爆遊戲行業,VFX更是讓遊戲行業望塵莫及。雖然他的缺點是不能實時跑在個人消費者PC上,但是作為對圖形方面有愛好的人,河對岸的彼岸花總是讓人心馳嚮往。隨著硬體的不斷發展,消費者電腦越來越強,使得一些學術界的研究成果在做一定妥協的情況下,可以達到實時渲染模擬。

由於GPU的特性,使得我們可以很好的利用其強大的並行性做一些物理相關的模擬。在GPU GEM[1]中,就有一篇文章描述了如何使用GPU達到一個簡單的理想流體模型,由於UE4有比較方便的材質編輯器和可視化腳本編輯器,所以我嘗試著只用BP和Material而不寫一行代碼,來完成這個測試,

https://www.zhihu.com/video/953051188271235072

模擬的步驟主要分為:

egin{align} &advect(u);\ &diffuse(u);\ &addForces(u);\ &computePressure(u);\ &subtractPressureGradient(u, p); end{align}

演算法在引用中有,不再累述,主要談談UE4中實現的思路:

可以看到這個演算法其實需要多pass,而虛幻中的材質編輯器中所有的材質都是單pass執行的,這一點不像是其他使用fx格式的shader文件可以直接寫多pass標記,但是這不代表虛幻不能很簡單的做這種效果。在虛幻3中,可能需要寫代碼,但是在虛幻4中官方寫了很多BP節點,其中就有DrawMaterial,所以在邏輯中我們線性的調用多次DrawMaterial就可以實現多pass渲染了。

另外由於使用的是RenderTarget做多pass渲染,RT的設置有時需要調整下,默認是:

因為paper中的演算法把貼圖的每個像素點當作一個Grid,為了數值精確,自然不希望被插值採樣,所以為了使用點採樣,調整為:

另外需要注意的是,如果希望使用4通道,那麼貼圖格式必須是:

關於使用連線式編輯器的一些小tip:說是用GPU,其實就是用shader。很多人一開始學shader,總覺得必須寫代碼,才能學到東西,才酷炫,其實過了初學期,材質編輯器這種「美術友好」的東西對程序員來說也一樣舒服:

這是我用到的材質中最複雜的連線中的一個,可以看到,組織合理,布局科學的話,材質編輯器絕大多數時候並不會變成毛線球。BP同理,另外我發現用Sequence在BP里組織代碼比較適用於連線太長不好看邏輯的情況,比如:

由於連線過長,即使縮放最小也不能看完

使用Sequence後:

這樣可以把很長的拓撲結構往縱向發展,適當縮短線的長度,也可以較好理解邏輯執行順序。

另外在不可避免連線很亂時候,可以適當封裝邏輯,這樣下層邏輯在BP里就只是一個大方塊:

為了形象的布局邏輯,但是源頭線太多

最後幫朋友群打個廣告:3866837,對渲染特別是UE4有愛的同學歡迎加入。


[1]Chapter 38. Fast Fluid Dynamics Simulation on the GPU


推薦閱讀:

譯:UE4是如何渲染一幀的(1)
拓幻圖形學工程師教學手冊(第三講)|一字一字敲出OpenGL學習教程
走樣與反走樣(Aliasing/Anti-Aliasing):Graphics Cases
讓角色半透明:後期模糊(二)

TAG:計算機圖形學 | 虛幻引擎 | 遊戲開發 |