2009年03月13日

テクスチャプラグインのサンプルをコンパイルしてみる

「vectexを改良しよう!」と目標は定めてみたものの、予備知識がないことにはどうにもならないので、まずは基本から始めてみたいと思います。
とりあえず簡単なテクスチャプラグインを自作するところから始めてみます。プラグインファイルを作る際に参考になりそうなページがBlender.orgのWikiにあります。

こちらを読んでみるとBlenderのインストールディレクトリの「plugins」フォルダにプラグイン開発に必要なファイルが全部そろっていて、サンプルもいくつかあるということです。このフォルダは3Dマウス「SpaceNavigator」を使う際にプラグインファイルを置く場所だったので知っていましたが、テクスチャプラグインの開発用のファイルが置いてある場所でもあったんですね。
pic090313_01.jpg

この「plugins」-「texture」フォルダを見てみると「clouds2.c」「tiles.c」という2つのサンプルファイルがありました。「plugins」-「include」フォルダの方にはプラグインの〜.cファイルを書く際に使われるC言語のヘッダファイルがあります。
pic090313_02.jpg pic090313_03.jpg

プラグインを実際にコンパイルするには「plugins」フォルダにあるMakefileを使えばいいようです。テクスチャプラグインの開発に必要なファイルは「plugins」フォルダの中にあるものだけで、Blenderのインストールディレクトリにあるその他のファイルは関係ないようです。実際にプラグインをコンパイルする場合、「plugins」フォルダごと別の場所にコピーしておいて、そちらで開発するという感じでもいいようです。

Linuxの環境でサンプルファイルをコンパイルしてみます。
コンソールウィンドウで「plugins」フォルダに移動して、

$ make

とするだけです。
コンソールにとくにエラーらしきものが表示されなければ、「texture」フォルダの中に「cloud2.so」「tiles.so」というファイルができているはずです。(エラーが表示されてもファイルができてしまうこともあるのですが、そういう場合はBlenderでプラグインをロードするときに失敗したりします)
pic090313_04.jpg pic090313_05.jpg

ちなみに「plugins」フォルダのMakefileはこんな感じになっています。

all: textures sequences

textures:
$(MAKE) -C texture

sequences:
$(MAKE) -C sequence

clean:
$(MAKE) -C texture clean
$(MAKE) -C sequence clean

「texture」フォルダと「sequence」フォルダに入っているMakefileを実行するように記述されています。
そして、「texture」フォルダのMakefileは、こんな感じです。

all: plugins

plugins:
@/bin/sh -c 'for i in *.c; do ../bmake $$i; done;'

clean:
rm -rf *.o *.so

「〜.c」という名前のファイルがあったら全部コンパイルする、ということですね。
自分で新しく「test.c」というようなプラグインを書いたとしても、Makefile自体を修正する必要はなくて、makeコマンドを実行するだけでコンパイルしてくれるというのは助かります。

さて、できあがったプラグインはどんなものなのでしょうか?
どちらもソースコードの行数は178行で、書かれているコードはそれほど多くはありませんが、かといって最低限の簡単さというわけでもなく、普通に実用的なプラグインとして使えそうな感じです。
pic090313_06.jpg pic090313_07.jpg

長くなってしまったので、今回はここまでにします。次回以降でオリジナルのプラグインを作ってみたいと思います。
(ちなみに、Windowsでも試してみようと思ったのですが今のところまだうまくコンパイルできていません。もう少し調べてみたいと思いますが、Windowsの開発環境(VisualStudio、MinGW、Cygwin、LCCなどで試してみています)自体についてかなり勉強しないと難しそうな感じです。ちょっと無理っぽいような...。)
posted by mato at 01:32| Comment(0) | Blender | このブログの読者になる | 更新情報をチェックする

2009年03月10日

vectexのソースコード

前々回の記事の中でも書きましたが、vectexはAGG SVG Viewerのソースコードを使って書かれています。実際に両者のソースコードを見比べてみると、かなりの部分が共通しています。vectexはオープンソースの既存のコードがとても効率よく使われていて、vectexの作者のmgmalheirosさんが自分で書き起こしたコードは意外なくらいに少ないです。
pic090310_01.jpg

上の図で、赤い部分は既存のコードがそのまま利用されているファイル、青の部分が新規に作成されているファイルです。
「agg-2.5」「blender」「expat-1.95.8」というフォルダの中身については、「agg-2.5」は2D描画のためのライブラリのソースコード、「expat-1.95.8」にはXML構文解析のライブラリのソースコードがまるごと入っていて、サンプルファイルが省かれたりはしていますが、基本的に中身は配布されているものそのものです。「blender」フォルダにはBlenderのテクスチャプラグイン開発用のヘッダファイルなどが入っていますが、こちらも配布されているものがそのままコピーされているだけです。

vectexのトップディレクトリには「.h」「.cpp」「.c」という拡張子のファイルが10個あるわけですが、このうちの7個はAGGのSVG Viewerのサンプルコードと同じ名前になっています。Meldという差分表示ツールを使ってみると、実際には少しだけ修正されているところがあるようですが、ほとんどそのままで使われています。
pic090310_02.jpg

SVGファイルの読み込みから描画までのほとんどの部分がAGG SVG Viewerのコードそのままということは、もとのAGGのファイルが更新されてより多くのSVGの機能を使えるようになれば、ほとんど自動的にVectexでもその恩恵を受けることができるということになります(使用変更とかがあると必ずしもそうはならないかもしれませんが...)。もしそうなると嬉しいのですが、残念ながらAGGのサイトを見た感じでは2006年10月を最後に更新されていないようです。
そして、vectexの方も公開されてから約1年になりますが、BlenderArtist.orgのスレッドの状況などからすると、更新の可能性は低そうに思えます。

私はこのプラグインの機能は、このまま埋もれさせてしまうのはあまりにも惜しいと思います。できれば、マルチスレッドに対応し、通常のSVGファイルならどれでも読み込めるようにして、普通のテクスチャと同じ感覚で使えるところまで発展させたいところです。
ちょうど私は3DCGのプログラミング技術をもう少しレベルアップしたいと思っていたところなので、しばらくの間、このプラグインを改良することを目標にしてプログラミングの勉強を進めてみようと思っています。

とはいっても、現時点ではプラグインというものを自分で作ったことさえ一度もなく、ほとんどプログラミング初心者という感じ(実際にはプログラミング歴数十年なのですが、初心者レベルから全然進歩していない)ですので、結局、何も変えることができないままで終わってしまうかもしれません。もし、そうなってしまったら、すみません。
posted by mato at 23:46| Comment(0) | Blender | このブログの読者になる | 更新情報をチェックする

2009年03月07日

vectexで服のテクスチャを試してみました

これまでBlenderのSVGテクスチャプラグイン「vectex」について色々調べてきましたので、テスト画像だけでなく実際に使ってみたいと思います。

実際に試していただけるように、一応サンプルデータsample_data090307.zipを用意してみましたが、自分の PC環境以外で上手く開けるかどうかよくわかりません。 vectexプラグイン自体は入っていませんので、公式サイトの方から入手して下さい。前々回の記事を参考にしていただければ、vectexをロードした状態でファイルを開くことができると思います。

私はこのプラグインを主にキャラクターの衣服のテクスチャを表現するのに使いたいと思っていました。
Poserなどでは既存の衣服のデータに対して、カスタムテクテクスチャを作成して使用することがよく行われています。そのため、衣服の形状データでUV展開をする場合は、可能なかぎりテクスチャを描きやすいようにしています。私の場合、実物の衣服が生地から型紙を使って裁断されるのをイメージしてみたりします。

この場合、服全体のUVが均等に展開されるので、繰り返しになる部分を重ねて面積を節約するような方法よりもテクスチャ画像を大きめにしないと模様の細部を再現できません。
私がPoser用のフィギュアに付属させた服のテクスチャのサイズは1024x1024程度です。上半身全体が入るような構図のレンダリングであれば、それと同じくらいの画像サイズなら十分かと思います。ただ、手や顔などのクローズアップの構図にたままた服も入ってしまうような場合、このテクスチャのサイズだとちょっときついかもしれません。

服のテクスチャとしてvectexを使用した場合の効果を確かめるため、以前作成したJpeg画像とほぼ同じ内容のSVG画像を作成して比較してみました。服のテクスチャーには、通常のカラー用、トランスマップ用、バンプマップ用の3枚の画像を使用しています。SVG画像の作成にはInkscapeを使ってみました。
pic090307_07.jpg

テスト用のデータとしてはこんな感じのものを使っています。
pic090307_01.jpg

テクスチャ部分をクローズアップして比較するとこんな感じになります。
pic090307_02.jpg pic090307_03.jpg

Jpegの方が1024x1024というのはちょっと解像度が低すぎというのもあるのですが、vectexの方はレースの模様がくっきりとしていてプラグインの効果を十分に発揮しているようです。トランスマップのエッジ部分がとても鮮明でいい感じなのですが、なぜかバンプマップはまったく効いていないように見えます。

ちょっと気になったので「texture」パネルでバンプマップ以外のテクスチャを無効にした状態でレンダリングしてみました。この状態で比較するとよりはっきりするのですが、vectexでは完全にバンプマップが機能していないようです。バンプを完全にオフにした状態とも若干違うようですが、とにかく模様が浮き出るような感じになりません。
pic090307_04.jpg pic090307_05.jpg

これがなぜなのか非常に悩んだのですが、もともとのバンプマップの計算の仕組みの関係で、解像度に依存しないプロシージャルテクスチャでは離散的な明度差の絵を使用した場合には普通にこういうことが起こるようです。
こちらのサイト(OpenGLのプログラミングについて、色々詳しく書かれています)にバンプマップの分かりやすい図がありましたので、それを参考にして比較用の図を作ってみました。左が普通の画像の場合、右が今回のような場合です。
pic090307_06.jpg

はっきりと確認したわけではないのですが、おそらくこういう感じになっているのではないかと思います。

Blenderのプラグインリポジトリにあるテクスチャプラグインをいくつか調べてみると、vectexと同じようにバンプマップがうまく機能していないものがありました。さらに、いくつかのプラグインのパネルには、バンプマップとして使用するときのための設定ボタンが付いていました。どうもvectexではバンプマップを使うことは難しそうな感じです。

とりあえず、バンプマップ用に3072x3072のPNG画像をInkscapeから書き出して、vextexのカラー、トランスマップと組み合わせて使用してみました。
pic090307_08.jpg

あまりバンプの効果がわからないような...。それはともかく、これだと最初からカラー、トランスマップの分も含めて3枚の画像とも3072x3072で作成しておけばそれでいいのでは、という気もしてしまいますね。
それにしても、今回のサンプル画像を作るだけでも、ものすごく時間がかかるように感じました。マルチスレッドが使えないというのは、かなり厳しいです。
posted by mato at 03:37| Comment(0) | Blender | このブログの読者になる | 更新情報をチェックする
×

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