| 使用ソフトウェア | バージョン | 備考 |
|---|---|---|
| Unreal Engine | 5.0.1 |
マテリアルノードは複雑になるほど処理コストが大きくなる。
それだけでなく単体のノードだけでも処理が重いノードがある。
その代表といえばNoiseノード(主観)
このノードはパラメータを使ってお好みに合わせたノイズを生成できるためとても便利。
しかし実は....「処理が重い」
このためノイズノードを使っている人は少なく、ノイズテクスチャを使うケースのほうが多い。
そもそもこのノードの存在を知らない人も多いかも。
ちょっと面倒だが、実はマテリアルはテクスチャに変換することができる。
今回はこのノイズノードで生成したノイズをテクスチャ画像に変換(ベイク)して使ってみる。
一度テクスチャに変更してしまえば処理は軽くなる。コレに尽きる。
軽くなるのは間違いないのだが、ゲーム中で動的に変化するテクスチャは作れないので注意だ。
あくまで1枚の固定された画像となる。
そのため拡大していくとジャギーが目立つようになるため解像度には注意が必要。
まずはテクスチャに変換したいマテリアルを作る。
次のようなノイズが生成される
ここで重要なのは出力をエミッシブカラーに繋ぐという点
ベースカラーに入れても出力テクスチャが真っ黒になるだけなので注意。
Noiseノードの詳細タブからScale=0.01に設定した。ほかはすべてデフォルトScaleを小さくするとノイズが拡大されて模様がハッキリするUnlitで作業すると軽くていいかもテクスチャ > 描画ターゲットのアセットを作る。
これはマテリアルの処理を経て描画されたデータを一旦ストックしておくバッファのような役割をする。
実際には様々な用途で使われるアセットのようだが、今回は最小限の解説に留める。
この状態でこのアセットを開いても空っぽだが、使用したい解像度だけ指定しておく。
次にエディタユーティリティ > エディタユーティリティブループリントというアセットを作成する。
すると親クラスを選択する画面が出てくるので
Asset Action Utilityを選択する。
こちらはゲーム上ではなくエディタ上の操作を自動化するブループリントだ。
つまりここにマテリアルを画像に変換する処理を書いて実行する。
他にもアセットの一括リネームや、大量生成などいろいろな処理が書ける。
今回のマテリアルを画像に変換する程度の処理ならば、わざわエディタユーティリティブループリントを使う必要はない。
アクターのコンストラクションスクリプトに書いてしまえばBP単体をコンパイルする時にマテリアルを画像に変換できるため、こちらを利用するケースはよくありそう。むしろそのほうが簡単だ。
しかし、ゲーム用ではなくエディタ用の処理をアクターに書いているため、処理が必要なくなったらピンを外さなければならず、不具合の原因になるかもしれない。
そのため完全に推奨できる方法ではないと考えた(場合によってはこの処理のためだけの空のアクターを作るケースもある)
加えて、本記事のエディタユーティリティブループリント用のノードの組み方がネットで検索しても僅かな情報しかなかったのでちょうど良いかと考えた。
エディタユーティリティブループリントをダブルクリックで開くとまったく空のBPが出るので、レンダ用の関数を一つ作る
その関数の中身は次のように組む
Unreal Editor SubsystemというノードをGet Editor Worldというノードに繋いでいる。
これが正しく接続されていないとコンパイルできない。
正直これは解説しようにも私も詳しく説明できないので、プログラマーあるあるの「おまじない」という言葉で済ませておく。
とにかくおまじないなのでこうノードを組む。すいません。
ここがメインのベイク処理でDraw Material to Render Target
Texture Render Targetに先程作成した描画ターゲットを入れるMaterialのピンにベイクしたいマテリアルのアセットを入れるこの次のプリントはおまけ。なくても良い。
このノードがマテリアルをテクスチャへ変換するすべての処理を行っている。
コンパイルしないと動かないので忘れずに。
さて、以上でアセットの作成とノード組は完了しているので処理を実行していく。
なんでも良いのでアセットを右クリックして
スクリプト化されたアセットアクション > Render Material(自分でつけた関数の名前)をクリックして実行。
このときPrint Stringは「アウトプットログ」に出るので
ウィンドウからアウトプットログをチェックしておくと良い。
これで描画ターゲットのアセットの中に画像が保存されていると思う。
このまま描画ターゲットをテクスチャとして使うこともできるが、処理を行うごとに更新されてしまう。
ということで、これをスタティックテクスチャへ変換する。
描画ターゲットのアセットを右クリックしてスタティックテクスチャを作成
これでマテリアルがベイクされたテクスチャアセットが別で生成される。
おまけ。読み飛ばしても良い。
以上で完了しているがテクスチャアセットを開いても画像が何も入っていないように見えて焦ることがある。
これはアルファが設定されてしまっているため。
画像を開いたらCompress Without Alphaをチェック(アルファを使わなければ)
圧縮設定をデフォルトに変える。
このあたりはお好みで変えてもらえればと思う。
なぜか出力したテクスチャに斜めの線が入っている。
NoiseノードのFunctionをSimplex以外のものを選べば斜め線のないテクスチャが作れる。
ノイズ生成の元のテクスチャがおかしいから?原因は不明。
ノイズテクスチャを自前で用意しようと思うとわざわざPhotoshop等を開いて作業することになると思う。
別ツールなら自由度は無限大だが、ファイルの書き出しや保存、読み込みが面倒なのでなんだかなぁという印象があった。
この方法でアセットを一度作ってしまえば様々なノイズを画像に落とし込めるので便利ではないだろうか。
ただ、なんとなく書き始めた記事がおもったより長くなってしまった。
