[Houdini] VOPでシェーダ作ってみた

タイトルのまんまですが。

そろそろHoudiniで作ったデータはHoudiniでレンダリングしたい!と思い、VOPなどを使ってシェーダ作成をしてみました。
このシェーダはちょっと前に作って置いといたやつなんですが、そんなに難しいものではありません。

以下、ターンテーブル的な動画をUPしたのでどうぞ。


HoudiniのVOPは、VEXに皮(GUI)をかぶせただけのモノで、ノードベースでシェーダ構築が出来るというものです。
イメージとしてはMayaのHypershadeやSIのRender Treeなんですが、それらよりももっとさらに低レベルな部分へもアクセス出来てしまいます。
変数作ってそこに直接アクセス出来る、ぐらい低レベルなアクセスが可能なイメージです。Forループだって作れちゃうよ!!

HypershadeやRenderTreeが部品を組み合わせる感覚ならば、VOPはもっと書いてる感じに近いです。
GUIはただ見た目が綺麗なエディタで、やってる内容は完全にプログラミングしている感じです。

つまり多少の面倒くささはあるのですが、逆に細かな情報にもアクセスしやすくなっているので、Mayaでイライラしてしまう人なんかは逆にすごく快適にシェーダ構築が出来るような気がします。

僕はまさにイライラしてしまうタイプなので、かなり快適にシェーダ構築が出来ました。
反面、やはり書いた方が早いんじゃないか、と思う部分も多々あったので、今後はVEXもあわせて勉強していこうと思っています。
やはり入口としてはVOPの方が敷居が低く、最高でした:D

今回のシェーダは、Advanced RenderManで見た輪郭線を試してみたかったので、Toon調のものにしてみました。ちょっとテスト的にノイズを投影していますが、深い意味はありません。
この輪郭線は法線とサーフェスの微分値を使って出されています。とか言うとスゴそうですが、ARManのものを丸写ししただけです:P ただ単にやってみたかったので真似してみました。
VEXはRSLに非常に似ているため、ほとんどそのまま持ってくることが出来ました。なので入門レベルな僕でも非常に簡単にシェーダを組むことが出来ました。

VOPのキャプチャーを以下に。
shaderTest

データはMayaなどと同じく左から右へ、です。
左側にある大きなノードからGlobal変数を取得し、適宜Parameter VOPなどパラメータを取得し、シェーディングさせている感じです。Illuminance Loopもとりあえず練習ってことで使ってみたのですが、中ではLambert計算をしているだけです。
他にもかなり無駄だったり無茶してる箇所あるので、気づいても突っ込まないでくださいww
もしくは是非突っ込んでください(どっちだ

VOPが素敵だなーと思うのは、シェーダのインターフェイスを自分で作成出来ると言う点です。
というのは、シェーダのパラメータなどを自分で定義して、それをUIに反映させることが出来るため、シェーダを組む人と使う人を完全にセパレートすることが出来ると言うことです。
必要なパラメータだけを触れるようにして、他を隠蔽するなんてことも非常に簡単です。

これはRenderManやmental rayでも行えるし、今更何言ってんだって感じなんですが、Houdiniの場合圧倒的に敷居が低いのです。アーティストレベルで行えます。書ける必要ありません。これは大きい。
たぶんICEのコンパウンドとかイメージしてもらえれば良いと思います。
ああいうレベルでまともなシェーダが作成出来る、ホント素晴らしいです。

ところで、VEXのdPds変数とRSLのdPdu変数はほぼ同義なのですが、決定的な違いがあります。それは何か。VEXでは基本的にそのままの微分値(ベクトル)を返すのですが、RSLでは正規化されたベクトルが戻ってくるようです。
なのでRSLのシェーダをトランスレートする場合は多少の工夫が必要だと思われます。

 
と偉そうなことを言いつつ、僕もまだ全然わかっていないので、今後も引き続き勉強をして行きたいと思います。当面の目標は、影の扱いを知る事、Occlusionを使ってみる、point cloudに興味ありすぎるのでまず使ってみる、ライトカテゴリー(?)だかを活用する、実戦投入してみる、という感じです。
とにかく慣れてみようの精神であれこれやってみようと思います。

久々の更新がこんなんですみません:P
お粗末さまでした。

コメントを残す

メールアドレスが公開されることはありません。