アドベントカレンダーの一日目ということで、今回はマテリアルのノードの中でも使用頻度が最も高いノードの一つ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は非常によく使うノードですが、中でもよく使うシチュエーションをいくつか紹介します。
なにかの値を別の何かに変換して使います。
Roughnessのデータを固有に用意できない場合、カラーのチャンネルの一部を別の値に変換して使うなどの例があげられます。
個人的に最も多い利用法がこれです。Alphaの値に0か1しか入らなくすることにより、AとBの切り替えに使います。
ここまではAlphaが0から1の間に収まっているときを見てきましたが、今度はAlphaが0よりも小さい場合や、1よりも大きい場合についてみていこうと思います。
最初に書いたとおり、LerpはAとBという2つの値の間の直線を、Alphaの値だけAからBに向かって進んだものですが、Alphaが0よりも小さい場合や1よりも大きい場合は、以下のように変化します。
最後に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で出していますので、購入していただけると嬉しいです。