2010年03月31日

Vectexビルド更新 r27840

Graphicall.orgのBlender2.5 Vectexビルドを更新しました。

Linux 64bit

Linux 32bit


Windows 32bit


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

今回の更新内容は、

   1. トランクの変更(27332 : 27840)を取り込みました。
   3. SVGファイルを連番ファイルのアニメーションとして使用した場合の不具合の修正。

となっています。

注)3月25日にr27736のビルドをアップロードしましたが、そちらにバグを混入していたことに気付いて、バグフィックス版としてr27840のビルドをアップロードし直しました。前回の更新でも同様のことをしてしまったばかりなのに、同じような失敗を繰り替えしてしまってすみません。


○SVG 連番ファイルについて

SVGフォーマットはアニメーションを表現するための仕様も含んでいて、本来ならばAVI、MPEGなどの動画ファイルのように一つのファイルに複数フレーム分のデータを保持することができます。
そのためSVGファイルを連番ファイルとして使用することは通常はほとんどないと思います。
ほとんどないとは思いますが、Blenderのイメージテクスチャの仕様上このような形でのSVGファイルの使い方もできてしまうので、実際に使ってみるとどうなるのか試してみました。
pic100330_01.jpg pic100330_02.jpg

連番のSVGファイルを出力するようなソフトウェアは恐らく存在しないのではないかと思いますが、Freestyleとsvgwriterモジュールを使うことでBlenderで作成可能です。

BlenderのFreestyleブランチについては、こちらの開発ブログかBlenderartist.orgのフォーラムのスレッドに詳しい情報があります。
Freestyleの機能を試すにはGraphicall.orgにアップロードされるカスタムビルドを使うのが簡単です。

svgwriteモジュールはFreestyleブランチ開発チームのT.K.さんが作成したものです。こちらのT.K.さんのサイトから入手可能です。

もともとのアニメーション用svgwriterはXMLファイルとして各フレームのデータを一時的に保存して、それを一つのファイルにまとめるような仕組みになっています。
このXMLへの書き出し部分のpythonコードを静止画のSVGファイルのヘッダ作成を行う部分と置き換えると、SVGファイルを連番ファイルとして出力できます。

こちらにSVG連番ファイル出力用に改造したsvgwriterモジュールを置いておきます。

本来なら一つのファイルにまとめられたSVGアニメーションをVectexで使用できるようにしたいところですが、現在のところQtSVGでフレーム位置をコントロールする機能が見当たらないため、当面の間はアニメーションに対応するのは難しいと思います。


Blender2.49をベースとしていたときのVectexでも、一応SVG連番ファイルを使用することができました。
しかし、SVGファイルを連番のアニメーションとして使用すると各フレーム毎に大量のタイルキャッシュ画像が作成されるため、簡単に数ギガバイト単位のメモリを消費してしまいます。
前回の更新で、Blender2.5の現在のバージョンのVectexでは、連番のアニメーションとしてタイルキャッシュを使用した場合は、各フレームのレンダリング終了後に作成されたタイルキャッシュを削除してメモリを開放するようにしています。
これにより比較的メモリ搭載量の少ないコンピュータ上でも、Vectexでタイルキャッシュを使ったSVGの連番アニメーションが可能になっています。

SVGファイルを連番ファイルとしてBlenderに読み込んでいる場合、UI操作でタイムライン上のフレーム位置を変更するのに合わせてプレビューの更新が行われます。
通常のビットマップ画像ではフレーム位置に対応した画像をディスクから読み込む処理が行われるだけですが、VectexではSVGドキュメントの読み込みとそのレンダリングという通常より面倒な処理が行われます。
前回の更新の時点ではSVGファイルを連番アニメーションとして読み込んでいる状態でVectexパネルの設定(Base Colorなど)を変更すると、マテリアルのプレビューが表示されている場合などにBlenderがクラッシュする可能性がありました。
今回の更新でこのようなクラッシュが起こりにくくなっていると思います。


○SVG 連番ファイルの使い方
念のためVectexでSVGファイルを連番アニメーションとして使用する手順を書いておきます。

SVG連番ファイルの作成はFreestyle BranchのBlenderで行います。
あらかじめ上記の改造版svgwiterモジュールを適当な名前でハードディスク上に保存しておきます。
適当にアニメーションが設定された状態であると想定して、SVGファイルの出力に必要な手順だけを説明します。
プロパティエディタの「Render」コンテキストで「Post Processing」パネルを開き、「Freestyle」チェックボックスをオンにします。
pic100330_03.jpg

「Layers」パネルを開き、一番下の「Add Style Modue」ボタンを押します。
pic100330_04.jpg

「Add Style Module」ボタンのすぐ下にデフォルトのスタイルモジュールが追加されるので、ファイル名の横のフォルダボタンを押して他のスタイルモジュールを選択するためのファイルブラウザを開きます。
ファイルブラウザが開いたら、上記の改造版svgwriterモジュールを選択します。
pic100330_05.jpg pic100330_06.jpg

「Output」パネルで出力先を指定します。
pic100330_07.jpg

「Render」パネルで「Animation」ボタンを押して、アニメーションのレンダリングを実行します。
pic100330_08.jpg

これで、JpegやPNGなどのビットマップ画像のレンダリングイメージの他に、SVGファイルが出力先のディレクトリに作成されます。
pic100330_09.jpg


VectexでSVG連番ファイルを使う手順です。
プロパティエディタのTextureコンテキストでテクスチャのタイプを「Image or Movie」にします。
pic100330_10.jpg

表示されるImageパネルで「Open」ボタンを押し、ファイルブラウザでSVG連番ファイルの一番最初の番号のファイルを開きます。
pic100330_11.jpg pic100330_12.jpg

上記のFreestyle + svgwriterモジュールを使ってSVGファイルを作成すると透明な背景に黒の線で描画されることになるので、テクスチャプレビューは真っ黒のままでわかりにくいかもしれません。
その場合、Vector ImageパネルのBase Colorを適当に変更します。
pic100330_13.jpg

Imageパネルの上から2段目に「File」「Sequence」「Movie」「Generated」という4つのトグルボタンがあり、SVGファイルを開いた時点では「File」が選択されています。(r27757以降は、トグルボタンからプルダウンメニューに変更されているようです。)
この中の「Sequence」を選択します。
pic100330_14.jpg

するとテクスチャプレビューが真っ黒になるかもしれません。
これは、トグルボタンのすぐ下を見ると理由が分かります。
連番ファイルの最初のファイルとしてframe0000.svgという名前が設定されていますが、実際に保存されている連番ファイルはframe0001.svgが最初のファイルになっているため、存在しないファイルを開こうとして失敗しているという状態です。
連番ファイルを使用する場合、全体でいくつのファイルを使用するのかを指定する必要があります。
「(0)Frames:0」となっている数値ボタンに連番アニメーションの最終番号を入力します。
pic100330_15.jpg

「Start:1」の値を変更すると、使用される連番ファイルの最初の番号を変更できます。
「Offset:0」の値を変更すると、Blenderのタイムラインと連番ファイルの対応の仕方をずらすことができます。
「Auto Refresh」をオンにすると、Timelineエディタなどでカレントフレームを移動するのに合わせて、対応する位置の連番ファイルが自動で読み込まれテクスチャプレビューが更新されます。
pic100330_16.jpg

「Cycric」をオンにすると、連番ファイルのアニメーションの長さを超えるフレーム数に対して、連番アニメーションを繰り返すように対応させることができます。

この他、コンポジットノードのイメージインプット(ヘッダメニューのAdd->Input->Image)でもほぼ同じような操作でSVG連番ファイルを使用できます。
pic100330_17.jpg

上記の手順を手っ取り早く試せるようにテストデータを用意しました。(改造版のsvgwriterも一緒に入れてあります)
test_data100330.zip

Freestyle用の.blendファイルでは、改造版のsvgwriterのファイルパスを指定しなおす必要があります。
posted by mato at 00:27| Comment(22) | Blender Vectex | このブログの読者になる | 更新情報をチェックする

2010年03月11日

Vectexビルド更新 r27332

Graphicall.orgのBlender2.5 Vectexビルドを更新しました。

Linux 64bit

Linux 32bit


Windows 32bit


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

今回の更新内容は、
  1. トランクの変更(r27100 : 27332)を取り込みました。
  2. テクスチャノードでのイメージインプットでタイルキャッシュ機能を使用できるようにしました。
  3. SVGファイルを連番ファイルのアニメーションとして使用した場合の不具合の修正(途中)。
というような感じです。

あまり目立った変更はありませんが、とりあえず今回も変更内容についての補足を記事にしたいと思います。

(※このビルドをアッップロードする前に、Vectexパネルで画像サイズを変更したときにSVGレンダリングの再描画が行われないバグのあるビルドをアップロードしてしまいました。もし、スプラッシュスクリーンにr27332ではなく、r27322というリビジョン番号が表示される場合は、新しい方をダウンロードしなおしてください。お手数をおかけしてすみません。)


○テクスチャノードでのイメージインプットでのタイルキャッシュ機能
前回の更新でトランクの修正によって自動的にVectexの機能がテクスチャノードで使用できるようになりましたが、そちらはテクスチャインプットを使用する方法です。(テクスチャノードでヘッダメニューからAdd->Input->Textureを実行)

今回の更新で、イメージインプット(テクスチャノードでヘッダメニューからAdd->Input->Imageを実行)でもタイルキャッシュ機能を使えるようになりました。
pic100310_01.jpg

テクスチャインプットでSVGファイルを使用するためには、あらかじめSVGファイルを使用したテクスチャのデータを作成しておいて、それをノードパネルのメニューから選択する必要があります。

一方、イメージインプットでSVGファイルを使用する場合は、ノードパネルの「Open」ボタンを押すことで直接SVGファイルを開くことができるので、少し手間が省けます。
(すでにUV/Image Editorなどで開いた画像があれば、イメージ選択ボタン(Browse ID data)のメニューから選択できます。)
pic100310_02.jpg

今回の更新で、こちらのイメージインプットでもタイルキャッシュ機能が使えるようになりました...が、実際にはテクスチャインプットでイメージファイルを使用する場合と、イメージインプットでイメージファイルを使用する場合とではレンダリング結果がかなり違ってきます。

とりあえず、イメージインプットでタイルキャッシュを使うまでの手順です。
イメージインプットでSVGファイルを開くだけならノードパネルの「Open」ボタンを押すだけで済みますが、そのイメージの設定を変更するためにはテクスチャの場合のようにノードエディタの外でイメージを開いてプロパティエディタからアクセスできるようにする必要があります。

そのためには実際にオブジェクトに割り当てているテクスチャとは別のテクスチャを作成してテクスチャタイプをImage or Movieに設定、Imageパネルのイメージ選択ボタン(Browse ID data)で既にオープン済みの画像ファイルを選択するというような操作が必要になります。

この状態でVectexパネルでSVGイメージのタイルキャッシュを有効にするかどうか、背景色の変更などを操作できます。

設定を変更したらオブジェクトに本来割り当てるべきテクスチャノードのデータをテクスチャ選択ボタン(Browse ID data)で選択しなおします。

これで、F12ボタンでレンダリング結果を確認できます。

テクスチャインプットを使った場合でも、VectexパネルでSVGファイルの設定を変更するためには同じような操作が必要になります。

それでは、テクスチャインプットを使用した場合と、イメージインプットを使用した場合とでは、レンダリングの結果がどう違うのでしょうか。
テクスチャインプットを使用している場合、Image Samplingパネルでの設定がテクスチャノードに反映されますが、イメージインプットではこれらの設定内容は無視されます。
つまりイメージインプットを使用してVectexのタイルキャッシュを使用しても、ミップマップやテクスチャフィルタリングなどが使えないので画像が粗くなります。
pic100310_03.jpg

また、Mappingパネルの設定についても、Imageインプットを使用した場合は一部の設定が反映されないようです。
以上のことはVectexの機能とは関係なく、JpegやPNGを使っている場合でも同じです。

コードを書いている時点で予想はできたのですが、せっかく使えるようにしたもののテクスチャインプットを使わずに、イメージインプットを使う必要性というのはほとんど無いような気がします。
イメージインプットがなぜこのような仕様になっているのか理由はちょっと分からないのですが、テクスチャノードのシステムは比較的最近(Blender2.49)追加されたばかりなので、まだ細部まで作り込まれていないのかなという感じがします。

SVGファイルをシークエンスとして使用するための修正については、現時点でまだ完了していません。(SVGの連番ファイルを使用しているとき若干動作が不安定になるようです)
次回の更新までになんとか問題を修正できるようにしたいと思っています。
詳細については、次回の更新のときに説明したいと思います。
(前回の記事で10日に一回くらいは更新したいとか書いてましたが、多分2週間に1回とかになるような気がします。)
posted by mato at 01:01| Comment(0) | Blender Vectex | このブログの読者になる | 更新情報をチェックする

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 | このブログの読者になる | 更新情報をチェックする

2009年11月29日

イメージライブラリ(ImBuf)への統合

前回の更新からだいぶ時間がたってしまいましたが、この間ずっとvectexをBlenderのイメージライブラリに組み込み直す作業を行っていました。
少し前にBlender2.5 Alpha 0の公開がありましたが、こちらは相変わらずのBlender 2.49bベースとなります。

Linux 64bit

Linux 32bit

Windows 32bit


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


vectexをイメージライブラリに組み込むことで以前のバージョンと比べて何が変わったのかというと、SVGファイルを開くための操作がPNG、Jpegなどの通常の画像ファイルを開くのと同じになったということです。

これだけだと何のためにこのように変更したのかよくわからないと思いますが、今回の修正でこれまでできなかったことが色々とできるようになりました。
今回は、その辺についての解説をしてみたいと思います。このため今回はプログラムのソースコードの中身の解説はありません。
ソースコードの変更内容については、今後Blender2.5ベースのソースコードに移植していく過程で少しずつ記事にしていこうと思っています。

SVGファイルを開く操作については、前回の更新のものまではTextureパネルで「Vectex」を選択し、表示されるパネルでファイル選択ボタンを押すという形になっていました。
今回のバージョンでも同じように、Textureパネルで「Image」を選択してイメージテクスチャとしてSVGファイルを開くことができます。
pic091129_02.jpg

Blenderには画像ファイルを開く時にサムネール表示でファイルを選択できる機能があり、ファイル選択ボタンをマウスクリックする際にキーボードの「Ctrl」キーを押すことでイメージセレクタが開きます。
今回はこのイメージセレクタでのSVGファイル表示にも対応しています。
ちなみに下の画像で表示しているのはUbuntuのアイコンを保存しているディレクトリを開いている様子です。
UbuntuをはじめとしたLinuxではデスクトップで表示されるアイコンにSVGファイルが使用できるようになっていて、SVGファイルで作成されている多数のアイコンが標準でインストールされています。
もし興味のある方は一度システムのアイコンディレクトリ(/user/share/icons/ など)をのぞいてみてください。
pic091129_03.jpg

このようにSVGファイルをイメージテクスチャとして開くと、レンダリング時にSVGファイルがテクスチャとして適用されます。
SVGファイルをテクスチャとして使用する場合の操作については、これまでのバージョンとほとんど同じです。

●新規に追加されたボタン
イメージテクスチャを作成すると、Imageパネルの横に「Vectex」パネルが表示されます。
今回、新しく追加した機能として固定サイズのビットマップ画像としてSVGファイルを使用できるようにしました。
「UseTileCache」をオンにするとこれまで通り通常のVectexとして解像度計算を行ってタイル画像を作成しますが、このボタンをオフにするとタイル画像の作成を行わなくなり、PNG、Jpegなどの画像ファイルのように固定サイズのビットマップとして使用できるようになります。
pic091129_05.jpg pic091129_06.jpg

このとき作成される画像データのサイズはデフォルトではSVGファイル内に記述されたサイズを使用しますが、これも今回追加した「UseCustmoSize」というボタンをオンにすることで、その横にある「SizeX」「SizeY」に指定した任意のサイズに変更することができます。
pic091129_07.jpg pic091129_08.jpg

●UV/Image EditorでのSVG画像表示
今回、UV/Image EditorでもSVGファイルを表示できるようにソースコードを修正しています。
もともとBlenderのUV/Image Editorには、UV座標にメッシュを展開した画像をSVG画像として保存する機能がありますので、その画像をUV編集時の下絵としてSVGファイルで読み込めたら便利なのではと思っていました。
pic091129_09.jpg pic091129_27.jpg

「UseTileCache」「UseCustomSize」ボタンは、UV/Image Editorの表示にも反映されます。
「UseTileCache」がオンの時は、マウスホイールでのズームのレベルに合わせてタイル画像が作成され、ズームの限界一杯になるまで最適な解像度の絵が表示されます。
「UseTileCache」がオフの時は、PNG、Jpegなどの画像の場合と同様にビットマップでの表示となり、ズームするとピクセルが四角形として表示されます。
このとき、「UseCustomSize」が有効なら指定した解像度のビットマップとして表示されます。
pic091129_10.jpg pic091129_11.jpg

UV/Image Editorでは画像を表示するだけでなく、ペイント機能を使って絵を描くこともできます。
SVGファイルを表示しているときにペイントしたらどうなるのか、ちょっと疑問に思われるかもしれません。
結果から言うと「UseTileCache」ボタンがオンのときにはペイントを行うことはできませんが、「UseTileCache」ボタンをオフにしていればペイントを行うことができます。
pic091129_12.jpg pic091129_13.jpg

ペイントした結果をPNG、Jpegなどのビットマップ画像として保存することができますが、SVGファイルとして保存することはできません。
ビットマップ画像として保存する場合、「UseCustomSize」でサイズを指定していればその解像度で保存されます。
注意が必要なのは、Vectexパネルで「UseCustomSize」をオン/オフしたり、画像サイズを変更したり、Base Colorを変更したり...というような操作をするとペイントした結果が破棄されてしまうことです。
もしSVG画像を元にしてにペイント画像を作成したい場合は、まずPNG、Jpegなどの画像データとして保存してからペイント操作を行うのが安全です。

●3D Viewでのテクスチャ表示
SVGファイルをビットマップ画像として使用する機能を追加することで、3D Viewでのテクスチャ表示にSVGファイルを表示できるようになりました。
このビットマップ画像は、GLSLマテリアル表示を行う場合にも使用されます。
pic091129_14.jpg pic091129_15.jpg

ただ、この3D Viewでのテクスチャ表示にはVectexのタイルキャッシュの機能は反映されません。
「UseTileCache」ボタンがオン/オフのどちらになっていても、表示される内容は同じです。
「UseCustomSize」ボタンの機能は有効なので、3D Viewでの表示で解像度が不足してピクセル表示が目立つようであれば、Vectexパネルで画像サイズを大きく変更することでテクスチャ表示を改善することができます。
pic091129_16.jpg pic091129_17.jpg

●3D Viewでの下絵としてSVG画像を表示

3D View表示ではモデリングを行う際に、下絵として画像ファイルを背景に表示することができます。
今回、SVGファイルを下絵として使用できるようにしました。
pic091129_18.jpg

「UseTileCache」「UseCustomSize」ボタンを使用したときのビュー上での表示の違いはUV/Image Editorと同じです。
3D Viewの下絵表示がUV/Image Editorと若干違うのは、最大ズームレベルがより高い状態にまで拡大できることです。
試してみたところVectexのタイル画像作成機能を最大ズームレベルまで行うと、メモリの限界に到達してしまうのか、Blenderがクラッシュしてしまいました。
クラッシュするズームレベルはLinux、WindowsなどのOSの違い、64bit、32bitの違いなどによって若干違うようですが、最大で2の20乗(画像サイズ 1048576 x 1048576 相当)までに制限することにしました。

もし、この限界近くまでズームするような場合、マウス操作に対する反応がかなり悪くなる可能性があります。
これは、Vectexの作成するタイル画像の枚数が非常に多くなるためです。
メモリの使用量がVectexパネルで指定されている「Mem Max」の値を超えていると、作成済みのタイル画像を削除する処理も加わるため、さらに負荷が重くなります。
もし、メモリに余裕があるなら「Mem Max」の値を大きくする(「0」を指定した場合は無制限)ことで、下絵表示を行っている3D ViewやUV/Image Editorでの操作をより快適に行うことができるようになると思います。

●ノードエディタ
SVGファイルを開く方法はここまでに書いたもの以外にもまだあり、ノードエディタとシークエンスエディタでも使用することができます。
ノードエディタには、マテリアルノード、コンポジットノード、テクスチャノードの3つの種類があります。
このうち、ノードエディタ上でイメージノードを使う際に、SVGファイルを使用することができます。
イメージノードを使うことができるのはコンポジットノードとテクスチャノードのみで、マテリアルノードでは使用できません。
pic091129_28.jpg

また、イメージノードを使う以外にSVGファイルを使用したイメージテクスチャをテクスチャノードとして使用することもできます。
テクスチャノードはマテリアルノード、コンポジットノード、テクスチャノードのすべてで使用可能です。
pic091129_29.jpg

ちょっと分かりにくいかもしれませんが、イメージノードとしてSVGファイルを使用した場合と、テクスチャノードとしてSVGファイルを使用した場合とでは、Vectexの機能のうち使えるものと使えないものとが違ってきます。

○マテリアルノード
マテリアルノードではイメージノードは作成できないため、テクスチャノードのみとなります。
あらかじめイメージテクスチャを作成しておき、SVGファイルを開いておきます。
ノードエディタのメニューから「Add」-「Input」-「Texture」を実行してテクスチャノードを作成し、作成しておいたSVGファイルのテクスチャを選択します。
同じようにノードエディタのメニューから「Add」-「Input」-「Geometry」を実行してジオメトリノードを作成し、出力の部分でGlobal/Local/View/Orco/UVのうちいずれかのマッピング座標系とテクスチャノードの「Normal」の入力を接続します。
このようにしてSVGファイルを使用する場合、イメージテクスチャのVectexパネルのボタンを操作することでタイルキャッシュのオン/オフやビットマップ画像として使用する場合のサイズ変更などを行うことが可能です。
pic091129_19.jpg

○テクスチャノード
テクスチャノードでは、イメージノードとテクスチャノードの両方を使用できます。
SVGファイルを使用したイメージテクスチャをテクスチャノードで使用する場合は、Vectexのタイルキャッシュ機能を使用することができます。
また、スケールノードを使用して絵の一部分を拡大すると、その拡大率に合ったレンダリング結果を得ることができます。
一方、テクスチャノードの中でイメージノードとしてSVGファイルを使用する場合は、Vectexのタイルキャッシュは効果がありません。
イメージノードのビットマップのサイズを「UseCustomSize」で変更することは可能です。
pic091129_20.jpg pic091129_21.jpg

○コンポジットノード
コンポジットノードではイメージノードとテクスチャノードの両方を使用できます。
ただし、コンポジットノードではVectexのタイルキャッシュは効果がありません。
テクスチャノードを使用するとレンダリング画面一杯に絵が引き伸ばされる状態になります。
もし、解像度が足りずにピクセルの四角形が目立つようなら、「UseCustomSize」を有効にしてビットマップの解像度を上げてください。
イメージノードを使用すると、レンダリング画面の中央にビットマップの解像度で絵が表示される状態になります。
この場合も、表示される絵が小さすぎる場合は「UseCustomSize」を有効にしてSVGファイルのイメージサイズを大きくしてください。
pic091129_22.jpg pic091129_23.jpg

●シークエンスエディタ
シークエンスエディタでは、イメージストリップとしてSVGファイルを使用することができます。
シークエンスエディタのメニューから「Add」-「Images」を実行することで、イメージストリップを作成できます。
ちょっと注意が必要なのは、これまでに説明したすべての方法についてはSVGファイルの設定を変更する際に、Buttons Windowのモードが「Shading(F5)」「Texture Buttons(F6)」の状態で表示されるVectexパネルを使用していましたが、シークエンスエディタで開いた場合にはこの方法ではイメージのデータにアクセスできないということです。
シークエンスエディタでは代わりにButtons Windowのモードを「Shene(F10)」「Sequence Buttons」の状態にしたときにシークエンスエディタ専用のVextexパネルが表示されます。
見ていただくとわかりますが、イメージテクスチャで表示されるVectexパネルと比べて使用できる機能が少なくなっています。
pic091129_24.jpg

シークエンスエディタでのVectexの機能は、基本的にはノードエディタの場合のコンポジットノードと同じような感じで、ビットマップデータとしてSVGファイルのサイズが変更できる程度のものになっています。
ただし、実験的にトランスフォームエフェクトを使用したときにだけタイルキャッシュ機能を使えるようにしてみました。
pic091129_25.jpg

なぜ実験的なのかといえば、タイルキャッシュが使えるのはある条件が満たされている場合に限られるためです。
その条件というのは、以下のようなものです。
トランスフォームエフェクトはSVGファイルのイメージストリップに対して直接適用する必要があります。
イメージストリップに何らかのエフェクトを適用した結果に対してトランスフォームエフェクトを適用した場合、タイルキャッシュは無効になります。
シークエンスエディタではトランスフォームエフェクトを含めてエフェクトをかけた結果に対してさらにエフェクトをかけるという操作を何重にも繰り返すことが可能ですが、タイルキャッシュを使えるのはSVGファイルのイメージストリップに直接適用されたトランスフォームエフェクトのみに限定されます。

●その他
今回の更新で追加された機能は、以上のような感じです。
そして、これは機能の追加とは違った話になりますが、今回の更新ではSVGファイルの描画に使用しているライブラリQtSVGのプログラミング上での扱いが変わっています。
具体的には、ダイナミックローディングという方法を使うことで、もしQtがインストールされていないPC上でBlenderを起動した場合でも、Vectexの機能が使用できなくなるだけで通常のBlenderとして使うことができるようにしています。

ただし、QtのようにC++で書かれているライブラリを直接C言語で書かれたBlenderでダイナミックに読み込むことはできません。
そのため、VectexのソースコードのうちQtに依存する部分だけを分離して、Blenderの実行ファイルの置かれている場所にある「Plugins」フォルダの中に置いてあります。
Linuxではlibqtsvg_vectex.so、Windowsではqtsvg_vectex.dllというファイル名になっています。
pic091129_26.jpg
posted by mato at 21:49| Comment(13) | Blender Vectex | このブログの読者になる | 更新情報をチェックする
×

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