執筆バージョン: Unreal Engine 5.2
|
はじめに
マテリアルで複数のテクスチャやパラメータを切り替える手段は主に「If」「Lerp」「Switch」「StaticSwitch」があります。
できることは似たような機能ですが、これらを適切に使い分けるために今回は特徴と処理負荷に注目して比較していこうと思います。
「If」「Lerp」「Switch」に関してはこちらのブログで紹介してますので、使い方等はこちらを参考にするとよいです。
https://historia.co.jp/archives/34433/
特徴
まずはそれぞれの特徴の説明から。
「If」ノード
- ピンの数が多く、やりたいことに対してMaterialGraphが煩雑になりやすい。
- 「大きい」「等しい」「未満」の3分岐ができる
「Lerp」ノード
- 2つの色やテクスチャをブレンドして切り替えられる。
- Alphaの値が0.0~1.0からはみ出すとその分色が飛んでしまうので注意する。
- 正式名称はLinearInterpolate。
「Switch」ノード
- UE5.2から追加されたノード。
- 分岐数が任意で変えられ、分岐名を付けることができるのでノードが整頓しやすい。
「StaticSwitch」ノード
- ゲーム中に動的に値が変更できない。
- 動的に変わらない分、命令数やテクスチャのサンプル数が増えない。
- MaterialInstanceで切り替えはできるので、汎用マテリアルを作り、機能のオンオフなどで使うと効果的。
- 上記の「Switch」とは異なりTrueとFalseでの2分岐のみ。
負荷検証
まずは各ノードを使って、ほぼ同じ動作をするマテリアルを組んでいきます。
また、参照するテクスチャやパラメーターの数を変更して、それぞれの負荷の増加具合も比べていきます。
※Ifに関しては今回はA==Bを使用していません。
※StaticSwitchに関しては今回はStaticSwitchParameterノードを使用しています。
※StaticSwitchノード+StaticBoolParameterノードの組み合わせで同じ動作ができますが、負荷が変わらないので見やすさを優先しています。
参考用にTextureが5つの時のMaterialGraphはこのようになっています。

一通り作成したので、それぞれのmaterial’s statsを見て、Base pass shader(PixelShader命令数)を見ていきます。
TextureSample数やVertexShaderの値は、使用するノードで特に変化はないので割愛します。
|
If |
Lerp |
Switch |
StaticSwitch |
Const4float 1個 |
175 |
175 |
182 |
175 |
Const4float 2個 |
177 |
176 |
183 |
175 |
Const4float 3個 |
178 |
178 |
187 |
175 |
Const4float 5個 |
179 |
182 |
192 |
175 |
Const4float 10個 |
191 |
192 |
202 |
175 |
Texture 1個 |
177 |
177 |
184 |
177 |
Texture 2個 |
179 |
179 |
185 |
177 |
Texture 3個 |
181 |
182 |
188 |
177 |
Texture 5個 |
185 |
188 |
197 |
177 |
それぞれのマテリアルをStaticMeshに張り付け、並べた際のMaterialComplexityはこのようになりました。

結論
結論としてはアバウトになりますが、それぞれ特徴があるので、使用用途に応じて使い分けましょう!
使い分けとしては以下の基準で決めれたらいいと思います!
- Lerp:ブレンドを使う表現の場合は絶対使う。
- If:Lerpと比較して負荷は大きくは変わらない。
- Switch:比較的負荷が高いので、製品としては避けるのが無難。MaterialGraphの簡潔さは最高なので、試作中やマテリアルの解説等の将来的なパフォーマンスを考慮しなくていいケースでは使うとよい。
- StaticSwitch:使える場合は積極的に使うとよい。ただし動的な変化は出来ないので注意。