- はじめに
- コース概要
- 1.1 Material Instances マテリアルインスタンス
- 1.2 Organizing Material Instances マテリアルインスタンスの整理
- 1.3 Dynamic Material Instances ダイナミックマテリアルインスタンス
- 1.4 Dynamic Material Instances 2 ダイナミックマテリアルインスタンス2
はじめに
先日見たデザインビジュアライゼーションでのマテリアル入門が面白かったため続けてPBRマテリアルの作成も見ることに
コース概要
第1部
- マテリアルインスタンスの作成、使用
- ランタイムにダイナミックマテリアルインスタンスの作成
- マテリアルパラメータコレクション
- 多数のマテリアルのパラメータを一度に操作するときに使用したりする。らしい
- カスタムマテリアル関数
第2部
- Shading Model
- Clear Coat
- ツボに使っている
- Two Sided Foliage 2面Foliage
- 頂点ベースアニメーション
- Cloth 布
- Clear Coat
第3部
ディスプレイスメントマッピングを用いてシャギー
- Material Examples マテリアル例
サンプルファイル
前提条件 & 前提知識
- UE4.0 以降がインストールされていること
- マテリアルに関する基本的な知識
- なければマテリアル入門クラス等を見てくださいとのこと
1.1 Material Instances マテリアルインスタンス
マテリアルインスタンスを使用して作業速度を上げる
使用するマスターマテリアル
- ベースカラー: 赤 + イメージ
- Metalic: 0 = 非金属
- ラフネス: イメージ
- Normal: シンプルイメージ
マテリアルインスタンス作成のための作業
- ここではデモファイル内の MaterialInstances マップで作業をしている
インスタンス側で変更したいノードをパラメータに変換する
- ノードを選択して右クリック → パラメータに変換
- 適当な名前をつける
複雑なノード設定にあるノードを パラメータに変換する
あるノードはパラメータに変換すると上位のノードからエラーが出力される
※ Arithmetic between types float2 and float3 are undefined
※ float2とfloat3間の演算は未定義です
原因は、上にある TexCoord が float2 を返すのに対し、もともと float2 だったノードをパラメータ変換するとRGB Alpha に変換される上に RGB(3float)の出力ピンに変更されるため。
回避策: Append Vector ノードを間に設置しfloat2 を出力するように変換する
パラメータ化完成図
- 動画内でパラメータ化したもの完成図
- 保存(コンパイル)して閉じる
マテリアルインスタンス作成
- インスタンス化したいマテリアルを選択 → 右クリック → マテリアルインスタンスを作成
- 名前をつける
- M_MasterMaterial のインスタンスという事で、 MI_MasterMaterial としている
- M_MasterMaterial のインスタンスという事で、 MI_MasterMaterial としている
マテリアルインスタンスパラメータ修正
- マテリアルインスタンスを開く
- 詳細パネルにパラメータとして定義した一覧があるため、変えたいパラメータにチェックを入れて値を変更する
- 保存して閉じる
マテリアルインスタンスをモデルに適用する
- モデルを選択
- MI_MasterMaterialをモデルのMaterialsにドラッグ
別のマテリアルインスタンスを作成し適用する
- マテリアルインスタンス作成手順で行ったように作成
- 名前は MI_MasterMaterial2 としている
- 名前は MI_MasterMaterial2 としている
- マテリアルインスタンスをモデルに適用する
- 2番目のモデルに対して適用している
- 2番目のモデルに対して適用している
- マテリアルインスタンス作成手順で行ったように作成
- 名前は MI_MasterMaterial3 としている
- マテリアルインスタンスパラメータ修正手順 で行ったように修正
- マテリアルインスタンスをモデルに適用する
M_MasterMaterial に Switch 機能をもたせ一部の機能の有効/無効の切り替えを可能にする
ここではベースカラーに色を乗算するかどうかを切り替えられるようにする
- M_MasterMaterial を開く
- 右クリック → Switch で検索 → パラメータにある StaticSwitchParameter ノードを配置
- ColorSwitchという名前をつける
- ノードを間に挿入する
- 保存して閉じる
確認作業
- MI_MasterMaterial を開く
- 上にチェックボックスが出来ていて色の設定の有効/無効が切り替えられる様になった
1.2 Organizing Material Instances マテリアルインスタンスの整理
- パラメータはグループ化し並べ順を変更させる事ができる
- パラメータはデフォルト値の指定、最小値/最大値を設定できる
Metalic や Roughness は 0 ~ 1 の値しか許容していないが、現状では任意の値を入力できてしまう
パラメータのグループ化について
これまでに作成してきたマテリアルインスタンスを開くとすでに4つのセクションでグループ化されている事がわかる
これらはノードの種類によってグループ化されている。これをカスタマイズする事が可能
グループ設定手順
- M_MasterMaterial を開く
- カラーノードを選択 → 詳細パネル → Group に直接 BaseParameters と入力する
- Sort Priority はそのまま 0
- Sort Priority はそのまま 0
- その他のノード(合計4つ)も同じグループ名で、Sort Priorityのみを変えて設定する
- その他のノードも設定(以下3つ)
- Multipliers グループ x 2
- UV Tiling グループ
- 保存して閉じる
確認作業
- MI_MasterMaterial を開く
- 定義したグループで別れていて優先順位通りに表示されている事がわかる
パラメータにデフォルト値の指定、最小値/最大値を設定手順
- M_MasterMaterial を開く
- 設定したいノードを選択、詳細パネルのマテリアルエックスプレッションスカラーパラメータより設定
- Default Value 初期値
- Slider Min 最小値
- Slider Max 最大値
- 保存して閉じる
1.3 Dynamic Material Instances ダイナミックマテリアルインスタンス
ダイナミックマテリアルインスタンスを使用すると、実行時に定数マテリアルインスタンスと同じ機能が使用できます。 また、ビューアがオブジェクトをクリックしたときなど、カスタムイベントに応じてマテリアルプロパティを変更することができます。 シェーダボールでブループリントスクリプトを使用してダイナミックマテリアルインスタンスを設定するする方法を見てみましょう。
- コンスタントマテリアルとダイナミックマテリアルがある
- コンスタントマテリアルは1.1や1.2で扱ったもので、調整のたびにコンパイルを必要とせず微調整するのに最適なもの
- ダイナミックはランタイムにこれを実行できる
BP_ShaderBall のイベントグラフを作成
ここでは MI_MasterMaterial の下記値をダイナミックに変更できるようにする
– テクスチャ (Set Texture Parameter Value)
– メタリック (Set Scalar Parameter Value)
– ベースカラーに乗算するカラーの値 (Set Vector Parameter Value)
– カラーの値はユーザーがクリックするごとにランダムに変わるようにする (Color変数 と Event Dispatcher)
- BP_ShaderBall をMaterialInstancesマップにドラッグし配置する
- Actors フォルダ配下
- Actors フォルダ配下
- BP_ShaderBall を開きイベントグラフを開く。
- Create Dynamic Material Instance(ShaderBall)を配置し、Souorce Materialは MI_MasterMaterial を選択。
- BP内でMaterial Instanceのパラメータを修正する為に使うノード
- BP内でMaterial Instanceのパラメータを修正する為に使うノード
- テクスチャを設定するため、Set Texture Parameter Valueを配置
- メタリックを設定するため、Set Scalar Parameter Valueを配置
- Parameter Name: Metalic
- Value: 1.0
- カラーの値を設定するため、Set Vector Parameter Valueを配置
- Parameter Name: Color
- 接続する
- Colorはランタイム中に動的に変えるため、BeginPlayからの実行フローを接続しない
- Color情報を保持する為の変数と、イベントディスパッチャーが必要
- イベントディスパッチャーはあるオブジェクトから別のオブジェクトへイベントを送受信できる仕組み
- Color 変数を追加。型は Vector。
- Color 変数をSet でイベントグラフへ配置
- Color の右側の実行フローを Set Vector Parameter Value に接続
- Color の右側のValue を Set Vector Parameter Value のValueに接続
- Levelブループリントからイベントを受信できるようにイベントディスパッチャーを作成する
- Event Dispatchers の + をクリックして新規作成し、Change Color という名前にする
- Change Colorで受信した色情報を保持できるようにするため、詳細パネルの インプット の + をクリック。名前を ColorValue とし、型は Vectorとする
- コンパイルする
- イベントディスパッチャーをドラッグしてイベントでイベントグラフへ配置
- 接続する
- コンパイル + 保存して閉じる
1.4 Dynamic Material Instances 2 ダイナミックマテリアルインスタンス2
ここではシェーダーボールをクリックすると Color がランダムに変更されるようにする
– 前提条件 BP_ShaderBall のイベントグラフを作成 が完了し、BP_ShaderBall側で色変更イベントが受信可能になっていること
- レベルブループリントを開く
ユーザーからマウスカーソルが見える状態にする
まずプレイヤーコントローラーを取得し、マウスカーソルを見える状態に設定し、クリックイベントも有効にする
- Get Player Controllerを配置
- Set Show Mouse Cursor を配置。配置後Show mouse cursorのチェックはONにしておく
- Set Enable Click Events を配置。配置後Enable Click EventsのチェックをONにしておく
どこをクリックしているのかテストする
テストして適切な場所をクリックしている場合はイベントディスパッチャーを使用してカスタムイベントを呼び出す
- Get Hit Result Under Cursor For Objects を配置
- ユーザーがクリック可能なオブジェクトタイプを定義する必要がある
- 配列を作成をクリック
- 配列で何をクリック可能か設定する。WorldStatic と WorldDynamic を設定している
- WorldDynamicは必要ではないが、機能の紹介として追加している模様
- WorldDynamicは必要ではないが、機能の紹介として追加している模様
- Break Hit Resultを配置
- このノードはクリックされたものの色々な情報を取得させてくれる
- このノードはクリックされたものの色々な情報を取得させてくれる
- 左クリックイベントを取得するため Left Mouse Button を配置
- テストするために Branch ノードを配置し接続する
- クリックしたアクタへの参照を得る為に Get Class ノードを配置
- どのクラスなのかを得るために Class is Child Of を配置。配置後、Parent Classは BP_ShaderBall にする
- クリックされたのが BP_ShaderBallの場合はこのノードのReturn Value は True となる
- ブランチの True から別のBranchを配置
- Cast To Bp_shaderball を配置
- Color Change Eventを配置
- ランダムに色を選択するため、Random Unit Vectorを配置しColor Change Eventに接続
- Branch の True を Cast To BP_ShaderBall に接続
- 完成図
- 🤔Cast To BP_ShaderBallは失敗したらそこで処理を停止するからHit Actor から直で Cast していいような。。。
- 完成図
- コンパイル&保存して閉じる
1.5 Material Parameter Collections 1 マテリアルパラメータコレクション 1
複数のマテリアルの値を一度に微調整する
マテリアルパラメータコレクションを使用すると、マテリアルインスタンスパラメータと同じように使用できるグローバルパラメータのグループを作成して、マテリアルパラメータコレクションを実装するマテリアルを制御できます。パラメータコレクションを作成し、マテリアルに追加する方法を見てみましょう。
1個2個の修正ではなく実行時にシーンに起こったことに基づいてシーン内のすべてのマテリアルを変更する必要がある場合どうすればよいか?例えば雨が降り出して屋外のものがすべて濡れた状態になるなどの場合、すべてのマテリアルを変更する必要がある。
または風速などを外の草木全てに適用する場合などはどうすればよいか?
マテリアルパラメータコレクションはこういった場面で役に立つ
入り口付近にあるランプについて
- エレメント0にはベースマテリアルとして M_Chrome が設定されている
- エレメント1 ~ 4 は4種類のガラスマテリアル
- ここでは 1 ~ 4 のエレメントをパラメータコレクションから一度で微調整できるようにする
🤔ここから Woking フォルダを作って パラメータコレクションを作成する作業が開始されるが、ダウンロードする教材にはすでにフォルダが有り、ファイルも作成されている。
フォルダ配下をすべて削除するとランプのマテリアルがすべて無効化されたように見えるのでここでは動画の内容を確認しならがファイルの内容を確認するだけに留める。
パラメータコレクション MPC
- Workingフォルダ下のCompleted フォルダ配下にある MPC_LampShade を開く
- 2つのスカラと1つのベクトルバリューが作成されている
- 名前の SS の部分は SubSurface の略のよう
🤔パラメータの作成はこれで完了の模様。
ちなみに作成方法はマテリアルテクスチャ→マテリアルパラメータコレクション
マテリアルインスタンスの内容を確認
- ランプを選択してマテリアルインスタンスをダブルクリックする
- パラメータとして Emissive Strength などが定義されている事が確認できる
- パラメータとして Emissive Strength などが定義されている事が確認できる
- 親マテリアルを開く
親マテリアルにパラメータコレクションの値を加味するように修正
- 開かれていなければ M_WallSconceShade を開く
- エミッシブカラーにパラメータコレクションの値を適用させる場合は、単純に現在のノードに乗算する処理を追加する必要がある
- パラメータコレクションの値を取得するため、CollectionParameter ノードを配置
- 詳細パネルよりどの値を取得するかを選択。ここでは Emissive Intensity を設定
- 接続する
- Subsurface Color についての作業と思ったが、こちらはすでに完了していた。
- 一つだけ注意が必要なのは Mask(RGB)が追加されている事
- SS Color Ting の出力が float4 に対し SSColor のRGBピンは float3 の為、そのまま接続するとエラーとなる。float3 x float3 とするために Mask(RGB)を使っている
- 一つだけ注意が必要なのは Mask(RGB)が追加されている事
- コンパイルして保存
- MPC_LampShade の値を変えるとそれより上位のノードは一気に影響を受けている事がわかる
1.6 Material Parameter Collections 2 マテリアルパラメータコレクション 2
BPを使ってランタイムにパラメータコレクションの値を変える方法の紹介。ここではランプをクリックしたらランダムに光の色を変えるようにする
- レベルブループリントを開く
- ランプの参照を得る為に、ランプを選択して右クリック Create a Reference to sm_wallScene_001 をクリック
- Equal(object)ノードを配置
- Branchノードを追加
- 接続する
- Set Vector Parameter Value を配置
- Collection: MPC_LampShade
- Parameter Name: SS Color Tint
- Parameter Value: ランダムになるようにする
- コンパイル&保存して閉じる
全体図。🤔前の作業から継続している人とノードは違う可能性があります。私はファイルを作り直したためいくつかのノードが欠けていますが、前の分が残っていても問題ありません。
プレイしてランプをクリックしたら色が変わる事が確認できる
1.7 Material Functions 1 Creating Custom Material Nodes マテリアル関数 カスタムマテリアルノードの作成
Unreal Engineには、想像できるあらゆるタイプのマテリアルを処理するのに十分なマテリアル式が備わっています。 しかし、カスタムで作成が必要な場合があります。マテリアル関数の出番です。
複雑なマテリアルグラフを単一の再利用可能なノードにカプセル化する独自のカスタム関数を作成する方法について説明します。
- マテリアル関数は再利用可能なマテリアルグラフのスニペット
- 他のプロジェクトでも使い回せる
マテリアル関数の作成
🤔と思いましたがデモファイルにはすでに作成済みのものがおいてあるため動画の内容をなぞって見るだけにしておきます。
ここではUVを回転させる機能を持つ関数を解説していく模様。
- 作成方法のメモ
- Material Result ノードはなく Output Result ノードが配置されている
- 関数のインプットを定義するためのノードは Function Input
- インプットの型は詳細パネルの Input Type から定義可能。デフォルトは float4
- ソケット名は同じ詳細パネルの Input Name から定義可能
- マテリアル関数をほかから呼び出し可能にする為にはマテリアルライブラリへの公開が必要
- 公開手順: ノードではないどこかをクリックしマテリアル関数の詳細パネルを表示させ、詳細パネルにある Expose To Libraryにチェックを入れる
- 公開手順: ノードではないどこかをクリックしマテリアル関数の詳細パネルを表示させ、詳細パネルにある Expose To Libraryにチェックを入れる
1.8 Material Function2 マテリアル関数2 カスタムマテリアル関数の利用
マテリアル関数を作成したら、マテリアルで利用する方法を見てみましょう。また、カスタムマテリアル式を使用して機能を追加する別の方法も見てみましょう。これにより、カスタムHLSLシェーダコードをマテリアルグラフに追加することができます。
ここでは寄木細工の床に対して適用していく過程を通してカスタム関数を使用していくとの事。
🤔しかし教材のファイルを見るとすでに適用されているのでやり方をなぞってみていく。
- ノードの追加方法は右クリックで検索にアセット名を入力する。(この場合だと Tiling)
- カスタム関数の定義内に StaticSwitchParameter がありそれをマテリアルで使用した場合、そのスイッチパラメータはマテリアルからは編集できない。
- マテリアルインスタンスを作成すればそちらで修正可能になる
- 他のプロジェクトでカスタム関数を使う場合は移行(migrateマイグレート)させればよい
- カスタムHLSLシェーダコードを使ったカスタムノードというノードの紹介もあったが、こちらはかなりマニアックっぽいのでスキップ
メモ
- M_Sky_Panning_Clouds2 の雲はすごくきれい
- マテリアルインスタンスから親を開く場合はエディット画面詳細パネル → 一般 → 親をダブルクリック
- カスタム関数のノードの色は水色
英語メモ
- Tweaking 微調整
- Tweaking Materials at Runtime
接頭辞
- MI_ Material Instance
- MPC_ Materlal Parameter Collections