投稿

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

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

ffmpeg のオプションをすぐに忘れてしまうので、ここにメモしておく。 入力ファイルは -i にて指定。 連番ファイルに出力する場合は出力タイプとして -f image2 を指定。 ファイル名には printf フォーマットが使用出来る。  デインターレースは -deinterlace 例えば、test.avi を   test_deinter_001.png   test_deinter_002.png   test_deinter_003.png      : などと変換したい場合は、   ffmpeg -i test.avi -deinterlace -f image2 test_deinter_%03d.png  とすれば良い。

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

諸事情により、レイヤ構造を持つ画像ファイルを C# より出力する必要が出てきました。 レイヤ構造と言えば Photoshop の .psd フォーマットが身近で良いのですが、C# の標準ライブラリではサポートしてない為、他のフォーマットを探さないといけません。幸いな事に TIFF はマルチフレーム対応だし、C# の標準ライブラリもマルチフレーム対応との事なので、こちらのページ( http://csharper.blog57.fc2.com/blog-entry-158.html )や、こちらのページ( http://www.bobpowell.net/generating_multipage_tiffs.htm )を参考にプログラムを作ってみました。 どうも MemoryStream の後処理か何かが悪いのか、僕のプログラムだと複数画像を生成すると OutOfMemory が出てしまうので、メモリストリームは使わない方法で作ってみました。 実際のコードからエッセンスだけ抜き出すとこんな感じです(ところで Blogger でソースコードを綺麗に表示するのはどうすれば良いのだろうか?): // ベース画像と生成した画像からなる 2 フレームの TIFF ファイルを n 個作る。 for(int i=0; i<n; i++) {     Console.Write("processing "+i+" ...");     string tiffImagePath=@"baseImage";     tiffImagePath+=i.ToString("00")+".tif";     int imageWidth;     if(File.Exists(tiffImagePath)==false) { continue; }     Bitmap tiffImage=new Bitmap(tiffImagePath);     imageWidth=tiffImage.Width;     Bitmap upperImage=genImage(imageWidth); // 何か絵を作る     // TIFF エンコーダの取得     ImageC

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

イメージ
色が変わってしまう (´・・`) ショボーン   作り方は普通に、 ffmpeg -r 30000/1001 -y -i shapeInstance_%03d.ppm -vcodec huffyuv huffyuvTest.avi としただけなんだけどなあ。何かオプションが足りないのかな??? PPM フォーマットの場合、ガンマ補正前のリニアな画像として扱うという話も見かけたので、それもやってみたけど上手くいかない。 色を変える事無く huffyuv な avi ファイルにする方法ってあると思うんだけどな。 ぼちぼちと探すか。 ちなみにこんな状況: 入力フレーム(ガンマ補正処理を施してある PPM ファイルを PNG に変換したもの): Huffyuv でエンコード後のフレーム(ffplay をスクリーンキャプチャしてトリミングしたもの): レンダリングは ToyBox (Step8 バージョン)。 地球のテクスチャは NASA より。 床のテクスチャは Creative Market さんから(  http://www.cr-market.com/?p=127 )。 2012.06.19 追記 差がよく分からない気がしたので比較画像を作ってみた。 元の画像の方が色が鮮やか。 掃除前と掃除後みたいな気もしますね。