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

Category : CGTips, UE4 · No Comments · 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

UE4マテリアルの変数名の命名ガイド

Category : CGTips, UE4 · No Comments · by 12月 18th, 2018

おひさしぶりですこんにちは。

最近はお仕事で、UE4のマテリアルなど変数名を決める機会が増えてきました。

ですが、アーティストがこういったものの名前をつける機会は過去にはほとんどなかったことや、エンジニア向けにはネーミングルールはあるけれど使う用語がかなり違うことからそのままは転用しにくく、また日常的に使用するDCCツールのネーミングルールのパターンも様々であることから、わかりすい名前ってなんだろうとよく考えています。

わかりやすい名前をつければ怖がらずに使ってもらえますし、ドキュメントを書く手間を省けることもあるかもしれません。

今回、名前の付け方を以下のように統一してみようと考えました。

部位+(状態)+(影響を及ぼす要素)+数学的用語

括弧は省略可能
例 : BrickHeightRenge
例 : RustColor

【部位】とはマテリアルが複数の素材感を持つときにどこに影響を与えるかということです。例えば壁マテリアルの『レンガ』に影響を与えるといったことです。
【状態】とはその変数がマテリアルのどういった状態に影響を与えるのかということです。例えば壁マテリアルの『汚れ』に影響を与えるといったことです。
【影響を及ぼす要素】とはその変数がマテリアルのどのパラメーターに影響を出すのかということです。例えば壁マテリアルの『アンビエントオクルージョン』に影響を与えるといったことです。
【数学的用語】とはその変数がマテリアルのどういった状態をどうするのかということです。例えば壁マテリアルの汚れの『強さ』に影響を与えるといったことです。

数学的用語という名前の付け方はどうなんだというツッコミはナシでお願いします>< (いい言葉が浮かばなかった)

 

ほかには以下のことに気をつけるように心がけています

  • 実装ベースではなく具体的な効果で名前をつける
    例えば、TextureにMultiplyしている変数に対し、TextureMultiplyのような名前をつけることをやってしまいがちなのですが、そこは一呼吸おいて、これは汚れのテクスチャを強くするためにMlutiplyしているんだというところまで考えて、DirtIntensityのような『具体的な効果』に落とし込んだ名前をつけてあげると、使う人にとって優しいものになるのかなと思います。
  • キャメル法に統一
    UE4に倣ってキャメル記法(単語の頭が大文字)で統一します。そのためAOなどの通例として大文字で使われるものでもAoと表記して区切りをわかりやすくします。
  • グループを使う
    マテリアルが大きくなった場合、アルファベット順のソートだけに頼るとわかりにくいので、グループも積極的に活用します。個人的にはSortPriorityまで使うと管理が大変なので使ってないです。
  • なるべくなら20文字程度に収める
    ぱっとみてわかってもらえるくらいの文字数に抑えたいですね。20文字という制限に特に意味はないですが。
  • (将来的には)部位も省略できるなら省略する
    いまだと一つのマテリアルがレンガと木を持っているときに、BrickHeightRengeなどの名前を付ける必要があるのですが、あやゆるものにBrickとつけるのでなかなか取り回しが悪いです。将来的に実装されるレイヤードマテリアルを使えば部位ごとにマテリアルレイヤーを分けられます。そうなるとマテリアルレイヤー側にBrickという名前をつけてしまえるので、変数名もそれなりに簡潔になるのかなあとおもいます。
  • 触ってほしくない場所はなるべく定数+コメントにする
    マジックナンバーはあまり推奨したくはないのですが、マテリアルの場合、UVの中心をとりたいので0.5を足すなどのように、特にいじってほしくもない数字を決め打ちで入れることが多くあります。そういったものはなるべく定数化してコメントを入れておくと後で便利です。

用語集

個人的によく使う英語を集めてみました。

状態を表す用語

英語
日本語
Dirt ほこり(による汚れ)
Moss 苔(が生えた)
Moisture 湿り気
雨だれの表記として見かけたことがあるのですが、英語的に正しいのかは不明
Weathering 風化 BrickWeatheringIntencity
Crack ヒビ
Scratch ひっかき傷
Rust さび

影響を及ぼす要素

基本的にはMaterialの基本パラメーターのままですが、省略したりや例外的な書き方をしているので明記しておきます

英語
日本語
Color BaseColorの略
Rough Roughnessの略
Metal Metallicの略
DetailNormal
Wpo WorldPositionOffsetの略 GlassWpo
Ao AmbientOcclusionの略
Pdo PixelDepthOffsetの略

数学的用語

英語
日本語
Texture (どんな)テクスチャ(を貼るか) CrackTexture
Scale 大きさ
Max 最大
Min 最小
Intensity 強度
Amount
Frequency 頻度
Offset オフセット
Ratio 割合
Position 位置
Spread ひろがり AoSpreading:AOがどの程度広がるか
Shift ズレ HueShift

出張ヒストリア2017に登壇しました

Category : News, UE4 · No Comments · by 8月 21st, 2017

会社主催のイベント、『出張ヒストリア2017』で「Art of airtone」というタイトルで登壇しました。

【出張ヒストリア2017】 Art of airtone from historia_Inc

当日の様子をPANORA VR様に記事にしていただきました

出張ヒストリア!UE4勉強会2017の講演内容レポ

3DCG Meetup #12に登壇しました

Category : News, UE4 · No Comments · by 8月 5th, 2017

リアルタイムレンダリングでのNPR表現というテーマで登壇しました

リアルタイムレンダリングでのNPR表現 from kurosaurus

当日のまとめはこちら
https://togetter.com/li/1138084

3DCG Meetup #10に登壇しました

Category : News, UE4 · No Comments · by 12月 5th, 2016

「UE4でオリジナルキャラを動かそう!」というテーマで登壇しました。

UnrealEngine4でオリジナルキャラを動かそう! from kurosaurus

当日のまとめはこちら
https://togetter.com/li/1056171

出張ヒストリアに登壇しました

Category : News, UE4 · No Comments · by 5月 15th, 2016

会社のイベント『出張ヒストリア』で、京都と東京都鎌田の二会場に登壇ました。

「アーティストが入社一ヶ月で一人でゲームを作ってみた」

という内容ですが、一か月で作成し、ゲームは完成しているものの、モバイル版の対応が不完全なため、まだリリースできていません…ごめんなさい…

京都会場でのまとめはこちら
https://togetter.com/li/975300