PRMan 15

今更ながらPRMan15の話題など. Pixar's RenderMan® / Press Releases いろいろな追加機能があるのですが,目立った物だけ紹介します. [ Volume Rendering ] 今回のバージョンで一番大きな追加機能はこれでしょう.PRManにモダンなボリュームレンダリングの仕組みが搭載されました.今までもボリュームをレンダリングする事は可能でしたが,「モダンな」と言うところが鍵です. ボリュームレンダリングと言えば,視線(ray)に沿ってdensityを積分してゆくray marchingが一般的ですが,これはサンプル数が十分でないとノイズが出やすく,ディティールも再現できないので,サンプル数を上げざるを得なくなり,その結果時間がかかってしまうものでした. PRMan15に搭載されたのは,frustum voxelを使った手法です.これは,通常のvoxel gridにperspectiveをつけたものと考えてもらえばいいかと思います.つまり,カメラに近い方が小さく狭く,遠くなるにつれて大きく広くなっているvoxel gridです.このようなvoxelを事前に生成し,次にそれぞれのvoxelにおいてシェーダを実行して各々のvoxel densityを計算,そのあと視線に沿ってdensityを足し算します. イマイチわかりにくいと思いますので,ray marchingと処理手順を比べてみます.ray marchingは,「初期ポイント→次のシェーディング点を探す→シェーディング→足し算→初期ポイントを移動」という処理をボリューム内部において延々と繰り返す必要があったのですが,frustum voxelの場合,「voxel grid生成→一度に全部シェーディング→足し算」とシンプルになります.また,シェーディング結果がシェーディングポイントの決定に影響を与えないので,並列化もできます.サンプリングポイントをdynamicに決められない事が欠点のように思えますが,frustum voxelは近い所をより多くサンプルするようになるので(voxelが小さくて狭いから),効率の良いサンプルが可能なのです(もちろんパラメータでの調整もできる). 軽くテストしてみましたが,レンダリングも高速で,非常に良い結果が得られました.point cloudと相性が良いのも実作業では大きな武器になるでしょう.scatteringとかやれますからね. [ Struct Inheritance and Member Functions ] RSLで,structがメンバ関数を持つ事ができ,さらに継承ができるようになりました.これはshader writerにとっては非常にうれしい事で,シェーダの機能をオブジェクト指向っぽくモジュール化する事ができます.今までは関数にするしかなかったので,これは大きな進化です. 実際にこれをフルに使ってshader libraryのプロトタイプを書いてみましたが,かなり奇麗に書く事ができました.一部制限があって(関数をインターフェイスにできない),小さなhackも必要でしたが,全体的に見通しも良くなりましたし,拡張も継承を使って楽にできるはずです.あとは使う人達がどう感じるか,かな. [ Ray Differentials Shadeop ] ようやくray differentialsがシェーダ側で取得できるようになりました.新しいRSL関数,raydifferentials()が追加になっています(ray differentialsについては以前の記事を参照してください).恐らくこれに伴った機能追加だと思うのですが,filterregionという,pre-definedなstructが用意されました.これはあるシェーディングポイントにおいて,適切なfilter sizeを2D/3Dで計算して返してくれるクラスです.PRManは以前でもtexture filteringのクオリティは高い方でしたが,さらに良くなるようです.特に二次レイ以降の結果向上は顕著だろう思いますが,まだテストし切れていません. [ Ptex ] Ptexについては前回の記事を参照してください. こんなもんでしょうか.他にも開発系の機能追加が多くあるのですが,今回も「使える」機能がたくさん追加されました.思わず「いいねえ」と言いたくなります. さて,あとは実践投入だ.