No.9
作業の時間がだんだん取れなくなってきてますが、
モデルコンバータとモデルフォーマットの実装は何となくしていってます。
自分用のメモとして困ったことを一つ。
今俺俺フォーマットver.0.01を作成中ですがバイナリデータの扱いに関して。
モデルバイナリ用構造体を用意しそこに読み込んだバイナリを流し込んでいるのですが、
そのままキャストして頂点などを取り出そうとし、
stuct ModelBinary
{
void* data
};
ModelBinary* modelBinary = (ModelBinary*)binaryPtr;
のようなことをしました。
すると、dataにはバイナリの最初のsizeof(void*)分のデータが入ってますよね?
このあたりがそもそもの実装ミスで、きちんとバイナリを構造体にキャストする処理を挟む必要があった訳です。
そのあと無理矢理検証だけは済ませたかったのでアホみたいなキャストを繰り返して
テストしましたが、絶対に修正する必要があります。
あのライブラリーのあのキャスト処理はそういうことだったかと今更理解できました。
ModelBinary* modelBinary = ModelFactory::Create(binaryPtr);
てきな風に変更します。モデルデータ構造体も全く別のものにします。
この辺は今週末に一気に改修していく予定です。
バイナリの扱いを全くわかってないなという一件でした。
なさけない。
No.8
FBXコンバータの前段階として、
SDK付属のsampleのImporterを必要な部分だけ写経しています。
現在、頂点・頂点インデックス・法線の取得まで確認しました。
あとUV・テクスチャなどのマテリアル情報まででいったん俺俺モデルフォーマットを作成します。
アニメーション、カメラなどのシーン情報はその後必要になり次第としていく予定です。
マテリアルの情報の持たせ方・保持の仕方で気になる点がいくつかあるので
それをTorqueやDoomなどオープンソースなものを参考に考えていきます。
会社のもちょっと参考にできるとこを探したいです。
わかったこと
・(FBXSDK内で)ControlPointというのが頂点座標だということ
・(〃)PolygonVertexが頂点インデックス
・法線など頂点単位・インデックス単位で管理されているものがある。
悩んでいるところ
・マテリアル≒シェーダだと思うのですがシェーダ情報もモデルに埋め込めるのか?
・ポリゴンは3角形と4角形両対応するかしないか。
・UV値は複数持つことになるが何単位で持たせるのがいいのか?
・頂点単位・インデックス単位で管理されているものがあるが(法線・マテリアルなど?)
どう管理したらよいのか?
・インデックス単位で管理する必要がありそうなものがいくつか浮かぶが、
現状そのようには実装できていない。通常はどう実装されているのか?
参考にしたもの
・ひたすらImporterサンプル
・ControlPointsなど用語の意味は全くわからなかったので以下を参考に。
(ただ記事のSDKはかなり古く差異があるので用語のみ参考に)
http://marupeke296.com/FBX_main.html
最近のゲーム
ドラゴンズクラウンのPVなどが更新されました。
ベルトアクション的なのは好きですし、ハクスラも好きなので気になってます。
ローグライクも大好きで昔やってたのを思い出してきたし
どちらかのジャンルのゲームを遊びたいし、作りたくなってきました。
最近気になるゲームがどんどん発売されてきてヤバいです。
ソウルサクリファイス(購入済み)
朧村正
MGR
DQ10
FARCRY3
ヴァンパイアリザレクション
などなど…
No.7
cmakeでfbx importer的なソースをビルドする環境が出来上がりました!
肝心のインポータはまだ実装中です。
(というかmacでの変換対象ファイルへのパス通しに苦戦してます…)
CMakeLists.txtのとりあえずビルドとおる版
https://gist.github.com/bundai223/5238322
悩んだとことしては、
まずプラットフォームの区別(IF(APPLE)などの部分)
UNIX、WIN32とすぐ想像つくけどmac os xがAPPLEとなっているところ
CでもAPPLEとか使っているのでなんとか連想できました。
次に変数の使用に関して
環境変数は、参照する際には$ENV{VALUE_NAME}と記述する
変数は、SET(VALUE_NAME value)で設定し、UNIX形式(${VALUE_NAME})で参照する。
IF()〜ENDIF()には同じ条件を記述すれば問題ない。(おそらく空でもいい?)
IF( HOGE ) 〜 ELSEIF( PIYO ) 〜 ENDIF( PIYO )と書いたら
エラーが出てしまいました。
LINK_DIRECTORIESで設定したパスに勝手に$(Configuration)みたいなのがつく。
Debugビルド時は/path/to/lib/Debugみたいなターゲット名ディレクトリ的なもの。
使用するライブラリ(今回はFBXSDK)にそんなディレクトリがないため
Xcode上でエラーになりました。
VisualStudioではおかしいですが問題なく参照できるパスも通り、エラーは出ませんでした。
TARGET_LINK_LIBRARIESにライブラリ名とパスもすべて通すようにして対処できました。
OSXでビルドする際にCarbonをリンクする必要がある。
Carbonが必要なのはsdkのサンプルを確認して分かっていたが、
Frameworkに慣れていない & 自動で解決してほしかったがFIND_LIBRARYが思った通りに動かせなかった。
mdfind Carbon | grep frameworkして拾ったパスをリンクしたら解決しました。
Visual StudioとMakefileは簡単に設定できましたが
Xcodeが一日多くかかってしまいました。
今回いろいろわかったので今後CMakeでプロジェクト管理していきたいです。
現状での問題点は、
・CMakeLists.txtを一つで済ませるとXcode上でソースツリーのフォルダ分けをしてくれない。
恐らくCMakeLists.txtを階層分けすれば解決しそうだけど管理面倒くさい
なんか楽な方法ないか?
というところです。
これを使ってFBXインポータ・コンバータを作成していきます。
(gistの記事への埋め込みはどうしたらいいんでしょうか?そのうち調べる。)
No.6
記事名を打ち込むの面倒なので番号のみでいきます。
(書いた記事の数がわかるとなんかおもしろいかな?)
今日はFBXインポーターと自分専用モデルバイナリフォーマットを考えていました。
インポータはサンプルをみながら牛歩で進めていっています。
インポータのプロジェクトを以前から興味のあったCMakeでビルド環境を
整えられるようにしたいと考えて同時に進めていっています。
便利Makefileを作成し、実際プロジェクトは出力できるようになったのですが
ライブラリのリンク設定関連がうまくいっておらずビルドは通っていません。
眠たくなったのでCMakeは放置していました。
完全に眠たくなったので今日はここまで。
進捗 No.5
今回はGLに関して進展がほとんどありません。
テクスチャの処理をかりで実装したのみです。
vim scriptの方では初めてunite-sourceという形ではありましたが
プラグインの形となるものを書いてみました。
下のページが大変参考になりました。
http://mattn.kaoriya.net/software/vim/20111202085236.htm
http://d.hatena.ne.jp/thinca/20100201/1265009821
http://d.hatena.ne.jp/thinca/20101105/1288896674
後は独自のモデルフォーマットを作成してFBXからコンバートできるようにしようと考えています。
が、やりたいことがよくわからなくなってきたため一時停滞中になっています。
スレッド処理も作成したいしサウンドもいじってみたいし。
ひとまず仮ででもモデル描画を作成していくつもりです。
FBXビューアを作成しようかな。
そろそろリソースと処理の分離も意識して書いてかなくてはこんがらがってしまいそうなので気をつけたいです。
進捗 No.4
数日かけてよく使う頂点型の宣言とそのAttrib設定便利処理を作成しました。
またテクスチャのテストも行いました。
フラグメントシェーダーでテクスチャを参照する際に
texture2D関数をしようしてWindowsで制作していましたが、
MBP Retina2012だと'No Declarated texture2D'とかいわれて
コンパイルエラーってました。
texture2D関数をtexture関数に変更してコンパイルが通るようになりました。
原因は明日調べる予定です。
次はフレームバッファオブジェクトを使用する処理を作成して
レンダーターゲットの切り替えを簡単にできるようにしたいと思っています。
モデルクラスも頂点型が定義できたので作成していっています。
GLSLで困るたびにググって調べていますが、CgFx言語への
乗り換えをしたくなる記事ばっかり読んでしまって悩み中です。
遅延レンダリング処理を作成したいのでその準備をゆっくり進めています。
ソウルサクリファイスが面白くなってきてしまってます。