Investigation of the integration of Maya HyperShade and RenderMan SL

by syoyo

Maya HyperShade と RSL(RenderMan Shading Language) の連携(変換)について模索しています.

結論からいうと、HyperShade と RSL(1.0) の組み合わせは最悪なので、
目標としては lucille shader GUI plugin for Maya + LLL(lucille light transport language)を実現したい.

理由

まず、HyperShade がグラフベースのシェーダ(グラフ指向は、シェーダシステムとしてはよい方向性のデザインだと思う)、
それに対して RSL が手続き型の言語なので、RSL でシェーダグラフを表現するのが非常にめんどくさい.
RSL2.0 を使う手もあるが、RSL2.0 もいろんな意味でアレなので、いっそ RSL2.0 に対応するなら  LLL に対応した方がいい.

また、HyperShade 自体が Maya に限定された機能であること.
Max/Maya/SI にすべてが mental ray が搭載されている今、
次は Max/Maya/SI の シェーダ GUI も mental mill(MetaSL)で統一してきそーな雰囲気がある.
そうなったときのことを考えると、 HyperShade 対応の作業は無駄に終わりそうという懸念がある.

あとは, 3d package soft に依存しない shader GUI が lucille にも欲しい.

現実

とはいえ、「今」を考えると、HyperShade -> RSL 変換は結構自分でもあるとうれしいし、需要もありそうである.

というわけですこし HyperShade I まわり, Maya の shader SDK あたりを調べてみました.

shader SDK

Maya には SDK に 3 種類のシェーダ SDK があるようです.

1. plug-ins

Maya プラグイン全体の SDK. この中でいくつか lambert とか phong とかのシェーダコードサンプルがあります. ただこれは maya plugin 神によれば maya でデフォルトで HyperShade に表示されているものと対応するものではないらしい.

あと、ここにある SDK は HyperShade 上にカスタムシェーダノードを表示させるのにも使われるようです.
MRenderUtil とかの OpenMaya API を使っています(Maya SW render API も使っているのかな?)

2. adskShaderSDK

なんか新しめ? のシェーダ SDK.
内部で mental ray を使うことを想定しています.
(1) に比べると、コードは簡潔かつモダンな感じです.

3. mentalray shader source

maya に標準で付いてくる mental ray shader に対応している感じです(mi base shader とか).
シェーダが、ソース付きであります.

HyperShade 評価

基本的には, python スクリプトで HyperShade のノード情報を自由に取得できるので、
パフォーマンスを気にしなければ python で HyperShade をスキャンしてシェーダグラフ構造作って,
そこから RSL コードを吐く、というステップを踏めば変換完了です.

が、maya plugin 神と一緒にいろいろ調査して、そうウマくはいかないことが分かりました.

– アトリビュートがアニメーションしていたらどうするか?(たとえば lambert.color アトリビュートがキーフレームアニメーションしているなど)

アニメーション値をベイクして, フレーム分の RSL を作る
-> RSL がいっぱいできてしまう. あと複雑な依存があるときにはうまくいかない気がする.

RSL は一つで、アニメーション値はフレームごとに RIB でパラメータで設定する
-> exporter と shader codegen のプログラムの分離ができない(RIB を吐くときに毎フレーム hypershade を評価しなければならなくなるので, export 処理の速度低下がおきてしまう)

– face 単位でテクスチャが貼られていたり、切り替わっているときにどうするか?

– expression がアトリビュートに割り当たっていたらどうするか?

んー、なかなか考えることはいろいろありそうです.

Advertisements