BLOGブログ

2022.01.05UE4UE4/ BlueprintUE4/ Material

【UE4】複数のマテリアルインスタンスをブレンドする – Texture編 –

執筆バージョン: Unreal Engine 4.27

こんにちは。エンジニアの小倉です。
前回、2つのマテリアルをブレンドしたマテリアルを生成する方法を紹介しました。しかし、紹介した方法ではTextureパラメータのブレンドには対応できませんでした。今回は、Textureパラメータをブレンドする方法を紹介します。

1. ブレンド可能なマテリアルの作成

前回同様、ブレンド処理が可能なマテリアルと、ブレンドするマテリアルインスタンスを作成します。
今回は、以下のような”Texture”というTextureパラメータを持つマテリアルを作成しました。

次に、上記のマテリアルをParentとする以下のようなマテリアルインスタンスを作成しました。今回はこの2つのマテリアルインスタンスをブレンドします。

2. Textureのブレンドを行うマテリアルの作成

Textureのブレンドを行うためには、マテリアルを介してRenderTargetにテクスチャを描画する必要があります。ここでは、2つのテクスチャを線形補間でブレンドした結果を出力するために、以下のようなマテリアルを作成しました。

3. Blueprintでマテリアルをブレンドする

前回と同様に、ブレンド結果を確認するためにStaticMeshComponentを持つBlueprintを作成しました(今回はテクスチャのブレンドを確認するため、Planeメッシュを使用しています)。ブレンドしたテクスチャを書き出すためのRenderTargetの変数として以下の2つを追加しました。

  • CRT2Ds : TextureパラメータごとのCanvas Render Target2D
  • DMI_Drawer : 2.で作成したマテリアルのDynamicMaterialInstance。このマテリアルを用いてテクスチャをブレンドし、その結果をRenderTargetに描画する

テクスチャのブレンド処理は以下のように実装しました。今回はEventGraph上にイベントとして実装し、ConstructionScriptから呼び出すようにしています。

それぞれの処理について説明します。

3.1. テクスチャをブレンドするためのDynamicMaterialInstanceの作成

テクスチャをブレンドし、その結果をRenderTargetに描画するDynamicMaterialInstanceを作成します。ここで、DynamicMaterialInstanceの元となるマテリアルには2.で作成したマテリアルを指定します。

3.2. ブレンド結果のRenderTargetを保持するDynamicMaterialInstanceの作成

ブレンド結果のRenderTargetを保持するDynamicMaterialInstanceの作成し、StaticMeshComponentに設定します。

3.3. マテリアルインスタンスのパラメータ収集

ブレンドするマテリアルインスタンスからTextureパラメータ名を収集します。
TextureParameterValuesから取れる値からは、マテリアルインスタンスで変更されたパラメータ名のみ取得することができます。

3.4. RenderTargetの生成

収集したTextureパラメータの数だけRenderTargetを生成します。このRenderTargetはブレンドしたテクスチャを保持するために使用します。作成したRenderTargetは3.2.で作成したDynamicMaterialInstanceのTextureパラメータとして設定します。
RenderTargetのサイズには1024 x 1024を指定していますが、これは説明を簡単にするために適当な値にしています。理想的にはブレンドするテクスチャのサイズなどから、必要最小限のサイズを計算したほうが良いです。

3.5. テクスチャのブレンド

2つのマテリアルからTextureパラメータを取得し、3.1.で作成したDynamicMaterialInstanceのパラメータに設定します。設定した後DrawMaterialToRenderTarget関数を用いて、3.4.で作成したRenderTargetに対してブレンドしたテクスチャを描画します。ここで描画されたRenderTargetはStaticMeshComponentで表示するマテリアルのテクスチャとして設定されているため、ブレンド結果がメッシュに表示されます。

BlendAlphaを変えると以下のようになります。
結果だけ見ると、ブレンド用に2つのパラメータを用意してマテリアル内でブレンド処理を行っても良さそうに見えます。
しかし、この方法を使えば自動的に全てのパラメータに対してブレンド処理を行うことができますし、前回の方法と合わせれば、複雑なパラメータを持つマテリアルインスタンス同士をブレンドすることも可能です。ブレンド処理を内部に持たないことにより、マテリアルをシンプルにすることもできます。

デメリットとしては、DynamicMaterialInstanceを使用しているためDrawCallがまとまらなくなる可能性があります。また、Textureパラメータのブレンドは、RenderTargetを生成し追加の描画を行う必要があるため、メモリや描画負荷的な懸念がある点に注意が必要です。