2010年02月17日

Blender2.5 Vectexビルド

2ヶ月以上もの間まったく更新がなくてすみませんでした。
Blender2.5へのVectexの組み込みがある程度形になったので、Graphicall.orgでダウンロードできるように公開しました。
pic100216_01.jpg

Blender2.5 r26884

Linux 64bit

Linux 32bit

Windows 32bit

ソースファイルのパッチ(Blender2.5_Vectex_patch.zip)


できれば前回のBlender2.49と同等の機能を組み込んだ状態で公開したかったのですが、それにはもう少し時間がかかりそうです。

まだ実装できていない機能は、ノード機能とビデオシーケンスエディタの機能です。
それ以外にも、
Blender2.5ではプロパティパネルのほとんどの機能をアニメーション化できるようなのですが、Vectexパネルのプロパティは現在のところアニメーションに対応していません。
3D ViewのバックグラウンドイメージとしてSVG画像を表示する場合、タイル画像の境界が表示されます。
というような問題があります。

Blender2.5ではBlender2.49とくらべて様々な機能変更が行われています。
ただし、Vectexが直接関係するテクスチャの機能についてはほとんど変更はありません。
私は当初、ユーザーインターフェイス以外の部分はほとんど変更を加えることなしに、Blender2.49のソースコードをそのままBlender2.5でも使えると考えていました。
ユーザーインターフェイス部分がかなり大きく変更されているのは確かで、Vectexのパネルを動くようにするのにかなり時間がかかりました。
しかし、それ以外にも色々と問題があってソースコードにかなり変更を加える必要がありました。

今回はそのあたりのことを記事にしてみたいと思います。

○アニソトロピックフィルタリング
Blender2.5のProperty EditorでTextureを選択すると「Image Sampling」というパネルがあります。
このパネルの「Filter:」という項目のドロップダウンメニューでフィルタタイプを選べるようになっています。
Blender2.49ではBoxサンプリングのみが利用可能でしたが、Blender2.5ではそれ以外にもEWA、FELINE、Area、SATなどが追加されました。
pic100216_02.jpg

これについてBlenderのリリースログでも少しだけ説明があります。
http://www.blender.org/development/release-logs/blender-250/other-rendering-features/

リリースログの説明だけではBoxサンプリングと何が違うのか詳しいことまではわからないのですが、ソースコードの中ではanisotoropic filteringという言葉が使われています。

アニソトロピックフィルタリングというのは何かというと、実は私もつい最近まで全然詳しい仕組みを知らなかったのですが、ミップマップの処理を行う際にテクスチャ座標の水平方向と奥行き方向とを分けて処理することらしいです。

VectexでSVGを使用した場合(左)と、通常のPNG画像を使用した場合(右)の各フィルタタイプの比較画像です。
pic100216_03.jpg pic100216_04.jpg

このようなモワレの目立つ画像では、Boxサンプルと比べてかなり画質が向上するようです。
Vectexと組み合わせることで、より画質の向上が期待できそうです。
ただし、VectexではSATを正常に処理することができていません。
理由はよくわからないのですが、SATのコードはミップマップの計算時にのみ有効で、通常のレンダリングでテクスチャ画像からサンプリングを行うときにはうまく機能しないようです。
通常のビットマップ画像を使っている場合でも、SamplingパネルでMipmap機能をOFFにすると「Filter:」ドロップダウンメニューでSATが選択できなくなります。
pic100216_05.jpg

Vectexでタイルキャッシュを有効にした場合は、通常のミップマップ計算は使用せずにすべてVectexの機能で処理するため、SATを使用すると上の画像のように色がおかしなことになってしまいます。

○バックグラウンドレンダリング
Blender2.49まではレンダリングを実行している間はButtons Windowのパネルなどは、一切操作ができなくなっていました。
しかしBlenser2.5ではレンダリングを行っている間でも通常の操作を行うことができます。
しかも、マテリアルなどの設定を変えると、その変更がリアルタイムにレンダリングに反映されます。
pic100216_06.jpg

これはこれで面白いのですが、レンダリングに非常に時間のかかるシーンをレンダリングする場合は、レンダリングの途中で不用意に設定を変えてしまわないように注意が必要です。

そして、プログラミングをする側の視点からすると、通常のマルチスレッドレンダリングでのスレッド間の競合以外に、さらに複雑な要素が加わることになります。
Blender2.49でのVectexではパネル上でBase Colorなどを変更した場合、画像のreloadを行うのと同じ処理で対処していました。
reloadを行うと、ファイルから画像を読み込み直す処理が発生します。
この際、QtSVGのバックエンドレンダラをメモリから開放する処理が必要になるのですが、もし別のスレッドでバックエンドレンダラが使用されている間にこれを実行してしまうと、致命的なことになります。

実際、Blender2.49で使用していたソースコードをそのまま使用してレンダリング中にVector Imageパネルの操作を行うと、その瞬間にBlenderがクラッシュしてしまいました。
そのため、Vector Imageパネルの操作を行ったときの処理を変更し、reloadのようにファイルの読み込みが起こらないようにしました。
これである程度はクラッシュを回避できるようになったのですが、Imageパネルにあるreloadボタンを押すと、結局は同じことになります。

色々とソースコードを修正してみて、最終的には
1.バックエンドのレンダリングを行う処理に入る直前に、QtSVGバックエンドが使用中であるというフラグを立てる。
2.ImBufの開放命令が呼ばれた場合、QtSVGバックエンドを使用中のフラグが立っていたら、その場では開放処理を行わず、後でImBufを開放する必要があるというフラグを立てる。
3.バックエンドのレンダリングを行う処理から抜けたら、ImBufの開放をする必要があるかフラグを確認し、必要なら開放を行う。
という形にしてみました。

これで、Vectex機能を使ったシーンをレンダリング中にプロパティの操作を行うとクラッシュするという問題はほぼ克服できたように思います。
(まだ若干不安がある部分もありますが、意図的にreloadボタンを連打したりしなければ大丈夫...だと思います。)
pic100216_07.jpg

もう少し早く公開できると思っていたのですが、色々と問題が起こって修正に時間がかかりました。
ブログの記事としてソースコードの解説を進める予定だったのですが、現在のところ自分の書いているソースコードが二転三転して安定しない状況ですので、もう少し先送りすることになると思います。
とりあえず、次はなるべく早くノードシステムへの対応を行いたいと思っています。
posted by mato at 01:01| Comment(0) | Blender Vectex | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。