SubstanceDesigner:関数グラフでローカル変数を使う その2 関数グラフ間で共有

SubstanceDesigner:関数グラフでローカル変数を使う その2 関数グラフ間で共有

下記記事の続き。

関数グラフで扱える変数の種類

同じノード内であれば、違う関数グラフ間でローカル変数を共有することができた。ローカル変数というのは言い方が適切でないかもしれないが、イメージしやすいようにそう言っている。

ノードの関数グラフで扱える変数には以下の種類があるようだ。名前は今適当につけた。要はスコープがあるという事。

  • システム変数 $time $posなど
  • サブスタンスグラフ公開変数 sbsarとして公開されるもの
  • ノード入力値 入力ピンで設定する物
  • ノードローカル 先の記事で書いたもの
  • ノード共有ローカル 今回の記事で書くもの

いつか別記事でまとめるかもしれない。

ノード共有ローカル変数

ノードに設定された複数の関数グラフ間でローカル変数を共有することができる。制限があり、変数の設定されたプロパティがGUI上で上にあるものしか取れない。また、別関数グラフで設定された変数名はGETノードの自動選択として表示されない。なかなか不透明な感じなので注意。また、下位の関数グラフに値を引き渡すには特定のグラフの作り方がある。

変数を別関数グラフに引き渡す

前の投稿と同じサンプルを、変数定義と利用で関数グラフをわけてみた。一番上の関数ノードとかつあまり値を弄り回さない部分という事で、OutputSizeの関数グラフで変数を設定する。

OutputSizeの関数グラフの中身。Integer2の 0,0を返すのは入力ノードと同じ解像度のノードですよの意味で、関数グラフを作る前のもともとの値。出力している変数は前回と同じである。そして重要な点だが、別関数グラフに変数を受け渡すには、出力ノードの最後はSequenceノードでなければならない。逆に言うとSequenceノードにすると引き継がれてしまうという事。複雑なノードを作る際は気を付けたい。

これはper pixel function、つまりPixel Processor 本体の中身。あらかじめ_dx、_dyが設定されてい折るので、Sequenceノードも必要なく、とてもすっきりした。ただし他人にsbsファイルを渡す際は、コメントでどこで変数定義されているか書いておかないと混乱するかもしれない。

右側が今回の変数定義を分けた例で、左側が分けていない例。まったく同じように動く。すばらしい。

ダウンロード

前回のサンプルも併せて以下に置いておいた。sbsのみ。

https://github.com/logicalmodelin/LGMLtools/tree/8a9ce036cffa69c57016e7708d16b5a1675d6d77/blog20221127_localvar_in_funcgraph

効果的な利用法

今回のサンプルでは1つの関数グラフ内で定義したほうが混乱が少なそうだが、ノードにたくさんの関数グラフを設定して、同じ値を何度も使う際は、効果的にワークすると思われる。そんなサンプルを考えていたが思いつかなかったので今回のサンプルにした。しかしそのほうがわかりやすくていい気もしてきた。

関連公式ドキュメント

なんともハック的な感じがするが、公式のドキュメントでも述べられている。そちらでは、Sequenceを入れ子にしろとあるが、今回のように確実に評価されればなんでもいいようだ。

https://substance3d.adobe.com/documentation/sddoc/create-a-variable-142213592.html

https://substance3d.adobe.com/documentation/sddoc/using-the-set-sequence-nodes-102400025.html

実は先日別のノードの挙動に関してサポートに問い合わせをしたのだが、バグではなく裏でこういう仕組みがあると教えてくれた。Algorithmic社のサポートの人曰く(メールアドレスのドメインがまだAdobeではなかった)、あと数か月以内にピクセルプロセッサのチュートリアルにこれに関する物を増やす予定だという事。

コメントを残す

Previous post SubstanceDesigner:関数グラフでローカル変数を使う その1
Next post SubstanceDesigner:16777216色を網羅した画像