2010年02月26日

Blener2.51 r27100に更新

Grapicall.orgのBlender Vectexビルドのファイルを更新しました。
pic100225_01.jpg

Blender2.51 r7100

Linux 64bit

Linux 32bit

Windows 32bit

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


Blender2.5の開発は非常に活発に行われているのでGraphicall.orgには毎日最新のバージョンが次々とアップロードされています。
私はこれまであまり頻繁に更新を行ってきませんでした。しかし、VectexビルドもBlender2.5をベースとするようになったので、なるべく最新の状態を維持するのが望ましいと思います。
もしVectex自体のコードに変更がない場合でも、週に1回...は無理かもしれませんが、10日に一回くらいの頻度で更新していきたいと思います。

今回のアップデートでの具体的な変更内容は、
○Blender2.5のトランクの変更を反映しました。(r26884 : 27100)
Vectexのコードの変更は、わずか1行のみです。

○QtSVGのバージョンを更新しました。(4.6.1から4.6.2)
これはWindowsの場合だけです。

これまでLinux版ではシステムにインストールされたQtを使用するようにしていましたが、今回からプラグインファイル(appdir/plugins/libqtsvg_vectex.so)のコンパイル時に静的リンクを行うように変更しました。
このためLinux版を使用する場合でもQtをインストールしなくても使用できるようになりました。


ということで、今回の記事は上記の更新内容について、もう少し詳しい説明を行いたいと思います。

○Blender2.5のトランクの変更
今回の更新までの間に、Blender2.5 Alpha1のリリースが行われました。このためVectexビルドでもスプラッシュスクリーンが新しいものに変更されています。
昨年の11月にリリースされたBlender2.5 Alpha0のときと比べると、たくさんのバグが修正されたことに加えて、かなりの機能追加が行われています。

今回のリビジョン27100と前回のリビジョン26884との違いのうち、Vectexビルドに直接影響している内容は以下のようになります。

これまでBlenderのソースツリーに含まれていたFFMpegのソースコードが外され、OSが管理するシステムのライブラリを使用するようになりました。
Blender.orgで配布されているBlender2.5 Alpha1のバイナリファイルについては特にシステムを変更しなくても使えるようですが、今回のVectexビルドではLinux版についてはシステム側でFFMpeg関連のライブラリをインストールする必要があります。
Ubuntuを使用している場合はとくに問題ないと思いますが、Fedoraなどではシステム標準のリポジトリにFFMpegが含まれないためサードパーティーのリポジトリから取得する、ソースコードから自分でインストールするなどの対応をする必要があるようです。

ちなみに前回の記事では全く触れませんでしたが、Blender2.5で必要なPython3.1も、同じようにFedoraではシステム標準のリポジトリからは取得できないようです。
Python3.1については、このVectexビルドでは静的リンクを行うことで、システム側でインストールしなくても済むようにしています。

FFMpeg、Python3.1ともWindows版についてはDllファイルが同梱されるので、ライブラリのリンクの仕方はあまり関係ありません。


そして、前回の時点では対応できなかったVectexのテクスチャノードでの使用が可能になりました。
pic100225_02.jpg

前回の更新時点では、Vectex用にテクスチャノードのソースコードをかなり書き換える必要があると思っていました。
そのときのテクスチャノードは、画像データから色情報を読み出すための処理でアンチエイリアス(OSA)が含まれないようにして、すべてのノードの処理が終了した時点で最後にアンチエイリアス処理を行うようになっていました。
しかし、Vectexでタイルキャッシュを作成する機能はアンチエイリアスをするためのdxt, dytという情報が必要なため、そのままではまったくテクスチャノードに対応できません。

Blender2.49のときはどうしていたかというと、テクスチャノードの処理にはまだアンチエイリアスが行われるようになっていませんでした。
そのためVectexのために必要なコードを追加して、その部分を変更してもとくに問題ありませんでした。

今回の更新には次のようなものが含まれていました。(Subversionのログを引用)
r26958 | blendix | 2010-02-17 00:45:19 +0900 (水, 17  2月 2010) | 14 lines

Texture Nodes:

* Remove the manual OSA method but rather pass on derivatives to the
  textures. This means that at the moment e.g. the bricks node is not
  antialiased, but that image textures are now using mipmaps. Doing
  oversampling on the whole nodetree is convenient but it is really
  the individual textures that can do filtering best and quickest.
* Image textures in a texture node tree were not color corrected and
  did not support 2d mapping, now it's passing along shadeinput to
  make this possible. Would like to avoid this but not sure how.
* Fix preview not filling in all pixels when scaling or rotating in
  the texture nodes.

この変更で、テクスチャノードエディタでヘッダメニューから、Add->Input->Texuteを実行し、ノードで使用するテクスチャとしてSVGイメージを使用しているテクスチャを指定すると、Vectexのタイルキャッシュ機能がテクスチャノードでも使用できるようになりました。
pic100225_03.jpg

Blender2.49のVectexビルドで行っているノードへの対応は、これとほとんど同じです。

ただし、ヘッダメニューから Add->Input->Imageを実行して、ノードエディタにイメージとしてSVGファイルを使用することはできません。
pic100225_04.jpg

Blender2.49のVectexでもこの機能については対応を見送っていました。
しかし、あらためてソースコードを見てみると、この処理を行っている関数内でVectexのタイルキャッシュ計算に必要な情報は十分に揃っていることに気が付きました。
Sequence Editorへの対応を始める前に、このImageインプットへの対応を行いたいと思っています。

今回私自身が行ったソースコードの修正はたったの1行ですが、これはSVGファイルを開く処理でカラーマネージメントへの対応が正しく行われなかったことを修正しています。
以前のバージョンでは、テクスチャノードにSVGファイルを使用した場合、PNGやJpegなどの画像を使用したときよりも色が明るく表示されていました。(以前のバージョンではタイルキャッシュの機能は使えませんでしたが、テクスチャノードで使用すること自体はできました)
pic100225_06.jpg

調べてみるとImBufを使用してPNG、Jpegなどの画像を開くためのソースコードすべてに対して、カラーマネージメントに対応するためのフラグを設定するための1行が追加されていました。
SVGファイルを開くソースコードに同じ処理を追加してあります。

blender/source/blender/imbuf/intern/svg.c
struct ImBuf *imb_loadsvg(unsigned char *mem ,int size, int flags, int width, int height)
{
...
    if (ibuf) {
        ibuf->ftype = SVG;
        ibuf->profile = IB_PROFILE_SRGB;
    } else {
        printf("Couldn't allocate memory for PNG image\n");
    }
...
}

○QtSVGのバージョンを更新
VectexビルドのSVG描画を行うバックエンドレンダラには、現在QtSVGを使用しています。
Qtのライブラリは年に数回程度安定版の更新を行っているようですが、たまたま前回の更新の後でバージョン4.6.1から4.6.2へと更新が行われました。
このためWindows版に同梱しているDllファイルを最新版に入れ替えてあります。

一方、Linux版ではWindows版とは違ってDllファイルを添付するというようなことはできず、システムにインストールされたシェアードライブラリのファイルを使っていました。
今回、このプラグインファイルの作成時にQtライブラリを静的リンクすることで、Linux版でも最新版のバージョン4.6.2を使用できるようにしました。
このためGnome環境のように標準ではQtライブラリがインストールされない環境の場合、システム側でQtをインストールする必要がなくなりました。

このようにしたことには別の理由もあります。
VectexビルドのBlenderでSVGファイルを開く際、ファイルブラウザの参照していフォルダ内にQtSVGが表示できないSVGファイルがあるとBlenderがクラッシュする可能性があります。
これは、サムネイル画像の作成にQtSVGが使用されるためです。
このようにQtSVGをクラッシュさせるようなSVGファイルをLinux上で見つけた場合、それを使ってWindows上でテストすると問題なく開ける場合があるようです。
詳しいことは分かりませんが、テキスト(フォント)を使用しているSVGファイルで、このようなことが起こる可能性が高いようです。
(テキストを使用していても問題なく開けるSVGファイルもあるので、はっきりとは断定できません)

このため、Qtライブラリについては今後も可能な限り新しいものに更新していきたいと思っています。
posted by mato at 00:34| Comment(0) | Blender Vectex | このブログの読者になる | 更新情報をチェックする

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年以上新しい記事の投稿がないブログに表示されております。