PRMan 15

Filed under Computer Graphics

今更ながら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については前回の記事を参照してください.

こんなもんでしょうか.他にも開発系の機能追加が多くあるのですが,今回も「使える」機能がたくさん追加されました.思わず「いいねえ」と言いたくなります.

さて,あとは実践投入だ.

Post a Comment

Your email is never published nor shared.