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 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
お疲れ様です。
なんかどんどん機能が増えすごいですね。見ていて楽しいです。

てなことで、とりあえず使わせてもらいまーす。
Posted by aki at 2009年11月30日 01:26
はじめまして。
コメントをありがとうございます。
本当はとっくにBlender2.5ベースに移行している予定だったのですが、色々な部分でつまづいているうちにAlpha0が公開になってしまいました。
Graphicall.orgにアップロードするとき、他が全部Blender2.5ばかりでかなり恥ずかしかったです。
次の更新ではBlender2.5ベースのものになっているはず...です。

これからもよろしくお願いします。
Posted by mato at 2009年11月30日 03:01
ご無沙汰しております。
明けましておめでとうございます。
今年もマイペースで頑張ります。
よろしくお願いします。
Posted by t-nanase at 2010年01月01日 19:25
明けましておめでとうございます。
本当にご無沙汰してしまってすみません。
このところ、ほとんど3DCGの作品作りから遠ざかっています。
今年はもう少しブログが華やかになるようなことができるといいのですが...。
その前に更新回数が少なすぎるのをなんとかしないと、という感じもします。
よろしくお願いします。
Posted by mato at 2010年01月02日 03:36
初めまして。こちらの2.4用パッチをVisual C++ 2008で動作する様変数宣言位置の移動や#define EXT extern "C"の追加を行った上で
2.4 rev.27617に対して使用させて頂きCMakeでビルドしてみましたところ、
SVG機能を使用しようとするとstackhashというエラーでクラッシュします。
MinGWでビルドされたと思われるhttp://www.graphicall.org/builds/builds/showbuild.php?action=show&id=1105
2.5用パッチの場合は特に問題は発生しておりません。
何が原因か分かりますでしょうか。
改造したパッチはこちらになります。
http://booster.x0.to/Blender/etc/Vectex.patch

使用環境及びビルド環境はWindows Vista x64 SP2 日本語版及びVisual Studio 2008 Expess SP1、
Qtはhttp://code.google.com/p/qt-msvc-installer/
qt-win32-opensource-4.6.2-vs2008.exeとqt-win64-opensource-4.6.2-vs2008.exeを使用しております。
Posted by at 2010年03月20日 14:03
初めまして。
このVectexビルドをソースからビルドしていただけていると聞いて、とても嬉しいです。
ありがとうございます。
本来なら、プラグインファイルの作成方法などについての説明を、詳しくドキュメントにまとめてないといけないのですが、何の説明もなくて本当にわかりづらくて申し訳ありません。

Blender2.49をベースとしていたときにはコンパイルにMinGWだけを使用していたため、Visual Studioでコンパイルすると問題が起こることに気づきませんでした。
Blender2.5に移行した後に、Windowsでのコンパイル環境をVisual Studio + Sconsに変更してみて、初めていくつかの問題に気がつきました。

・変数宣言位置が関数の先頭以外に分散していると構文エラーになる。
・プラグインのヘッダに" __declspec(dllexport)"がないと必要な関数がエクスポートされない。

この他に、QtSVGで描画を行う画像領域のメモリ確保をプラグイン側で行うと問題があるらしく、現在のプラグインではBlenderの本体側で確保したメモリのポインタをプラグインに渡すように変更しています。

stackhashというエラーがこれと同じなのかまだ確認していませんが、おそらくこのメモリ関係の問題ではないかと思います。現在、状況を確認中です。
少しソースコードを修正して、現在のBlender2.5のVectexビルドで使用しているプラグインファイルをそのまま使えるようにして、問題を回避できるか調べてみたいと思います。
Posted by mato at 2010年03月21日 01:13
作成していただいたパッチファイルにさらに変更を加えて、Blender2.5版で使用しているプラグインファイルをBlender2.49の方でも使用できるようにしてみました。
http://render360sideb.up.seesaa.net/data/changes100321.zip

とりあえずVisual Studio 2008 Express + Sconsで動作することを確認しました。
CMakeを使ってVisual Studio上でのコンパイルも確認したかったのですが、現在の私の環境ではVectexビルドのパッチを適用していない状態でもコンパイル後にうまく動作させることができませんでした。(CMakeを使ったコンパイルは以前より難易度が上がったような気がします...。)

お手数ですが、こちらを使って動作するか確認していただけないでしょうか?
よろしくお願いします。
Posted by mato at 2010年03月21日 05:43
更新有難うございます。
試してみましたところ正常に動作致しました。
有難うございました。

2.4のCMakeファイルにつきましては、メンテナンスモードに移行する直前にpythonやffmpegが更新されたものの
対応されないまま放置されてしまった為不具合が出たままになっております。
当方でパッチを用意しておりますので、もしCMakeでのビルドに興味がおありでしたらお試し下さい。
http://booster.x0.to/Blender/fix+%20for%20CMakelists.txt.rar
Posted by at 2010年03月21日 17:36
修正版が無事動作したとのことで、ほっとしました。
また、ご用意いただいたパッチを使用してCMakeでBlender2.49のビルドができるようになりました。
ありがとうございました。
今後はCMakeでのビルドについても、もう少し勉強してみたいと思います。
Posted by mato at 2010年03月21日 22:33
2.4 rev.29422での検証をしましたのでご報告致します。
trunkと違い、1080pはどのビルドでも駄目な様です。
尚、Vectexのパッチにつきましては下記の最新版を使用しております。
http://render360sideb.up.seesaa.net/data/changes100321.zip

・結果
32bit版
最適化無し...800 x 600・720pでは問題無し、1080pでは問題有り
/fp:Fast...800 x 600・720pでは問題無し、1080pでは問題有り
/arch:SSE2...800 x 600・720pでは問題無し、1080pでは問題有り
/fp:Fast + /arch:SSE2...800 x 600では問題無し、720p・1080p共に問題有り

64bit版
最適化無し...800 x 600・720pでは問題無し、1080pでは問題有り
/fp:Fast...800 x 600では問題無し、720p・1080p共に問題有り
/fp:Strict...800 x 600・720pでは問題無し、1080pでは問題有り

検証に使用したビルドとファイル一式→http://booster.x0.to/Blender/etc/test-29422.rar
Posted by at 2010年06月12日 21:38
書き込み対象エントリーを間違えました。
申し訳ございません。
Posted by at 2010年06月13日 12:47
すみません、Blender2.49の方のことをすっかり忘れてました。
Blender2.5の方と同じ内容の修正をしたパッチを作成しました。

http://render360sideb.up.seesaa.net/data/blender2.4_Vectex_patch_100614.zip

よろしくお願いします。
Posted by mato at 2010年06月14日 01:32
更新有難うございます。
2.4 rev.29574にて試してみましたところ、上記の全てのケースに於いて1080pのレンダリングが正常に行える事を確認致しました。
Posted by at 2010年06月20日 22:51
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

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


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

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