RSL 2.0

久しぶりに技術系の話題を書きます.とは言え,かなり現場寄りな話ですが. 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 [...]