【UE4 マテリアル】ワールド全体に一律でループテクスチャを貼る
【ごあいさつ】
初めまして、平田ラタと申します。
新卒で入り、今年で業界4年目になる背景アーティストとして、
コンシューマ向けゲーム会社で日々UE4を触っています。
自分は根っからの手描きテクスチャ信者なので、あくまでベースは手描きテクスチャにしつつも、マテリアルの工夫でなんとか見栄えを今風に味付けできないか、という試行錯誤をやっています。
そこでこのブログでは、主にその試行錯誤の中で作った変なマテリアルたちを備忘録も兼ねて紹介していきたいと思います。
【本題 ワールド全体に一律でループテクスチャを貼る】
3Dモデルで地面を作る際、まず広大に続く地面をモデルとしてどう切り分けるか、そしてテクスチャをどう貼るか・・・というのは、初めてだと躓くところだと思います。
昔ながらのオーソドックスな作り方としては、ループのテクスチャを作って、地面のマップチップを作って、地面のUVを小さくしてテクスチャをループさせるようにする・・・というものがあります。
しかし、このやり方だとモデルとモデルの継ぎ目に当たる部分のテクスチャの処理が大変です。相当うまく考えてやらないとどうしても継ぎ目が出てしまいますし、切り分け方を考えるのも大変です。
そこで役に立つのが、「ワールド全体に一律でループテクスチャを貼る」という方法です。
巨大なPlaneメッシュに盛り土っぽいメッシュを「ぶっ挿し」してみました。
ご覧のように、テクスチャの継ぎ目は分からないようになっています。
モデルのUVではなくマテリアル内で生成したUVを使用することで、こうした継ぎ目のないループを実現することができます。
もちろん、配置をどれだけ動かしてもテクスチャの継ぎ目が出ることはありません。
【マテリアルの組み方】
マテリアルの中身はというと、これだけです。
(これは手描きテクスチャでやりたい場合のサンプルなのでエミッシブのみに挿していますが、ベースカラーやノーマルマップやラフネスなど他の出力に挿す場合も同じです)
要するに、ある一点のワールド座標の(X,Y)をそのままテクスチャの(U,V)に変換して、それを基にテクスチャを貼っているという処理になります。
もう少し大げさなテクスチャに変えて説明しますと、このような感じになります。
つまり、この場合は描画しているポイントのワールド座標を取ってきて、それを100で割ったものをUV座標にしているということです。
どうして100で割っているのかというと、割らない場合UE4上の1センチがUVの1ループになってしまうためです。さすがに1ループが1センチだと細かすぎますね・・・
「100」の部分はScalarParameterにしていますので、マテリアルインスタンス毎に変更することができます。テクスチャパラメータと合わせて適宜タイリングの大きさを変えましょう。
タイリングの大きさをあとから調整したい際、いちいちモデルのUVを修正しなくていいのもこのマテリアルの利点ですね。