C++ ときどき ごはん、わりとてぃーぶれいく☆

USAGI.NETWORKのなかのひとのブログ。主にC++。

UE4-4.19 で Material Layers を試用する手順

概要

従来の UE4 では「マテリアルのレイヤーブレンド機能」=「マテリアル関数の合成機能」でした。4.19以降で試験実装された "Material Layers" を使うと「マテリアル関数」ではなく、新たなアセットとして追加される「マテリアルレイヤー」と「マテリアルレイヤーブレンド」を用いた新しいマテリアルのレイヤー合成を試用できます。と、いうわけで基礎的な使い方を確認しつつ試用してみます。

なお、この機能の利点は複雑なマテリアルを作成したい場合に、マテリアル1つで全てを実装しようとするとグラフが混沌となってしまう問題をレイヤーと合成それぞれを独立したアセットに分割する事で解消しつつ、従来のマテリアル関数を組み合わせる方法に比べてもマテリアルインスタンスでの一元的なパラメーターの取り扱いが可能となるなど便利も向上する、ということで試験実装が進められたようです。

実際、すっきりするし使いやすい。(この機能追加のために 4.19 からは MaterialInstance 系の実装が C++er 的にはしれっと変更されていて 4.18 までの C++ コードは少し変更してあげないと翻訳不能になっていたりとかあります。 Blueprint で本記事くらいの機能と動作の確認をした上で実装変更をドキュメントなど眺めると、なるほどそれでこうなったのか、とわかります。知らんと翻訳エラーの発生と対応方法に若干戸惑うかも。)

準備

  1. 4.19 以降のエンジンとプロジェクトを用意する
  2. UE4Editor のメニュー "Edit" から "Project Settings" の "Engine - Rendering" の "Experimental" にある "Support Material Layers" チェックボックスをON

f:id:USAGI-WRP:20180510090224p:plain

Note: OFF -> ON にすると UE4Editor の再起動を促されます。

試用

手順

2つのマテリアルレイヤー la lb と、1つのマテリアルレイヤーブレンド blend を使うマテリアル m を作成し、 mインスタンス i を適当な Static Mesh の Material に設定するまで:

  1. "Content Browser" の "Add New" から "Materials & Textures" -> "Material Layer" でマテリアルレイヤーアセット la を作る
  2. 同様に "Material Layer" アセットの lb も作る
  3. 同様に "Material Layer Blend" アセットの blend も作る
  4. 同様に "Material" アセット m も作る
  5. m の出力ノードの "Details" の "Material" の "Use Material Attributes" チェックボックスを ON にする
  6. m を "Content Browser" のコンテキストメニューから "Create Material Instance" してマテリアルインスタンスアセット i を作る
  7. 適当な "Static Mesh" なり "SK_Mannequin" などを配置して "Mesh" の "Material" に i を設定

動作確認として la lb blend それぞれに適当なパラメーターを噛ませた出力を実装:

  1. la lb に自動的に追加されている "SetMaterialAttributes" ノードの "Details" の "Material Attributes" の "Attribute Set Types" に設定したいマテリアル属性の項目を追加し、出現するピンへ "Texture Sample" や "VectorParameter" などのノードを追加してパラメーターを接合
  2. blend に自動的に追加されている "BlendMaterialAttributes" ノードに "ScalarParameter" ノードを追加して接合し、適当な既定値を設定
  3. m に "Material Attribute Layers" ノードを適当な名前で追加し、出力ノードへ接合
  4. m に追加した "Material Attribute Layers" ノードの "Details" の "Layers" の "Bacbkground" の "Layer Asset" に la を設定
  5. m に追加した "Material Attribute Layers" ノードの "Details" の "Layers" に "Layer 1" を追加し、 "Layer Asset" に lb を、 "Blend Asset" に blend をそれぞれ設定
  6. i の "Layer Parameters" に la, lb blend で追加した設定可能な "Parameters" 系のノードの値を適当に調整

動作確認:

  1. i を設定した "Mesh" を眺めるなりプレイするなりして la をベースに lbblend するマテリアルのインスタンスが意図通り動作する事を確認

補足図

↓ "Support Material Layers" を ON にしたプロジェクトでは作成できるアセットに "Material Layer" と "Material Layer Blend" が増える

f:id:USAGI-WRP:20180510095353p:plain

↓ "Material Layer" アセット作成直後のグラフ

f:id:USAGI-WRP:20180510100043p:plain

↓ "Material Layer Blend" アセット作成直後のグラフ

f:id:USAGI-WRP:20180510100436p:plain

↓ "Material" アセット m の "Details" の "Use Material Attributes" チェックボックス

f:id:USAGI-WRP:20180510101127p:plain

↓ "Material" アセット m に "Material Attribute Layer" ノードを追加し、 "Use Material Attributes" で変化した出力のピンと接合

f:id:USAGI-WRP:20180510101255p:plain

la に動作確認用に例として "TextureSampler2D" パラメーターノードを "SetMaterialAttributes" の "BaseColor" へ追加したグラフ

f:id:USAGI-WRP:20180510121802p:plain

lb に動作確認用に例として "VectorParameter" パラメーターノードを "SetMaterialAttributes" の "BaseColor" へ追加したグラフ

f:id:USAGI-WRP:20180510122102p:plain

blend に動作確認用に例として "ScalarParameter" パラメーターノードを "BlendMaterialAttributes" の "Alpha" へ追加したグラフ

f:id:USAGI-WRP:20180510122120p:plain

m に追加した "Material Attribute Layers" ノードの "Details" の "Layers" に la lb blend を設定

f:id:USAGI-WRP:20180510122223p:plain

i の "Layer Parameters" で la, lb, blend のパラメーターを調整

f:id:USAGI-WRP:20180510122357p:plain

↓ マネキンのマテリアルに i を設定した状態での動作確認

f:id:USAGI-WRP:20180510114251p:plain

参考

  1. Material Layering Feedback for 4.19 - Unreal Engine Forums
    • 試験実装中のマテリアルレイヤー機能の公式スレッド
  2. http://historia.co.jp/archives/955/
    • 従来から使用できるマテリアル関数ベースのマテリアルレイヤー合成機能の参考