RenderManのお勉強(MacOSXへのaqsisのインストール)


MacOSXでaqsisを利用しようとして、aqsisのページからたどれるdownloadのページにおいてあるMacOSX用のバイナリは、Version0.9.1のunstable版となっています。同じページにおいてあるstable版のソースをみるとVersion1.2となっています。さすがに寂しいのでVersion1.2のMacOSXでのコンパイルに挑戦してみました。ソースを修正して、何とか強引にコンパイルできました。以下はyour own riskということで。

aqsisのダウロードなど

まずは、aqsisのソースをダウンロードする必要があります。
まずは、ここからソースをダウロードします。
ダウンロードしたファイルを解凍します。そうすると、aqsis-1.2.0というフォルダができあがります。もし、aqsis-1.2.0というフォルダが出来ずに、aqsis-1.2.0.tarというファイルしかない場合には、ターミナル上で
bash% tar xvf aqsis-1.2.0.tar
とします。そうすると、aqsis-1.2.0というフォルダができあがります。
これ以降の作業はターミナル上での作業となります。ターミナル上での作業はちょっとしたミスが大きなトラブルにつながることがあります。十分気をつけて作業をしましょう。昔、/etcで"rm *"とやってしまい、大変なことに。。。そんなに沢山のファイルを消したわけではないのですが。。。
解凍して出来たフォルダの中のINSTALLというファイルを見ると、MacOSXの部分は空欄になっています。ここで、ちょっと頭がクラクラ。このファイルの先頭の方にaqsisをコンパイルする上で必要となるライブラリが書かれています。以下のものが必要なようです。
  1. SCons (v0.96.1+, SCons in turn requires Python)
  2. boost (v1.32.0+)
  3. libtiff.lib (v3.7.1+)
  4. flex (v2.5.4) (2.5.31 causes problems, see FAQ 2.2)
  5. bison (v1.35+)
  6. FLTK (v1.1.x) - optional, but required for framebuffer rendering
  7. libzlib (v1.1.4+)
  8. libjpeg (v6b+)
  9. xsltproc
  10. OpenEXR - if you want to read and write OpenEXR HDR image files
一から自分で用意しても良いのですが、かなり面倒そうなので、MacPortsを利用することにしました。

準備(MacPortsのインストールなど)

MacPortshttp://svn.macports.org/repository/macports/downlo...からMacPorts-1.6.0-10.5-Leopard.dmgをダウンロードします。Tigerな人はMacPorts-1.6.0-10.4-Tiger.dmgをダウンロードすれば大丈夫だと思います。以下の作業は、Leopard上で確認しています。

前準備

まずは、コンパイラなどが必要となるので、Xcodeをインストールしておきます。これは、OSのインストールディスクのXcode Tools/XcodeToolsを実行すれば大丈夫です。
ダウンロードしてきたMacPortsをインストールします。

環境変数の設定

MacPortsでは、ソフトウェアを/opt/localにインストールします。従って、各種パスを/opt/localに通しておく必要があります。そのために、次のように自分のシェルの環境変数を設定しておきます。
export PATH=/opt/local/bin:/opt/local/sbin/:$PATH
export MANPATH=/opt/local/man:$MANPATH
シェルにbashを使っていれば、この2行を~/.bashrcに追加します。

MacPortsのアップデート

次に、MacPorts自身を最新の状態にアップデートし、インストールできるソフトウェア一覧を更新します。このためには、次のようにします。基本的に、MacPortsではportコマンドを利用して作業を進めます。
sudo port -d selfupdate       最新の状態にアップデート
sudo port -d sync     インストール出来るソフトウェア一覧の更新

必要なソフトウェアのインストール

aqsisをコンパイルするにの必要なソフトウェアをインストールします。

MacPortsを利用したインストール

MacPortsでソフトウェアをインストールするためには、
sudo port install インストールしたいソフトウェア名
とします。
1. SConsをインストールします。このためには、
sudo port install scons
とします。
2. flexをインストールします。このためには、
sudo port install flex
とします。
3. bisonをインストールします。このためには、
sudo port install bison
とします。
4. libzlibをインストールします。このためには、
sudo port install zlib
とします。
5. libjpegをインストールします。このためには、
sudo port install jpeg
とします。
6. libtiffをインストールします。このためには、
sudo port install tiff
とします。
7. FLTKをインストールします。このためには、
sudo port install tiff
とします。
8. OpenEXRをインストールします。このためには、
sudo port install openexr
とします。
9. boostをインストールします。このためには、
sudo port install boost
とします。なぜかインストール出来ませんでした。そこで、自力でboostをコンパイルすることにしました。

portコマンドの使い方
インストールsudo port install ソフトウェア名
ソフトウェア一覧更新sudo port sync
ソフトウェアのアップデートsudo port update ソフトウェア名
ソフトウェアのアンインストールsudo port uninstall ソフトウェア名
インストールしたソフトウェアの一覧port installed
MacPortsのアップデートsudo port selfupdate

boostのインストール

boostダウンロードページからboostをダウンロードします。ここでは、boostのバージョン1.34.1を落としてきました。
  1. 落としてきたboostのファイルを解凍します。
  2. Unixでのソフトウェアインストール定番の方法(configure→make→make install)で作業を行います。
    1. まずは、boostをインストールする場所を決めます。どこにして良いか迷ったのですが、/optにしました。
    2. ターミナル上で「./configure --prefix=boostをインストールする場所」とします。例えば、「./configure --prefix=/opt」とします。
    3. 次にターミナル上で、「make」とします。少し時間がかかります。MacBookで30分くらいかかりました。
    4. 次にターミナル上で、「sudo make install」とします。
  3. これでboostのインストールは完了(のはず)です。

aqsisのコンパイル

やっと本題にはいります。aqsisはSConsというpythonベースのツールを使ってインストール作業を行うようになっています。SConsでは、sconsコマンドを使って作業をこないます。sconsでは、SConstructというファイルにソフトウェア構築に必要な情報が書きます。SConstructはmakefileに相当するものです。ここで少しはまってしまいました。
aqsisをコンパイルするためには、
1. aqsisをインストールする場所の決定、
2. boost関連のヘッダファイルとFLTKがインストールされている場所の確認
が必要です。
今回は、aqsisは/opt/aqsisにインストールすることとし、boostは/optにインストールしてあるので、/opt/include/boost-1_34_1がoost関連のヘッダファイルがインストールされている場所、FLTK関連のインクルードファイルは/opt/local/include、FLTK関連のライブラリは/opt/local/libにインストールされています。
  1. ターミナル上で「scons boost_include_path=ヘッダファイルがインストールされている場所 fltk_include_path=FLTK関連のインクルードファイルがインストールされている場所 fltk_lib_path=FLTK関連のライブラリファイルがインストールされている場所 install」とします。今回は、「scons boost_include_path=/opt/include/boost-1_34_1 fltk_include_path=/opt/local/include fltk_lib_path=/opt/local/lib」となります。これも少し時間がかかります。
  2. ところがソフトウェア構築中のshadercompile(asql)の実行で失敗しますorz。"dyld: Library not loaded: @executable_path/libaqsistypes.dylib”と言っているので、どうもダイナミックライブラリの読み込みが出来ないようです。そこで、環境変数DYLD_LIBRARY_PATHを設定して、強引に(?)に場所を指定してから再度実行をすることにします。これは、aqsisのフォルダにあるbuild/aqsistypesフォルダの中にあるlibaqsistypesのフォルダの場所を確認します。pwdコマンドで出力する場所を設定するすれば大丈夫です。例えば、aqsisのフォルダにあるbuild/aqsistypesフォルダに移動してから、「export DYLD_LIBRARY_PATH=`pwd`」とすれば大丈夫です。
  3. 次に、最終のインストール作業「sudo scons install_prefix=インストール場所」とすれば良いかと思ったのですが、そう簡単にはいきませんでしたorz。なぜか再度コンパイルを始めてしまい、sudoでは環境変数DYLD_LIBRARY_PATHが引き継がれないので、コンパイルに失敗してしまいます。それとコンパイル時のメッセージをよく見てみるとfltkが無視されています。このままでは、Displayでframebufferが使えませんorz。
  4. まずは、インストールすることを目指して、強引に作業を進めることにしました。fltkは無視されているので、fltk関連のの引数は省き、「sudo sh -c "export DYLD_LIBRARY_PATH= libaqsistypes.dylibがある場所; scons boost_include_path=boost関連のインクルードファイルがインストールされている場所 install_prefix=aqsisをインストールする場所 install"」とすることにしました。これで一応インストールでいました。
  5. 後は、.bashrcなどでaqsis関連の環境変数を設定するだけです。
  6. ところが、bus errorが発生してしまい、上手く動作していません(T_T)
  7. 気を取り直して、がんばって原因を調べてみました。すると、renderer/render/ri.cppの中の関数SetDefaultRiOptionsの中で落ちているようです。色々やってみると、502行目あたりの関数 CFStringGetCStringPtrが上手く動いていないようです。そこで、この行をコメントにして、次のように置き換えて見ました。とりあえず動いているようです(^o^)。サンプルとしてついてくるvase.ribのレンダリング結果を載せておきます。ただ、MacAqsis0.9.1でレンダリングした結果とteapotの形が少し違うのですが。。。


(修正前)renderer/render/ri.cppの関数SetDefaultRiOptions内の502行目あたり
	CFURLRef pluginRef = CFBundleCopyBundleURL(CFBundleGetMainBundle());
	CFStringRef macPath = CFURLCopyFileSystemPath(pluginRef, kCFURLPOSIXPathStyle);
	const char *pathPtr = CFStringGetCStringPtr(macPath, CFStringGetSystemEncoding());
	separator = "/";
(修正後)
	CFURLRef pluginRef = CFBundleCopyBundleURL(CFBundleGetMainBundle());
	CFStringRef macPath = CFURLCopyFileSystemPath(pluginRef, kCFURLPOSIXPathStyle);
	//const char *pathPtr = CFStringGetCStringPtr(macPath, CFStringGetSystemEncoding());
	char buf[2048];
	CFStringGetCString(macPath,buf,sizeof(buf)-1,CFStringGetSystemEncoding());
	rootPath = buf;
	separator = "/";

ところで、関数CFStringGetCStringPtrは挙動が怪しい関数のようです。ドキュメントに” So do not count on receiving a non-NULL result from this function under any circumstances.”と書かれています。

aqsis関連の環境変数を設定

bashなどを使っている場合には、~/.bashrcなどに以下のような項目を追加します。その後に「source ~/.bashrc」とします。
export AQSIS_BASE_PATH=aqsisをインストールした場所(例えば、/opt/aqsis)
export AQSIS_SHADERS_PATH=$AQSIS_BASE_PATH/aqsis/share/shaders 
export AQSIS_DISPLAYS_PATH=$AQSIS_BASE_PATH/aqsis/share/displays 
export AQSIS_ARCHIVES_PATH=$AQSIS_BASE_PATH/aqsis/share/archives 
export AQSIS_TEXTURES_PATH=$AQSIS_BASE_PATH/aqsis/share/textures 
export AQSIS_DSO_LIBS=$AQSIS_BASE_PATH/aqsis/share/dso 
export PATH=$PATH:$AQSIS_BASE_PATH/bin

tcshなどを使っている場合には、~/.tcshrcなどに以下のような項目を追加します。その後に「source ~/.tcshrc」とします。
setenv AQSIS_BASE_PATH aqsisをインストールした場所(例えば、/opt/aqsis)
setenv AQSIS_SHADERS_PATH $AQSIS_BASE_PATH/aqsis/share/shaders 
setenv AQSIS_DISPLAYS_PATH $AQSIS_BASE_PATH/aqsis/share/displays 
setenv AQSIS_ARCHIVES_PATH $AQSIS_BASE_PATH/aqsis/share/archives 
setenv AQSIS_TEXTURES_PATH $AQSIS_BASE_PATH/aqsis/share/textures 
setenv AQSIS_DSO_LIBS $AQSIS_BASE_PATH/aqsis/share/dso
set path = (~/bin $AQSIS_BASE_PATH $path)

上手くいっていないところ

サンプルとしてついてくるvase.ribのレンダリング結果とMacAqsis0.9.1でレンダリングした結果では、teapotの形が異なっています。今回コンパイルしたものの方が、teapotの形の崩れ具合が大きくなっています。左がMacAqsis0.9.1でレンダリングしたもの、真ん中が今回コンパイルしたバイナリ(aqsis1.2.0)でレンダリングしたものです。右はダウンロードしてきたWindows版のバイナリ(1.2)でレンダリングしたものです。なんとか動いているようなのですが。。。

MacAqsis0.9.1の結果aqsis1.2の結果(Mac)aqsis1.2の結果(Windows)
2008年02月03日(日) 13:46:03 Modified by m_riho

添付ファイル一覧(全4件)
c2205ccd.jpg (9.60KB)
Uploaded by m_riho 2008年01月23日(水) 16:30:03
61e772be.jpg (4.75KB)
Uploaded by m_riho 2008年01月23日(水) 09:49:45
b402a9c3.jpg (4.06KB)
Uploaded by m_riho 2008年01月21日(月) 14:29:30
5924e159.jpg (4.06KB)
Uploaded by m_riho 2008年01月21日(月) 14:28:34



スマートフォン版で見る