ToyBox を RIB 対応にする話

ToyBox をシーンデータにより駆動させる必要が出てきたので、取り急ぎ RIB (*1) 対応の作業を開始しました。
*1 RIB - RenderMan Interface Bytestream protocol の事で、ものすごく大雑把に言ってしまうと RenderMan(PRMan) で使う入力ファイルの書式。RIB で書かれたファイルを RenderMan に与え、RenderMan はそれを解釈して画像を生成します。

この手の作業をするには yacc/lex を使うのが常套手段なので、今回は C# 版の yacc/lex とでも言うべき gppg / gplex を使用しました。公式ページで配布されている説明書はもちろんですが、日本語で書かれた下記のページも参考になりました: 
 
gppg/gplexを使って簡単なコンパイラを作成する

C#で構文解析:GPPG を Visual Studio で使ってみる


gppg および gplex の力を借りて tb.exe を作ってみました。
現在対応している RIB のコマンドは、Essential RenderMan に掲載されている最小のシーンを参考に、
  • # (コメント)
  • Display
  • Projection
  • WorldBegin - WorldEnd
  • Translate
  • Sphere
 のみです(内部的には AttributeBegin ~ AttributeEnd にも対応するように設計してありますが、まだテストしてないので取り敢えず)。

以下のシーンデータ(test1.rib)

# test1.rib - a minimal scene
Display "min.ppm" "file" "rgb"
Projection "perspective"
WorldBegin
    Translate 0 0 2
    Sphere 1 -1 1 360
WorldEnd


tb.exe test1.rib として実行すると以下のようなイメージが得られます(生成されるのは min.ppm ですが web に掲載する為に PNG フォーマットに変換しています):


備考: 画角やピクセルサイズ等、RenderMan のデフォルト値がどうなっているのか分かりませんでしたので、Essential RenderMan に載ってる絵とは異なります(どこかに資料があれば、RenderMan のデフォルト値に合わせておきたいと思いますが…)。

コメント

このブログの人気の投稿

[ C# ] 複数ページからなる TIFF ファイルの作成方法

メモ: ffmpeg を用いた連番ファイルへの変換方法

連番 PPM から FFMpeg と huffyuv でロスレス動画作ってみたんだけど…