UE4 周期的なリムエミッシブ

あけましておめでとうございます

視線ベクトルとピクセル法線の内積を利用して縁をエミッシブで光らせるリムライト的表現をすることがよくあると思います。今回はこのリムライト的表現で使われる値をそのまま使わずに周期関数へ入力してから使うことで、周波数を変えたり波にオフセットをかけたりできるヘンなリムライト?を作ってみます。

視線ベクトルvの逆向きベクトル-vと法線ベクトルnの内積は正面から縁に向かって1から0に変化します。


1 - dot(\vec{-v},\vec{n})
とすれば正面が0で縁が1になり、単純にこれをエミッシブに出力すれば縁が光ると思います。

これを周期関数である sin() に入力します。
sin(1 - dot(\vec{-v},\vec{n}))

このままだと -1 ~ +1 の値になるので、1を足して0.5を掛けることで 0 ~ 1 の値に変換します。
(sin(1 - dot(\vec{-v},\vec{n})) + 1)*0.5

さらに周波数を変えるための変数 freq をsin() の中にかけ合わせます。
(sin( (1-dot(\vec{-v},\vec{n}) )*freq)+1)*0.5

周期のオフセットのための変数 offset をsin() の中に足します。
(sin( (1-dot(\vec{-v},\vec{n}) )*freq+offset)+1)*0.5

最後に0から1への変化の急峻さをコントロールする変数 sharpness を使ってべき乗します。
(power(sin( (1-dot(\vec{-v},\vec{n}) )*freq+offset)+1)*0.5, sharpness)

この値を適当なカラーにかけてエミッシブ出力するなどすれば完成。

freqを大きくするとリムライトの波の数が増え、
offsetを増やすと波の位置が移動し、
sharpnessを大きくすると明るい部分が狭く(鋭く)なります。


プロジェクトはこちら
(サンプルプロジェクトではsin()ではなく自前で周期関数モドキ作っていますがsin()などに置き換えても同じような挙動になるはずです)
drive.google.com

それなりにコメントを書いているのでナニカの参考にしていただければ…

あと法線との内積に視線ベクトルではなくワールド空間ベクトルを使ったりすると面白いかも。
(サンプルプロジェクトのマテリアル M_PeriodicRim_WorldDir でやってます)