ノード型シェーダーエディタOSS
初めに
今回は、OSS(オープンソースソフトウェア)のお題で簡単なシェーダーエディタを作ってみました。
環境
Unity 2018.2.14f1
ノードの決め事
計算結果を毎回変数に格納して、その計算結果を後のコードに使える状態にします。
例)
float add1 = 1 + 2;
float add2 = add1 + 7;
ダメな例)
float add2 = add1 + 7;
float add1 = 1 + 2;
1行目でadd1にアクセスしますが、定義前のadd1にはアクセス出来ません。
定義前の変数にアクセスしない様、今回は深さ優先探索を使いノードの書き出し順を決めていきます。
下の画像は深さ優先探査の図です。折り返した時に定義するとします。
ノード処理
fixed4をfixedに分解するノードを「ExportColor」と言うことにします。
下の図のコメントはシェーダーの書き出し部分です。
処理の流れ
ExportColorノードのインポートとして接続されたノードの変数(f4)を取得し、ExportColorで決めた変数名で定義します。また、インポート先とエクスポート先の変数の型を確認する必要があります。理由は、仮にExportColorのインポートノードがfixed4以外時のエラーを回避するためです。fixed3の変数のアルファ値をアクセスしますとエラー、想定外の処理が起きます。
ID決定
その他にもExportColorノードが複数あった場合、定義変数が重複しエラーが出るので、ノード毎にIDを割り当てて定義変数に追加します。IDは上で書いた深さ優先探索でノードで訪れた順にします。
リポジトリー
例
お、とりあえず書き出し上手くいった pic.twitter.com/HTjLRUp08m
— Penguin (@Penguin_iceice) 2018年10月24日
お、いい感じ👍 pic.twitter.com/puAS1f0iYZ
— Penguin (@Penguin_iceice) 2018年10月25日
いい感じ👍 pic.twitter.com/0oMvDGxJ5E
— Penguin (@Penguin_iceice) 2018年10月25日