Kurie VFX Shader v1.0を読む
https://x.com/Kurie_vfx/status/2051568491682242670?s=20
こちらのVFXアーティスト kurie さんの作成されたUE5用マテリアルパックを読んでいこうという記事です。
Kurie VFX Shaderについて
UE5.7.0で作成されたマテリアルパック
基本的なVFXで使用されそうな機能が網羅されています。
インストール方法
https://zenn.dev/kurie/books/4e27d7a6dc84de
詳しくはこちら。
Gitでダウンロード→ZIPを解答→指定のフォルダにデータを格納
フォルダ構造

ご提示いただいたフォルダ構造は以下の通りです。テキストとしてコピーしてご利用ください。
VFX_Material_Library
├── FX サンプルのエフェクト
├── Maps サンプルが置かれているイグザンプルレベル
├── Materials マテリアル関係のデータが格納されているフォルダ
│ ├── ColorCurve カラーカーブ
│ ├── Enum パラメータ制御に使用されているEnum
│ ├── Functions マテリアル関数
│ ├── Instances インスタンス
│ └── Master 大元のマテリアル
├── Meshes エフェクトで使用するメッシュ
└── Textures テクスチャ、種類によってフォルダが分かれている
├── Gradients
├── Masks
├── Noise
├── Shapes
└── Utility
PJなどによって差異はあっても、ポピュラーめなフォルダ構でした。
5.7あたりからEnumでパラメーターを設定できるらしいのでマテリアル作りに役立ちそうです。
Materials
M_DefaultForMesh
StaticMeshに割り当てる標準用マテリアル

UEデフォルトの灰色のマテリアルだと、UVの向きがわからないなどビューアー上で見たときの構造がわかりにくいためこういったマテリアルが一つはあったほうがいいでしょう。

データ構造的にはテクスチャを少し補正をかけている感じ。
わたしはこの手のマテリアルにEyeAdaptationを入れていませんでしたが(特に入れない意味はありません)、簡易でエフェクトとして使うときにあったほうがいいかもしれないと思いました。
エフェクト用途だとVertexAlphaを使うこともあるので、私はblendmodeをTrancelusent系にしています。
また、TwoSideの時に裏面では色を変えるなども行ったりします。(半透明+TwoSideは描画がおかしくなるのでやるかやらないかは悩むところです。)
M_VFX_Basic_AdditiveとM_VFX_Basic_Translucent
おそらくこの二つはBlendModeが違うだけ。
UE4の時からあるBlendModeなどの分岐によるマテリアルデータの肥大化を防ぐ運用を参考にしてこの構造なのでしょうか?
この後しっかり読ませていただこうと思います。
M_VFX_Refraction

リフラクションマテリアルです、UEのリフラクションにも大きく分けて2種類
SceneTextureのUVをゆがめるタイプのものと、今回のように屈折を使用するものがあります

Texture

Textureはベーシックなマテリアルやメッシュの確認系
シームレスノイズ系を数個
マスク系を数個
と最低限ながらどれも使い勝手のよさそうなものです、私も汎用を作るときはこういったものは最初に用意するように心がけたいです。

テクスチャは基本的にすべてDefault(DXT1、BC1)のsRGBのものでした、私の場合は白黒テクスチャはクオリティとデータサイズのバランスからBC4のsRGBではないものを使用しますが ここについてはマテリアルやデータの運用を考える際に方向性を固めておく必要があるでしょう。(Kurie VFX Shaderはしっかりと方向性が定まっているように感じます。)
Textureから読み解く
マテリアルはDXT1のColorで統一することで、マテリアルの構築のしやすさと運用のしやすさを重視ししたものだと見受けられました。
商業向けでしっかりとチューニングできたり運用ルールを定めてくれるような人がいない場合
「とりあえず触ってみようと思った人が、とりあえず触って良好な結果を得られる」とても良い設計だと思います。
読み込んでいく

M_VFX_Basic_AdditiveとM_VFX_Basic_Translucentはともにこのようにつながれています。
このMF_VFX_Baseというマテリアル関数がこのマテリアルの根幹をなすものだと思います。
MF_VFX_Base
UV編集部分の設計
TextureCoord[0]-UVのフリップ-UVのオフセット-UVの回転-UVのスケール処理
となっています、スケール処理には2種類、単純なスケール処理0.0,0.0が中心になるもの、と0.5,0.5が中心になるものの2種類が用意されている。
オフセット処理はDynamicParameterを使用したものと、Time*Parameterしたものを加算する方式。
Timeでリニアに動かせるし、Timeに乗算されるParameterを0にすればDynamicのみで動かすこともできる。
オフセット、回転、スケール処理は 同じ値を与えても順番しだいで結果が変わるのでこのあたりの設計は重要。
今回の設計だとオフセット、回転、スケールを同時に制御しようとすると結構難しいかも?
これら同様のUV制御がEmissiveMap2種、Opacityに2種ある。
UV Distortionの設計

UVDistortionは独立したUV編集ができる、ただしMapごとのDistortionは機能を使用するかしないかのみ。
テクスチャがsRGBのテクスチャを前提としているので、それをLinearに変換する処理がある、しっかりと考えられている。

コントラストを調整できるようになっている。強度調整は入れたことがあるけど、distortionのテクスチャにpowerをかけようと思ったことがなかったので「確かにあってもいいのかも」と思いました。
power周りは式を間違えたり値を間違えるとシェーダーのエラーにつながるので、そのあたりのケアもされていました。

テクスチャサンプラー周り

Flipbookを使用するか否か
SpriteでのFlipBookを使用する場合はこのようにSubUV用のサンプラーを使うのが最も手軽。
NiagaraのSubUVはメッシュやリボンで使えたかな…?
FlipBookは機能はONにすると結構大きくインスタンスが変わるみたい
これが

いろいろな機能と両立させるのは難しい機能ではあるので割り切ってこうやって設計するのもよさそう。
色調整
power→乗算→色乗算 この手の計算は先にpowerをしないと変なことになる。 乗算と色乗算は機能としては割とかぶるので一つにまとめてもいいかもしれないし、輝度だけの調整の時に独立していると作業が楽というところもあってちょと悩む。
ブレンド部分

UEのマテリアルを触っていると、「機能の分岐がTrueとFaulseしかなくて不便」と感じることはよくありました
Enumを使うと


このようにパラメーターの数値にラベルを振れるので
簡易的なブレンドの変更などに使えそうです。
とはいえ、計算処理自体は走っているはずなので(UEがシェーダーコンパイル時などのいい感じにしてくれないのであれば)もしプロジェクトで実際に運用するとなった時はエンジニアさんと相談が必要かも。
いつになったらStaticSwitchで複数の静的分岐を作れるのか…
その他の機能部分
フレネル-ParticleColor-Dissolve-VertexColor ここまではEmissiveColorもOpacityも同じ
フレネル
オーソドックスなフレネルを使う機能 EmissiveColorであれば基本はフチを光らせることがほとんど

反面、OpacityではCameraVectorとPixelNMormalを使い、さらに補正をかけたものを使用している

補正なし

補正あり

さらにそれをSmoothStepで調整できるようにしている。

この手法であれば数値しだいで反転もできるので応用もきく


Lerpでブレンドできるのもリッチだ(自分だとこのあたりは数値の乗算だけのシンプル設計にしそう)

ParticleColor
特に凝ったことはしてない普通の乗算ですが、こういった機能系はMFでwrapしておくと後で何かあった時にこのMFだけを編集すればよくなるのでMF化しておくことが大事だったりします。

Dissolve
DissolveはParticleColorのAlphaとは共存しないみたいです。
「消す処理なんだから2種類もいらなくない?」VS「DissolveかけながらAlphaでフェードさせたいときもある」のバトルが起きたりします。

DissolveのParticleColorのAphaが共存していない場合

だいたいこのようにAlphaがDissolveの値として使われています。
Dissolveのテクスチャも
UV-Distortion-texture-補正 と他のテクスチャと同じ流れを汲んでいるので扱いやすいです。

Dissolveの機能は、数年前スクウェア・エニックスの林様がUE4 VFX Art Dive 2020でご登壇された時からよく見かけるようになったSmoothStepを使用したdissolve法が採用されているようです

パラメータ制御を用いた手法ではこの方法が調整と負荷のバランスが取れているのかと思います。
途中で分岐させ、消えるフチの発光処理も作成しています。

簡易的に組み合わせるとこんな感じ、領域をちょっとずらして反転しているので フチだけが光るようになります





