Chapter 16無料公開

🔰ClampとSaturateノード

Yukiya
Yukiya
2024.10.20に更新

環境:UE5.4
作成マテリアル:M_ClampMove, M_ClampMask

前書き

「Clamp」ノードは、値を特定の範囲に制限します。「Min」以下と「Max」以上の値は無視されます。
一方、「Saturate」ノードは、「Min」と「Max」を指定できず、必ず「0」と「1」の範囲になります。
今までの解説での「Clamp」と違うものです。テクスチャの設定ではありませんので、ご注意ください。
ClampIntroduction.png::Clampノード
SaturateIntroduction.png::Saturateノード

「Clamp」でアニメーションの挙動を変更

[使用マテリアル:M_ClampMove]

以前「Sine」の解説章ではおまけで紹介した左右に揺れるアニメーションは、揺れの具合を「Lerp」で調整していましたが、「Lerp」の代わりに「Clamp」を使うと、アニメーションの動きが荒くなります。

TrigonometryFolder_Sine_Move_Finale.gif::Lerp調整の場合のゆれゆれ
Lerpの場合

20241015_Clamp_Move.gif::Clamp調整の場合のゆれゆれ
Clampの場合

「Clamp」のマテリアルはこちらになります。(M_ClampMove)
注意点:「ConstantBias」の「Bias」を「0」にしています。
ClampMoveのマテリアル

セオリー

「Sine」と「Clamp」を適用した「Sine」を見比べると、「Min」と「Max」以外の数値が切り捨てられていることが分かります。「Max」もしくは「Min」に達すると、動きがその値に固定されます。その結果、移動範囲が狭くなり、ガクガクするようになります。

ClampTheoryDesmosGraph.png::DESMOSグラフ

DESMOSのリンクはこちらです。
https://www.desmos.com/calculator/icgoaa4uhw?lang=ja

「PlotFunctionOnGraph」ノードで動きを確かめます。
縦幅が狭いので分かりづらいですが、DESMOSと同じ挙動だと分かります。
ClampMovePlotGraph.gif::関数をプレビューに映す

計算において範囲を適切に制御するのが重要

[使用マテリアル:M_ClampMask]

Unreal Engineのマテリアルのプレビューでは、望んだ通りの表示になったとしても、プラットフォームによって色がおかしくなる可能性があります。これは、マスクや色の制御範囲が「1」以上、または「0」以下になってしまっている可能性が高いからです。

M_ClampMaskでは、「Saturate」がなくてもプレビュー上では見た目に変化はありません。
しかし、プラットフォームによっては違いがわかりませんし、実機でバグを探すのは非常に手間がかかります。安全のために、何かの計算で範囲が「0~1」からはみ出す可能性がある場合は、必ず計算後に「Saturate」を追加することを強くおすすめします。

ClampMask.png::SaturateやClampが必要な場合

「Saturate」と「Clamp」の違い

「Saturate」は、「0」と「1」の間に保ってくれる便利なノードです。「Clamp」で「Min」に「0」、「Max」に「1」を設定すると「Saturate」と同じ結果になりますが、「Saturate」の方が負荷が軽いです[1]。そのため、「0」と「1」間に値を保ちたい場合は「Saturate」を使うのが良いでしょう。
SaturateIsLighter.png::Saturate負荷が軽い

これで「Clamp/Saturate」の解説は以上です。

脚注
  1. 「Clamp」の処理負荷は特別に高くないですが、「Saturate」と比較した場合は、「Saturate」のほうがやや軽いです。 ↩︎