Unreal Engine 4 (UE4) その2 Advent Calendar 2020 Lerpについて

Category : CGTips, UE4 · by 12月 1st, 2020

Lerpとは?

アドベントカレンダーの一日目ということで、今回はマテリアルのノードの中でも使用頻度が最も高いノードの一つLerpについて解説します。

LerpというのはLinear Interpolateの略で、日本語に訳すと線形補間です。AとBという2つの値の間の直線を、Alphaの値だけAからBに向かって進んだものです。

文章だとわかりにくいので具体的な例と図で表します。

LerpのAに5、Bに8がはいったLerpを用意します。
この時、Alphaが0だと出力は5になります。
(小数点誤差が出るのは仕様なので気にしないでください。)

Alphaが1だと出力は8になります。

これは図で書くと以下のようになります。Alphaの値が0のときは出力はAの位置と等しいので5になります。Alphaが1のときは出力はBの位置と等しいので8になります。

では、Alphaの値が0.5のときは出力はいくつになるでしょうか?

5から8までを半分(0.5)だけ進んだことになるので、結果は6.5になります。

では次に色で見てみましょう。

RGBの場合、RとGとBの3つの値があり、それぞれがAからBの間で変化します。

Aの値にRGBで(0.8, 0.5, 0.0)、Bの値にRGBで(0.0, 0.6, 0.8)を入力します。この時、Alphaが0.75だと出力は(0.2, 0.575, 0.6)になります。

この合成方法はCG屋さんなら非常に馴染みがあると思います。これはPhotoshopの通常合成と同じアルゴリズムなのです。合成割合=Alphaです。

Lerpの使い所

Lerpは非常によく使うノードですが、中でもよく使うシチュエーションをいくつか紹介します。

調整機能として

なにかの値を別の何かに変換して使います。

Roughnessのデータを固有に用意できない場合、カラーのチャンネルの一部を別の値に変換して使うなどの例があげられます。

IFの代用

個人的に最も多い利用法がこれです。Alphaの値に0か1しか入らなくすることにより、AとBの切り替えに使います。

Alphaが0以下もしくは1以上の場合

ここまではAlphaが0から1の間に収まっているときを見てきましたが、今度はAlphaが0よりも小さい場合や、1よりも大きい場合についてみていこうと思います。

最初に書いたとおり、LerpはAとBという2つの値の間の直線を、Alphaの値だけAからBに向かって進んだものですが、Alphaが0よりも小さい場合や1よりも大きい場合は、以下のように変化します。

Flatten Normal

最後にAlphaが0から1の間に収まっていないときの値の変化を利用した面白いテクニックを紹介します。

UE4のマテリアルにFlattenNormalというNormalMapを平坦にするマテリアルファンクションがあるのですが、こちらの中身を見てみるとLaepでNormalMapと(0, 0, 1)を合成しているだけです。

全く変位のないNormalMapはNormalMapをテクスチャで表現する場合にはRGB(128, 0 , 0)=(0.5, 0, 0)ですが、マテリアルの中では(0, 0, 1)です。

Flatten Normalは文字通りNormalMapを平坦にするマテリアルファンクションですが、先ほど紹介したようにAlphaの値を0よりも小さくしたり、1よりも大きくした場合、Normalの変化は以下のようになります。

Flatnessが0のときは変化なし

Flatnessが1のときは、Normalが完全に平坦

Flatnessが1以上のときは、平坦になる傾きを超えて反転する

Flatnessがマイナスのときは平坦な傾きからより遠ざかるので傾きが増す

いかがだったでしょうか?

UE4のマテリアルについて色々書いている本をBoothで出していますので、購入していただけると嬉しいです。

https://kurosaurus.booth.pm/items/1433277

SHARE :