Engine›マテリアル2022-05-13【UE5】マテリアルを画像(テクスチャ)に変換して使用する方法マテリアル内部にノードがたくさんあるとシェーディングが重くなる。動きがないマテリアルはテクスチャに変換して軽くしてみよう。Engine5.0.1そのマテリアル重くない?マテリアルノードは複雑になるほど処理コストが大きくなる。それだけでなく単体のノードだけでも処理が重いノードがある。例:Noseノードその代表といえばNoiseノード(主観)このノードはパラメータを使ってお好みに合わせたノイズを生成できるためとても便利。実は....「処理が重い」このためノイズノードを使っている人は少なく、ノイズテクスチャを使うケースのほうが多い。そもそもこのノードの存在を知らない人も多いかも。ノイズを作ってテクスチャに変換しようちょっと面倒だが、実はマテリアルはテクスチャに変換することができる。今回はこのノイズノードで生成したノイズをテクスチャ画像に変換(ベイク)して使ってみる。テクスチャに変換するメリット一度テクスチャに変更してしまえば処理は軽くなる。軽くなるのは間違いないのだが、ゲーム中で動的に変化するテクスチャは作れないので注意だ。1枚の固定された画像となる。そのため拡大していくとジャギーが目立つようになるため解像度には注意が必要。Noiseノードは重い反面、大きく拡大してもノイズが滑らかなのは覚えておきたいマテリアルを作るまずはテクスチャに変換したいマテリアルを作る。次のようなノイズが生成されるここで重要なのは出力をエミッシブカラーに繋ぐという点ベースカラーに入れても出力テクスチャが真っ黒になるだけなので注意。Noiseノードの詳細タブからScale=0.01に設定した。描画ターゲットのアセットを作る。Target」表記これはマテリアルの処理を経て描画されたデータを一旦ストックしておくバッファのような役割をする。実際には様々な用途で使われるアセットのようだが、今回は最小限の解説に留める。テクスチャサイズの設定この状態でこのアセットを開いても空っぽだが、使用したい解像度だけ指定しておく。エディタユーティリティブループリントというアセットを作成する。Utilityを選択する。なにこれ?こちらはゲーム上ではなくエディタ上の操作を自動化するブループリントだ。ここにマテリアルを画像に変換する処理を書いて実行する。他にもアセットの一括リネームや、大量生成などいろいろな処理が書ける。今回のマテリアルを画像に変換する程度の処理ならば、わざわエディタユーティリティブループリントを使う必要はない。アクターのコンストラクションスクリプトに書いてしまえばBP単体をコンパイルする時にマテリアルを画像に変換できるため、こちらを利用するケースはよくありそう。ゲーム用ではなくエディタ用の処理をアクターに書いているため、処理が必要なくなったらピンを外さなければならず、不具合の原因になるかもしれない。そのため完全に推奨できる方法ではないと考えた(場合によってはこの処理のためだけの空のアクターを作るケースもある)加えて、本記事のエディタユーティリティブループリント用のノードの組み方がネットで検索しても僅かな情報しかなかったのでちょうど良いかと考えた。Worldというノードに繋いでいる。これが正しく接続されていないとコンパイルできない。これは解説しようにも私も詳しく説明できないので、プログラマーあるあるの「おまじない」という言葉で済ませておく。おまじないなのでこうノードを組む。Targetに先程作成した描画ターゲットを入れるMaterialのピンにベイクしたいマテリアルのアセットを入れるこの次のプリントはおまけ。このノードがマテリアルをテクスチャへ変換するすべての処理を行っている。これをコンストラクションスクリプト内で使うという手法もあるかならずコンパイルボタンコンパイルしないと動かないので忘れずに。実行さて、以上でアセットの作成とノード組は完了しているので処理を実行していく。Material(自分でつけた関数の名前)をクリックして実行。Stringは「アウトプットログ」に出るのでウィンドウからアウトプットログをチェックしておくと良い。スタティックテクスチャへ変換これで描画ターゲットのアセットの中に画像が保存されていると思う。このまま描画ターゲットをテクスチャとして使うこともできるが、処理を行うごとに更新されてしまう。いうことで、これをスタティックテクスチャへ変換する。描画ターゲットのアセットを右クリックしてスタティックテクスチャを作成これでマテリアルがベイクされたテクスチャアセットが別で生成される。