UE4 Large Grass Wind 強力風浪效果
大家好這裡是Wild Wolf,之前一直玩Niagara粒子,這次玩玩材質~~鴿了近好幾個月才有空寫這篇文章,作為TA確實很忙~~
最近專案需求需要一個草地的風浪效果,其實風浪效果網上有很多教程和案例,效果也不錯,但是植被這個東西要做出比較好的風浪效果也有很多細節需要打磨,從模型到材質到藍圖整個流程都有細節需要注意,這裡分享一下我自己的實現方法和經驗吧,不廢話先看片~~~
https://www。zhihu。com/video/1414253012915818497
整體效果因為沒有最佳化模型所以看起來比較單一,不過從整體感覺上還是體現出了風浪的感覺,使用了多個材質世界偏移的效果進行了混合疊加的結果,難度其實不高~~
模型僅僅只是隨手拉的一根麵條,刷上了頂點色並保證了足夠多的面數,保證了材質世界偏移的精度。
用來測試的模型非常簡單,甚至連彎曲效果都沒有~~~
接著來到材質,核心功能我事先封裝了材質函式,外層邏輯其實很簡單
利用模型頂點色做了顏色過渡,稍微加了一點引數控制,然後用了PerinstanceRandom做了一個隨機值,保證顏色不會太同意,PerinstanceRandom說簡單點就是針對於例項化的東西——FoliageInstancestaticmesh InstancedStaticMesh等等——在材質裡面的一個隨機值,這個隨機值的範圍是0到1的Float,非Instanced的東西應該是無效的。
隨便拿個模型,然後新建一個材質連上PerinstanceRandom給Roughness,在場景裡刷一些,然後進入Roughness Buffer 就可以看到相應的隨機值~~~
我不想讓基礎顏色出現死黑的效果所以加了0。5然後給了一個限制最終值在0到1的邏輯,然後跟BaseColor相乘(避免死黑方法有很多,這裡偷個懶。。。 )~~
接著進入材質核心邏輯,MF_NewWind
首先做了一個基於UV的漸變,其實這個用頂點色也一樣,因為沒有基礎色貼圖就直接用UV即可,然後加了一個隨機值Perinstance。
Perinstance很簡單
單獨看下UV的漸變效果
略微調整一下數值即可看到出現隨機的漸變,這個漸變值可以給BaseColor Specular WPO以及你想要的效果
來到MF_GrassBend,這一步實現讓草出現大程度的彎曲,引擎自帶的SimpleGrassWind僅僅只是一個擾亂效果,做不到比較自然的彎曲,要麼就是直接出現折斷的效果
RotateAboutAxis這個節點是材質裡面基礎模型頂點透過世界偏移實現的一個旋轉的功能
NormalizeRotationAxis 這個是旋轉軸
RotationAngle 旋轉角度
PivotPoint 旋轉支點
Position 模型頂點世界位置座標
開啟Maya隨便拉一個圓柱體,增加縱向分段加到20,選中模型點選Deform的Non_linear的Bend彎曲命令,調整曲率就可以彎曲圓柱體
https://www。zhihu。com/video/1414272549979590656
紅色即為RotatorAxis,白色球是PivotPosition,Curvature則為RotatorAngle
使用這個節點主要功能是為了讓草出現大於90度的彎曲效果用來模擬被大風吹動之後草的比較強烈的彎曲效果並且加上草本身的重力。
回到UE4,我們暫時使用一個Vector3(0,1,0)作為旋轉軸心,然後新建一個引數作為旋轉角度,ActorPosition拿到模型軸心點的位置,然後透過世界位置來驅動模型頂點,簡單做一個測試如下
https://www。zhihu。com/video/1414276009247670272
透過修改RotatonAngle的值可以實時旋轉模型,但是隻是透過GPU來驅動模型頂點的位置,模型本身的碰撞不會變,接著我們把旋轉值與UV漸變相乘就能得到彎曲的效果
https://www。zhihu。com/video/1414276876743872512
可以看到草的模型出現了一個很柔和的彎曲效果,左邊的BOX因為是引擎自帶模型,頂點數很少所以出現了很奇怪的效果,也可以用模型頂點色代替UV的漸變,但是測試的模型頂點色有些問題所以會出現比如~~~
模型被狗啃了一樣~~~
接著繼續增加一些數值的變化
調整一些數值就可以實現一種輕微的迎風飄動的感覺
https://www。zhihu。com/video/1414280520113467392
但是這個做法會出現模型頂點被拉伸的結果,這個BUG在我後面製作過程中反而覺得能讓效果更好~~ 所以就沒有在意 但是這個問題暫時沒找到解決方法 各位大佬如果有相關經驗歡迎在評論區一起討論~~
OK~~ 旋轉這一步介紹完了,接著我們把SimpleGrassWind的效果和旋轉相結合
調整相關引數就能在彎曲的結果上再附加一些擾亂效果
https://www。zhihu。com/video/1414284183204618240
這樣就能模擬被風浪吹過的效果,沒有之前僅僅只有彎曲那麼生硬
然後還可以透過AdditionalWPO來額外新增一些力來增強效果,具體是否要新增因人而異,我這裡本意是不新增,但是不給一個值的話會報錯~~= =
之後我們接著新增大面積的風浪效果,MF_AdditionalWave這個則是透過世界座標取樣法線貼圖紋理來疊加頂點偏移。
透過世界座標取樣來驅動貼圖UV,配合一個Time和Speed
拿法線的RG通道紋理乘以一個數值來推動頂點,然後和UV漸變做乘法給世界偏移,顏色直接用法線的R通道黑白漸變為了看到具體效果,最終結果是不會拿法線的資料給BaseColor的
https://www。zhihu。com/video/1414293319132721152
看上去感覺方向反了,因為是UV計算,實際上根本看不出來~~~
回到材質函式把這個結果給AdditionalWPO來做一個混合疊加
到這一步所有模擬風浪的效果介紹完畢,最終結果疊加起來完事~~
緊接著繼續新增基於攝像機距離的一個過渡,因為太遠的草的效果不需要非常精確,同時也可以做一個顏色過渡,不讓草的顏色過於統一,失去了透視感~~
實現這個效果寫法有很多,可以透過修改模型材質也可以通過後期,總而言之就是從深度做文章~~ 這裡我直接暴力的拿到模型世界位置和攝像機的距離做文章
https://www。zhihu。com/video/1414297456683667456
調整相關數值可以看到顏色的變化
接著把這個結果分別給BaseColor,WPO,近處草的晃動很強烈,遠處較柔和,顏色一樣的道理。
文章開頭的影片有這個效果,只不過不是很明顯~~~
儘管我們用到多種世界偏移的混合來實現風浪,但是總體來說還是很單一,因為隨機值不能相差太多,但是想讓大面積的草之間有一個區別,這裡同樣可以世界座標來做文章。
同樣透過世界座標取樣一張紋理圖來實現大面積的明暗區域
然後拿到採集的結果給基礎顏色和世界偏移來實現大面積的隨機
https://www。zhihu。com/video/1414302218086920192
透過觀察不難看到顏色深的地方偏移更明顯,整體偏移跟著大面積的Noise走~~~
這一段新增在模型自身顏色計算之後
到這一步材質裡面的文章暫時告一段落,其實還有很多效果並不是很理想,比如沒有處理模型法線,預設全都是(0,0,1)垂直向上,只是為了讓整體顏色看起來更亮,因為燈光照射到物體表面的效果會受到法線影響,包括粗糙度,高光,SSS次表面以及AO都沒有做處理,專案還沒有結束等反饋所以繼續做下去沒有啥太大的意義,實現風浪即可。
最後進入藍圖,我想讓美術可以透過一個簡單的箭頭就能控制風浪的方向,可以簡單的透過材質引數集來實現。
新建一個材質引數集,新增我們需要的所有變數
然後進入材質新增引數集的介面
進入藍圖,我們新增一個Arrow,用Arrow的旋轉資訊來驅動材質引數集
這一步操作很簡單,就是簡單的傳值,熟悉藍圖操作的一眼就看得懂,不做多解釋
然後最後再透過一個數值決定風浪效果的開啟與關閉
進入材質
使用一個Lerp插值的Alpha來做開關,注意這個Alpha只接受0到1的取值,超出這個範圍是錯誤的結果,這一點留意即可
回到藍圖控制這個Alpha對應的引數集引數
然後公開變數在編輯器,即可~~~
最終結果即為文章開頭的影片~~
https://www。zhihu。com/video/1414308424360747008
走過路過點個贊~~~嘿嘿~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
9。6更新 後續研究發現 材質裡面的ActorPosition 和 Object Position 針對InstancedComponent的支援不一樣 所以直接結果就是植被繪製工具刷的草跟手動擺放的草需要呼叫不同的介面 但是本篇文章只是提供一個思路和本人經驗 工程資源更新了~~~
連結:
https://
pan。baidu。com/s/1lwcXNv
QhXaCG9VUJMzNLHQ
提取碼:h0bi
——來自百度網盤超級會員V6的分享