投稿

12月, 2012の投稿を表示しています

ToyBox を RIB 対応にする話 その6

イメージ
Scale と ReadArchive に対応しました。 と言っても、ReadArchive は .rib を読み込むのではなく、形状データファイルを読み込む形にしてあります。 今回の拡張でスタンフォードバニーもレンダリング可能に。 # ReadArchive test Display "bunnyTest.ppm" "file" "rgb" Format 1200 1200 1.0 Projection "perspective" "fov" [ 50 ] Imager "background" "color" [ 0 0 0 ] WorldBegin     LightSource "ambientlight" "ambient"         "intensity" [ 1 ]     LightSource "pointlight" 1         "from" [ 500 120 -360 ]         "intensity" [ 1 ]         "lightcolor" [ 1 1 1 ]     Color [ 0.8 0.3 0.04 ]     Surface "plastic"         "Ks" [ 0.6 ] "Kd" [ 1.0 ] "Ka" [ 0.03 ]         "roughness" [ 0.005 ]         "specularcolor" [ 0.3 0.3 1 ]     Translate 0 -0.1 0.4     Rotate -5 1 0 0     Rotate 1 0 1 0     Scale 1 1 -1     ReadArchive "bunny.ply" WorldEnd この RIB から、以下の画像が生成されます(クリックで拡大…と

ToyBox を RIB 対応にする話 その 5

イメージ
今回は Surface 文に対応しました。 現在対応しているシェーダは plastic と paintedplastic のみです。 冬至という事なので、それっぽく傾けてみました。 この RIB を入力すると、 # surface test Display "surfaceTest.ppm" "file" "rgb" Format 640 400 1.0 Projection "perspective" "fov" [ 30 ] Imager "background" "color" [ 0 0 0 ] Translate 0 0 10 WorldBegin     LightSource "ambientlight" "ambient"         "intensity" [ 0.5 ]     LightSource "distantlight" 1         "to" [ 1 0 0.5 ]         "intensity" [ 1 ]         "lightcolor" [ 1 1 1 ]     Color [ 1 1 1 ]     Surface "paintedplastic"         "texturename" [ "land_ocean_ice_cloud_2048.ppm" ]         "Ks" [ 0.0 ] "Kd" [ 1.0 ] "Ka" [ 0.2 ]         "roughness" [ 0.005 ]     Rotate -23.4 0 0 1     Rotate 230 0 1 0     Sphere 1 -1 1 360 WorldEnd  こんな画像が生成されます: ※テクスチャ画像は NASA で公開しているものを使用しています。

ToyBox を RIB 対応にする話 その4

イメージ
今回は LightSource に対応しました。 対応しているライトは ambientlight distantlight pointlight の3種類です。 次の RIB ファイルを渡すと、 # pointlight test  cf.Essential RenderMan p.58 Display "pointLightTest.ppm" "file" "rgb" Format 640 480 1.0 Projection "perspective" "fov" [ 30 ] Translate 0 0 5 WorldBegin     LightSource "ambientlight" "ambient"         "intensity" [ 0.05 ]     LightSource "pointlight" 1         "from" [ -2 2 -2 ]         "intensity" [ 1 ]     Color [ 1 0 0 ]     Sphere 1 -1 1 360 WorldEnd このような画像が生成されます(web 用に png に変換してあります):

ToyBox を RIB 対応にする話 その3

イメージ
とりあえずデフォルトで PLS の層化サンプリングを行うものとして、RIB のコマンド対応作業を進めました。 今回は、 Format コマンド対応 Perspective コマンドの fov オプションへの対応 Imager による背景色指定への対応 PixelSamples コマンド対応 アトリビュートブロック対応 Color コマンド対応 という作業を行いました。 以下のような RIB を tb.exe に与えると… # Format, fov, Imager, PixelSamples, Attribute Color - test Display "test5.ppm" "file" "rgb" Format 550 200 1.0 Projection "perspective" "fov" [ 40 ] Imager "background" "color" [1 1 1] PixelSamples 4 4 WorldBegin     Translate 0 0 4.3     Color [ 1 0 0 ]     AttributeBegin         Color [ 0 0 1 ]         Sphere 1 -1 1 360     AttributeEnd     AttributeBegin         Translate 2 0 0         Color [ 1 1 0 ]         Sphere 1 -1 1 360     AttributeEnd     AttributeBegin         Translate 4 0 0         Sphere 1 -1 1 360     AttributeEnd     Color [0 1 0]     Translate -3 0 0     Sphere 1 -1 1 360 WorldEnd 次のような画像が生成されます: ※投稿当初は fov の値として水平方向の画角を使用してました。が、RenderMan は垂直画角指定のようですので、この記事でも垂直画角指定

ToyBox にピクセルレスサンプリングを実装

イメージ
ToyBox にピクセルレスサンプリングを実装しました。 もちろん一般的なピクセルサンプリング(PS)と、(残念ながら)あまり一般的でないピクセル「レス」サンプリング(PLS)で、どれくらい画質が異なるかを実験できるよう、 PS と PLS の切り替えも比較的簡単にできるようにしてあります。 現在、ToyBox は、 RIB 対応も並行して進めているのですが、PS と PLS の切り替えを RIB でどのように実現するのかは悩ましい所です。 tb.exe では、デフォルトは PLS、ピクセルフィルタを指定したら PS にするようにしようかと考え中です。あえて PLS であることを明示するには PixelFilter "pls" 1 1 等とするのが自然なのかな? 後ろの 1 1 というのはダミーの予定(PLS におけるポイントサンプルの対応サポートを、1x1 ピクセル以上に広げることは取り敢えずは考えない事とします)。 以下、1 ピクセルあたり 4x4 のサンプリングを行った例。サンプリングは層化サンプリングです。 まずは PLS。4x4 でも綺麗。 次はボックスフィルタの PS。ジャギが少し気になります…。 最後はおまけの PS でトライアングルフィルタの例。ジャギが結構気になります。  

ToyBox を RIB 対応にする話 その2

イメージ
Essential RenderMan の List 7.3 の例に対応すべく、今回は TransformBegin - TransformEnd に対応してみました。 次の RIB より、 # Transform-block test (cf. Essential RenderMan p.26) Display "beginend.ppm" "file" "rgb" Projection "perspective" WorldBegin     Translate 0 0 2     TransformBegin         Translate -1 0 0         Sphere 1 -1 1 360     TransformEnd     TransformBegin         Translate 1 0 0         Sphere 1 -1 1 360     TransformEnd WorldEnd  以下の絵が生成される(前回同様 web 用に .ppm を .png に変換してます)。 レンダーマンのデフォルトの画角が分からなかったのですが、Essential RenderMan の例を見ると、どうやら水平画角は 4*atan(1/2) みたい(画面中に、直角を挟む辺がそれぞれ 1 と 2 の直角三角形が 4 つ入るので)。 ※これは水平画角を指定する時の話でした(RenderMan は垂直画角で指定するようです)。 ToyBox 自体はマトリックススタックに対応していたのですが、Push - Pop に関して、若干使い勝手の良くない設計でしたので、今回の改造を機に少し変更して単純化しました。 前回の絵は DOF が微かに効いていたので、完全に DOF を無効にできるようにも改造しました。フィルタは入れてない(というかボックスフィルタになってる)ので、ジャギが出て汚いですね。 ゆくゆくは PLS および AASS に対応するので、PixelFilter の対応はどうしようか悩みどころです…。 # PLS は PixelFilter "pls" で指定できるようにするのが良いのかな? AAS

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 フォーマットに変換し