RSL 2.0
by ますお
久しぶりに技術系の話題を書きます.とは言え,かなり現場寄りな話ですが.
PixarのPhotorealistic RenderMan(PRMan)は,13.5からRenderMan Shading Language(RSL)が大改良され,後方互換性はあるものの,今までとはまるで違うshading systemが構築できるようになりました.以下ではこれをRSL 2.0と呼ぶ事にします.
ネットにはまだあまり情報がないようですが,以下で概要を知る事ができます.
RSL – Introduction to Shader Objects
最も大きな変更点は,シェーダをクラスとして記述できるようになった事です.クラスのメソッドとしてsurface()やdisplacement()などを実装してやると,マテリアルとして機能するようになります.pre-definedなメソッドは他にもいくつかあり,それぞれ適切なタイミングでレンダラから呼ばれます.つまり,カスタムシェーダを定義するには,これらのpre-definedなメソッドをoverrideすれば良い,と言うことになりますね.
また,シェーダクラスはメンバ変数を持つ事もできます.このメンバ変数は同じクラス内のメソッドからは等しくアクセスする事ができるので,シェーダ間での値の受け渡しが非常に楽になります.分かりやすい例としては,surfaceシェーダとdisplacementシェーダで同じノイズの値を使いたい場合,今まではmessage passingやoutput変数でやりとりしていましたが,これを単純なメンバ変数へのアクセスで行えます.
クラスですから,もちろん独自のメソッドも定義できます.ただし,これらのメソッドはレンダラから自動的には呼ばれず,明示的に呼んでやる必要があります.これだと今までの関数とあまり変わりなさそうに思えますが,これは次に紹介する新機能で生きてきます.
クラスとして記述されたシェーダは,.rib内で”Shader”という新しいstatementでインスタンスされます.C++で言う所のオブジェクトですね.シェーダオブジェクトです.RSL 2.0では,新しく”shader”という型と,shader型の値を返すgetshader()関数が導入されました.これは.rib内でインスタンスされた任意のシェーダオブジェクトに,別のシェーダ内からアクセスするための仕組みで,更に”->”演算子を使う事でそのシェーダオブジェクトのメソッドを呼ぶ事ができます.アクセス権が許せば,メンバ変数へのアクセスも可能です.
RSLをガッツリ書いた事のある人ならもう気づいたでしょう.これらの仕組みを使うと,簡易的なshading networkを組むことができるのです!Yay!
今までmonolithicなシェーダしか書くことができず,ルーチンの関数化はできても,テクスチャ一枚,ノイズ一つ足すのにコードから変更しなければならなかったRSL 1.0に比べると,これは革命です.dynamic arrayと合わせれば,任意の数のマテリアルをレイヤーすることもできます.
他の大きな利点としては,これらの仕組みによってarealightを楽に記述できるようになりました.PRManはarealightをサポートしておらず,illuminance()ループ内では一つの光源につき一つの(L,Cl)しか返ってこないので,RSL 1.0では全てのlight sampleをmessage passingで無理矢理渡し,自前のlight loopを書く必要があったのですが,RSL 2.0では全てを素直に実装する事ができます.
PixarのプレスリリースでILMのChristophe Heryがこんな事言ってますが,もうまさにその通り!です.
But for us, the most important feature is the modernization of the shading language, allowing us to produce cleaner, yet more efficient shader code, in particular, area light shaders and the layering of complex surface materials.
正直,やっと…という感じですが,上で「簡易的な」と書いたように,RSL 2.0で複雑なshading networkを組むことはできません.一番の理由は,color型やvector型のoutputを持つシェーダを書いたり,それらの型のパラメータに直接つなげる事はできないからです.ただ,RSL 2.0のシェーダはmental rayやMayaのようなinput/outputを使ったshading networkとは少し違ったデザインにすべきかも知れません.この辺についてはまだ自分も悩んでいる所です.
問題は他にもあります.現場にはRSL 1.0で書かれたシェーダが山のようにあり,それがたくさんのプロジェクトで常用されています.RSL 2.0には多くの利点がありますが,あまりにも違いが大きいので,移行するのは簡単ではなさそうです.もちろんRSL 1.0も引き続きサポートされていますから,直ぐに移行する必要はありませんが,シェーダを書いて管理する側からすると,直ぐにでも移行したい気分です.
それに,今のところ,RSL 2.0をサポートするGUI付きのshading network editorはありません.MTORのSlimを含め,RSL 2.0に対応した製品はまだないと思いますから,artistに使ってもらうには新しい製品を待つか,自前で書く必要があります.まあ,RSL 1.0の物に比べれば楽に作れそうですけど.
ここまで来ると,.sloを実行するエンジン部分だけを外部ライブラリとして用意して欲しくなりますね.それがあればRSL 2.0と合わせて色々な事がレンダリングの外でできるようになって,最高にイイ感じなんですけどねー.
今のところ,RSL 2.0はPRManの独自拡張です.RenderMan Interfaceとして規定されているわけではないので,他のRenderMan-compliantなレンダラに組み込まれるかどうかは怪しいですし,何かしらのpatentが絡んでいる可能性もあります.調べてませんが.
PRManのドキュメントには他にも詳しい事が書いてありますので,読める環境にある方は是非一読してみてください.