製作8日目
DirectXのラッパーライブラリを作成し、ビルドすると
1>d3dx9d.lib(d3dx9d_36.dll) : warning LNK4006:
__NULL_IMPORT_DESCRIPTOR は d3dxof.lib(d3dxof.dll)
で定義されています。2 つ目以降の定義は無視されます。
というワーニングが。
たぶんいろんなとこで定義されてるんだろう。そう書いてあるし。
ぐぐった結果こちらのページによると、
追加の依存関係から削除し、#pragmaでlibを指定してあげるといいそうです。ワーニングなのでまぁ放置。
今回はスクリーンショットに収められるような変化は皆無なので割愛。
今日までの進歩は
- DirectX初期化
- フルスクリーン対応
- アサート
です。
DirectX初期化
いろいろなサイト&数年前書いてそのままだった自分で書いたDirectXの初期化コードの
おかげでうまいこと初期化できたので省略
当時僕はコピペで済ませていたようです。
g_lpD3D->CreateDevice(0,D3DDEVTYPE_REF,hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
¶m,&g_lpD3DDevice)
D3DDEVTYPE_REF & D3DCREATE_HARDWARE_VERTEXPROCESSING
この組み合わせがありえないということに気づいたのはついさっきです。
HAL T&L | D3DDEVTYPE_HAL | D3DCREATE_HARDWARE_VERTEXPROCESSING |
HAL | D3DDEVTYPE_HAL | D3DCREATE_SOFTWARE_VERTEXPROCESSING |
REF | D3DDEVTYPE_REF | D3DCREATE_SOFTWARE_VERTEXPROCESSING |
なるほど。
HAL → Hardware Abstraction Layer
REF → REFerence rasterizer
T&L → Transformation & Lighting
なるほど。そういう意味なのか。
というか、DirectXのドキュメント最初から読めという話ですね。すいません。
- HAL T&L
- HAL
- REF
この順で初期化しなさいと書いてありました。ですよね。
フルスクリーン対応
D3DPRESENT_PARAMETERSのWindowedメンバをFALSEにしてあげるだけ。
しかもDirectXのほうで画面出力の解像度の変更までしてくれるんですね。なんという良心設計。
アサート
これで済むところを、わざわざライブラリでラッピングします。
#includevoid Hoge( int *p )
{
assert( p );// p == 0で止まる
*p = 100;
}
この行為には意味はないですが、アサートの種類を増やす必要が出てくると思うのでこうしてます。
#ifdef _DEBUG
#define LIB_ASSERT(exp) assert(exp)
#else
#define LIB_ASSERT(exp) ((void)0)
#endif /* _DEBUG */void Hoge( int *p )
{
LIB_ASSERT( p );
*p = 100;
}
たとえばLIB_ASSERT_MAXMINというのを定義します。
Hogeに渡す値が0以上sizeof(i)/sizeof(int)以下(9以下)でなければアサート停止します。
ライブラリ側
#include#ifdef _DEBUG
#define LIB_ASSERT_MAXMIN( val, max, min ) assert( ( (val)<=(max) ) && ( (val)>=(min) ) )
#else
#define LIB_ASSERT_MAXMIN( val, max, min ) ((void)0)
#endif /* _DEBUG */ソース側
int Hoge( int index )
{
int i[] = {0,1,2,3,-1,2,3};
LIB_ASSERT_MAXMIN( index, 0, sizeof(i)/sizeof(int) );
return i[index];
}
つまりi[]を参照するindexの値を保障するということです。
というわけで、そろそろプリミティブかテクスチャかモデルかなんか表示できそうです。