Notifications
Article
ShaderGraphについて・・
Updated a month ago
514
0
ShaderGraphについて
この記事は Unity #2 Advent Calendar 2018のものです

Shader Graph について

上記画像の様にノードベースで シェーダーを作成出来る機能です。 Scriptable RenderPipelineとセットで使う事を想定されていますので、LWRPなどを利用しないと機能が使えません どんな機能かは Unite Tokyo 2018で行われた「新機能Shader Graphを使えばプログラミング無しにシェーダーが作れるようになります!」という講演が非常に参考になります。 こちらは 2018.1 ~ PackageManagerで提供されました。しばらく preview版として公開されていましたが、2019.1のαで出た ShaderGraph 5.1.0のパッケージで晴れて preview がなくなりました。

この記事について…

Shader Graphで自分のノードをつくる話でもしようかと思っておりました…。 ( Graph機能をまとめたい場合には SubGraphという機能がありますが、そうではなくプログラム側で新規にノードをつくる話をしようと思っていました…)
ですが… Shader Graphの preview がなくなった 「5.1.0」にて INode インターフェースが publicじゃなくなりましたーーー。 5.0.0-preview までは public だったんですが、このコミットでいろんなものが internal になってしまいました……
という事で Shader Graphカスタムして自分だけのノードをつくろうとすると ソースを落としてきて、改造する必要がありました… 流石にPackage改造してしまうとバージョンアップついていけなくなってしまうしな…… という事で 私の野望は終わってしまいました…
はい。今日の記事はおしまいですーーーー!!!


というのは流石にアレ過ぎるので、ShaderGraph周りについて簡単な仕組み解説を書く事にしました。

ShaderGraphのグラフをShaderとして認識する仕組みについて

.shadergraphファイルは、設置されたノードの情報を Jsonの形式で保存しています。 これだけでは Jsonのテキストファイルになってしまうため、Shaderとして認識されません…。 そのため、 Shader Graphでは ShaderGraphImporterというScriptedImporterを継承したクラス を使う事でJsonをShaderとして扱っております。 具体的な話としては、この中でGraphの情報から Shaderの文字列を生成してUnityEditor.ShaderUtil.CreateShaderAssetでShaderオブジェクトにしています。

ShaderGraphのMasterNodeについて

ShaderGraphの場合 MasterNodeに渡すものが ユーザーから見た時の最終出力となっており、ここにデータを渡すと最終出力はイイ感じでやってくれる仕組みになっています。 このイイ感じが気にくわなかったんで、今回 自分用にマスターノードを作成しようとしてたのですが…。思ったよりも大改造となってしまったため、断念しました… このマスターノードですが… 実は ShaderGraph側にはなく SRP( LWRP/HDRP) 側に置かれる形になっています。
先ほどの LWRPでの MasterNodeは LightWeightPBRSubShader.cs でノード自体は定義されております。 Shaderがどのようになるかは lightweightPBRForwardPass.template 側で定義されています。 UnlitNodeも同様に、LightWeightUnlitSubShader.cs と lightweightUnlitPass.template にて処理が記載されております。
template側の ${PixelShader} みたいに書いてある部分を Nodeから引っ張てきて置換して Shaderにする仕組みのようです。 この辺りを手を付けるとMasterNodeを改造出来そうです… が、ここはやらない方向で……
という事で、Unity ShaderGraphについてでしたー。



Tags:
YusukeKurokawa (黒河 優介)
Developer Relation Manager/Engineer - Programmer
6
Comments