2022-05-13

【UE5】マテリアルを画像(テクスチャ)に変換して使用する方法

マテリアル内部にノードがたくさんあるとシェーディングが重くなる。特に動きがないマテリアルはテクスチャに変換して軽くしてみよう。

Article Image
使用ソフトウェアバージョン備考
Unreal Engine5.0.1

そのマテリアル重くない?

マテリアルノードは複雑になるほど処理コストが大きくなる。

それだけでなく単体のノードだけでも処理が重いノードがある。

例:Noseノード

その代表といえばNoiseノード(主観)

このノードはパラメータを使ってお好みに合わせたノイズを生成できるためとても便利。

しかし実は....「処理が重い」

Noiseノード

このためノイズノードを使っている人は少なく、ノイズテクスチャを使うケースのほうが多い。

そもそもこのノードの存在を知らない人も多いかも。

ノイズを作ってテクスチャに変換しよう

ちょっと面倒だが、実はマテリアルはテクスチャに変換することができる。

今回はこのノイズノードで生成したノイズをテクスチャ画像に変換(ベイク)して使ってみる

テクスチャに変換するメリット

一度テクスチャに変更してしまえば処理は軽くなる。コレに尽きる。

注意

軽くなるのは間違いないのだが、ゲーム中で動的に変化するテクスチャは作れないので注意だ。

あくまで1枚の固定された画像となる。

そのため拡大していくとジャギーが目立つようになるため解像度には注意が必要。

Noiseノードは重い反面、大きく拡大してもノイズが滑らかなのは覚えておきたい

マテリアルを作る

まずはテクスチャに変換したいマテリアルを作る。

マテリアル例

次のようなノイズが生成される

生成されたノイズ

ここで重要なのは出力をエミッシブカラーに繋ぐという点

ベースカラーに入れても出力テクスチャが真っ黒になるだけなので注意。

  • Noiseノードの詳細タブからScale=0.01に設定した。ほかはすべてデフォルト
  • Scaleを小さくするとノイズが拡大されて模様がハッキリする
  • エミッシブ以外のピンは意味がないためマテリアルはUnlitで作業すると軽くていいかも

描画ターゲットを作成

テクスチャ > 描画ターゲットのアセットを作る。

描画ターゲットの新規作成

恐らく英語版は「Render Target」表記

これはマテリアルの処理を経て描画されたデータを一旦ストックしておくバッファのような役割をする。

実際には様々な用途で使われるアセットのようだが、今回は最小限の解説に留める。

テクスチャサイズの設定

赤アセット

この状態でこのアセットを開いても空っぽだが、使用したい解像度だけ指定しておく。

解像度設定

エディタユーティリティブループリントを作成

次にエディタユーティリティ > エディタユーティリティブループリントというアセットを作成する。

エディターユーティリティブループリント

すると親クラスを選択する画面が出てくるので

親クラスを選択

Asset Action Utilityを選択する。

なにこれ?

エディタユーティリティブループリントのアセットアイコン

こちらはゲーム上ではなくエディタ上の操作を自動化するブループリントだ。

つまりここにマテリアルを画像に変換する処理を書いて実行する。

他にもアセットの一括リネームや、大量生成などいろいろな処理が書ける。

今回のマテリアルを画像に変換する程度の処理ならば、わざわエディタユーティリティブループリントを使う必要はない。

アクターのコンストラクションスクリプトに書いてしまえばBP単体をコンパイルする時にマテリアルを画像に変換できるため、こちらを利用するケースはよくありそう。むしろそのほうが簡単だ。

しかし、ゲーム用ではなくエディタ用の処理をアクターに書いているため、処理が必要なくなったらピンを外さなければならず、不具合の原因になるかもしれない。

そのため完全に推奨できる方法ではないと考えた(場合によってはこの処理のためだけの空のアクターを作るケースもある)

加えて、本記事のエディタユーティリティブループリント用のノードの組み方がネットで検索しても僅かな情報しかなかったのでちょうど良いかと考えた。

ノードの組み方

エディタユーティリティブループリントをダブルクリックで開くとまったく空のBPが出るので、レンダ用の関数を一つ作る

関数作成後

その関数の中身は次のように組む

関数内部

「1」の部分の解説

Unreal Editor SubsystemというノードをGet Editor Worldというノードに繋いでいる。

これが正しく接続されていないとコンパイルできない。

正直これは解説しようにも私も詳しく説明できないので、プログラマーあるあるの「おまじない」という言葉で済ませておく。

とにかくおまじないなのでこうノードを組む。すいません。

「2」の部分の解説

ここがメインのベイク処理でDraw Material to Render Target

Draw Material to Render Targetの設定ピン

  • Texture Render Targetに先程作成した描画ターゲットを入れる
  • Materialのピンにベイクしたいマテリアルのアセットを入れる

この次のプリントはおまけ。なくても良い。

このノードがマテリアルをテクスチャへ変換するすべての処理を行っている。

これをコンストラクションスクリプト内で使うという手法もある

かならずコンパイルボタン

コンパイルしないと動かないので忘れずに。

コンパイル

実行

さて、以上でアセットの作成とノード組は完了しているので処理を実行していく。

なんでも良いのでアセットを右クリックして

picture 11

スクリプト化されたアセットアクション > Render Material(自分でつけた関数の名前)をクリックして実行。

このときPrint Stringは「アウトプットログ」に出るので

アウトプットログのオン

ウィンドウからアウトプットログをチェックしておくと良い。

スタティックテクスチャへ変換

これで描画ターゲットのアセットの中に画像が保存されていると思う。

このまま描画ターゲットをテクスチャとして使うこともできるが、処理を行うごとに更新されてしまう。

ということで、これをスタティックテクスチャへ変換する。

スタティックテクスチャへ変換

描画ターゲットのアセットを右クリックしてスタティックテクスチャを作成

テクスチャの完成

これでマテリアルがベイクされたテクスチャアセットが別で生成される。

おまけ

おまけ。読み飛ばしても良い。

テクスチャを開いても何も表示されない

以上で完了しているがテクスチャアセットを開いても画像が何も入っていないように見えて焦ることがある。

これはアルファが設定されてしまっているため。

画像を開いたらCompress Without Alphaをチェック(アルファを使わなければ)

圧縮設定をデフォルトに変える。

圧縮設定

このあたりはお好みで変えてもらえればと思う。

ノイズテクスチャに斜めの白線が入る

完成

なぜか出力したテクスチャに斜めの線が入っている。

NoiseノードのFunctionSimplex以外のものを選べば斜め線のないテクスチャが作れる。

Function

ノイズ生成の元のテクスチャがおかしいから?原因は不明。

以上

ノイズテクスチャを自前で用意しようと思うとわざわざPhotoshop等を開いて作業することになると思う。

別ツールなら自由度は無限大だが、ファイルの書き出しや保存、読み込みが面倒なのでなんだかなぁという印象があった。

この方法でアセットを一度作ってしまえば様々なノイズを画像に落とし込めるので便利ではないだろうか。

ただ、なんとなく書き始めた記事がおもったより長くなってしまった。



この記事をシェア


謎の技術研究部 (謎技研)