【UE4】DistanceToNearestSurfaceで使ってみた

先日、NVIDIAFlexというのを知ってUE4で遊んでいました。

 他にもHairWorksやVXGIなどなどあり、GitHubから落とせます。物理タノシイ

 

動画の中にあるバウンスボールと同じようなものをUE4のマテリアルで作れないかと思い、使ったのがDistanceToNearestSurfaceノードです。

f:id:shuntaendo:20170424212642p:plain

ドキュメント : Unreal Engine | Utility の表現式

 

Distance To Nearest Surface マテリアル表現式ノードは、マテリアルがレベルのどのポイントでも Global Distance Field のサンプリングができるようにします。」--- ドキュメント引用

各メッシュにはDistance Fieldという値が設定されていて、このノードはメッシュの各ポイントの近くにあるメッシュのDistance Fieldの値を取ってきてくれます。

各メッシュでDistance Fieldの解像度スケールが決められています。

f:id:shuntaendo:20170425183239p:plain

 

ViewportのShow Flagsで可視化することができます。

f:id:shuntaendo:20170424215840p:plain

f:id:shuntaendo:20170424215308p:plainf:id:shuntaendo:20170424215338p:plain

 

作ってみる

はじめに"Project Settings → Rendering → Generate Mesh Distance Field"を有効にし、エディタを再起動させます。次回エディタロード時にDistance Fieldがバックグラウンドで作成されます。

 有効にしないとDistance Fieldを使うノードから常に0が返ってきます。

f:id:shuntaendo:20170425142924p:plain

 

マテリアルを作成します。

下記のフォーラムを参考にしました。(ほぼ一緒)

forums.unrealengine.com

f:id:shuntaendo:20170425160732p:plain

Distance Fieldに法線情報を乗算してテッセレーションを使ってメッシュの形を変えています。

 

 World DisplacementTessellation MultiplierテッセレーションモードをFlat TessellationPN Trianglesにすることで有効になります。

f:id:shuntaendo:20170425161045p:plain

 

こんな感じです。ヤッター!

f:id:shuntaendo:20170425173332g:plainf:id:shuntaendo:20170425173056g:plain

 

フォーラムのマテリアル式を参考にすればすぐ実装はできますが、パラメータの調整が難しかったり汎用的に使うにはまだ処理が雑な部分(特に法線情報だけで処理していたり)があるので少し工夫が必要そうです。

 

フォーラムには他にもスライムみたいなものを作っていたり、メッシュが近くにあると透過したりする例もありました。