ノード型シェーダーエディタ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にはアクセス出来ません。

 

定義前の変数にアクセスしない様、今回は深さ優先探索を使いノードの書き出し順を決めていきます。

下の画像は深さ優先探査の図です。折り返した時に定義するとします。

f:id:koutei7penguin-jp:20190126200119g:plain

 

ノード処理

fixed4をfixedに分解するノードを「ExportColor」と言うことにします。

下の図のコメントはシェーダーの書き出し部分です。

処理の流れ

ExportColorノードのインポートとして接続されたノードの変数(f4)を取得し、ExportColorで決めた変数名で定義します。また、インポート先とエクスポート先の変数の型を確認する必要があります。理由は、仮にExportColorのインポートノードがfixed4以外時のエラーを回避するためです。fixed3の変数のアルファ値をアクセスしますとエラー、想定外の処理が起きます。

f:id:koutei7penguin-jp:20190323105504j:plain

ID決定

その他にもExportColorノードが複数あった場合、定義変数が重複しエラーが出るので、ノード毎にIDを割り当てて定義変数に追加します。IDは上で書いた深さ優先探索でノードで訪れた順にします。

 

リポジトリ

github.com