【Unity】ShaderGraph焼き込みくん
ShaderGraph便利ですよね。プロシージャルテクスチャみたいなこともできちゃいます。
「みたいな」と言ってるのはこれがテクスチャではなくGPUで生成されているからです。 ある程度複雑な処理だとテクスチャにしてサンプリングしたほうがマシな場合もあるでしょう。 また、テクスチャだけ差し替えて共通のエフェクトシェーダを使うことも多いかと思います。 ということでシェーダーの描画結果からTexture2Dを作る拡張を用意しました。
出来たもの
コード
つかいかた
上記のcsスクリプトは適当なEditorフォルダに入れときます。 CreateAssetMenuに"ShaderBaker"くんがいると思うので作ってあげましょう。
生成したアセットはRGBA=0000のまっさらなテクスチャになってます。シェーダーがないからですね。 シェーダーを指定して適当な解像度やその他設定をいじってApplyするといい感じのテクスチャになります。
これはpngのインポートなどと同じTexture2Dのアセットになってるので同じ用途で使い放題です。やったね。
使用例
こんなかんじのShaderGraphを焼き込んで…
こういうテクスチャができる。
NovaShaderと一緒に使って斬撃が出来た!
似たようなアイデア
まず、ノードベースでプロシージャルテクスチャを作るEditor拡張は存在します。 めちゃくちゃよく出来てます。
https://github.com/alelievr/Mixture
というかShaderGraphと同等の機能やEditorの再実装に近いですね… あと、ノードベースになっているのにアセット内にバイト列が保存されてます。 そういうのはバージョン管理に入ってこなくていいです。
もう一つのアイデアとしてあるのが、今回もやっているシェーダーの焼き込みですが、これも既にあります。
https://www.ronja-tutorials.com/post/030-baking-shaders/
ただし、これは必要なタイミングでテクスチャの再生成を行って適当な場所に出力する必要があります。 本当はシェーダー内容を更新した時点で勝手に再インポートされてほしいので今回は別の実装を作りました。
実装
コード見てもらえばそれだけですが、ScriptedImporterを使ってTexture2Dを生成してます。 ScriptedImporterは独自形式ファイル向けのImporterを作るための機能ですが、 今回は独自拡張子".shaderbaker"だけついてる「無」をインポートして、.metaに刻まれてるインスペクタ設定のみ読んで生成してます。
アセットの生成自体は指定されたシェーダでRenderTextureにBlitして、それをコピーしたTexture2Dを作る実装です。
便利ノード
シェーダ向けだと無いけど、テクスチャ生成になるとちょっと欲しい…みたいなノードがいくつかある。 用意しとくと後で楽できるかもです。
- シームレスノイズ
- 高さマップ→法線マップ変換
- ddx/ddyでゴリ押し
おしまい
絵心がないのであらゆるテクスチャを似たような手段で生成してきました。 Unity内で完結させるのは楽ですが、Unity内でしかテクスチャとして使えないデメリットがあります。 キャラモデル向けテクスチャなどは素直に外で作ってインポートしたほうが良いです。