8.01.2008

SDL + DirectX9 + Direct3D + MinGW + Debian/GNU Linux での、DirextX9アプリケーションのクロスコンパイル

フレームレートの計算ばっかりじゃ面白くないなぁと思っていたら、手が勝手に動いてました(笑)
8月一発目のネタがこれとはね。

そんなわけで、やたら長ったらしいタイトルの通り、ド変態クロスコンパイル環境に、さらに変態な環境を付け加えてみようという試み。

まず理解していただきたいのが、DirectXを利用することで、確かに最近の3DCGで話題な機能の恩恵を受けることができるものの、SDLを使う意味はほとんどないということ。
つまり、SDLの利点であるマルチプラットフォームとか、高い移植性とか、そういうのをガン無視できる人だけがやっていい裏ワザ的なものだということ。
(もしマルチプラットフォームを捨てたくないならば、素直にOpenGLを使うべきですよ)

それから、そんなにWindows環境に依存したアプリを書きたいというのなら、素直にクロスコンパイル環境じゃなくてVisual C++とかを使うべきだということ。

この辺を理解していないと、(理解していても)「???」が頭に残る展開になること請け合い。



まず、前準備としてDirectX 9 SDK(以下SDK)をダウンロードしておく。
執筆時点での最新版はMarch 2008。ライブラリファイルを覗くと、すでにd3d10.libとかが用意されてる。違った。よく調べてみると、June 2008が最新らしい。時間があったら差し替えようか…。でも、そんなに大きな変更はないみたいだしなぁ…。悩むなぁ…。)

ダウンロードしておいたSDKを展開して、インストールを開始する。
入れるのはヘッダーとライブラリのセットだけ。
x86版に限れば(SDKにはx64版も付属している)、ヘッダーとライブラリを合わせてzip圧縮かければ、せいぜい3MBちょっと。
それに対してSDK全体の容量は圧縮時で400MB強、展開時で1GB弱。

なぜMicrosoftは必要なものだけダウンロードしてくれる、JavaSDKタイプのインストーラーにしなかったんだろうと小一時間考えたら、インストールしたヘッダーとライブラリをいつもの場所にコピー。
ヘッダーはめんどうならベタでコピーしてもいいけど、私はDXってディレクトリを新たに切って、そこに放りこみましたよ。(ライブラリはベタで放り込んだ)

いつもどおりの事だけど、ライブラリの変換作業とかそんなのは必要なかった。
いつからMinGWはこんなに進化したんだろう?

それが出来たら、チュートリアルサイトを見ながらコードを組む。

あ、WindowsにインストールしたSDKはもう必要ないから、削除してかまわないですよ。

出来上がったらコンパイル。
ここでもコンパイルコマンドには気をつける必要があって、
mingw-c++ filename -lmingw32 -lSDLmain -lSDL -ld3d9 -ld3dx9 -mwindows
のように指定する必要がある。
※ 必ずSDL関連ファイルを先頭に指定するというのがミソ。

あとはできたものをWindowsにコピーして実行すればOK。
サンプルそのままだと、全画面表示になるので注意。

ソースをみてもらえば分かると思うけど、コードはほとんどが通常のをDirectXを使ったプログラミングで使われるものがそのまま使われている。
というのも、DirectX自体、渡されたウィンドウハンドルを持つウィンドウに描画を行うかららしい。

だから実は、SDLで作られていようが、WinAPI直叩きで作られていようが、DirectXさんにとっては何の関係もないものということだ。

それなら私は、ウィンドウ生成が楽チンなSDLを選ぶなぁ。実行時にDLLが必要って手間はあるけどさ。
そうそう、コンパイルしたバイナリを動かすには、最新のDirectXランタイムが必要だから、動かない場合はそちらをインストールするとよさげ。

0 件のコメント: