先に学んだとおり、画像データはテクスチャとしてビデオ・メモリに読み込み、ポリゴンに貼り付けて描画を行う。DirectX Graphicsでは、アンチエリアスをかけた表示、透過表示、半透明など、テクスチャに対してさまざまな効果を簡単に付けることができる。
しかし、テクスチャ表示にはビデオカードごとに制限があり、自分の開発環境でできるからといってすべての環境でできるわけでないことを認識しておかなければならない。
ビデオカードによっては半透明描画が不可能なものもあるし、アンチエイリアスの効果も製品によって様々である。また、作成できるテクスチャのサイズも製品によって違う。
テクスチャサイズの制限を超えてしまうと、テクスチャがまったく表示されなくなってしまう。つまり、自分の環境ではゲームが動くのに、他の環境ではまったく動かないということがありうるのである。
今回は、自分の環境におけるテクスチャの最大サイズを調べてみる。
//-------------------------------------------------------------------------------------------------
// メイン関数(エントリーポイント)プログラムはここから始まる
//-------------------------------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszArgs, int nWinMode)
{
MSG msg; // メッセージ構造体変数
HRESULT hr;
D3DCAPS8 d3dCaps; // ハードウェア情報格納構造体
char buff[256]; // メッセージボックスで表示される内容
// 表示するウィンドウの定義、登録、表示
if (!InitApp(hThisInst, nWinMode)) // InitApp関数を呼び出し、
return (FALSE); // 正常に終了すれば次にメッセージループへ
// DirectX8の初期化
hr = InitDX8();
if ( FAILED(hr) ) return (FALSE);
// ハードウェア情報取得
gl_lpD3ddev->GetDeviceCaps(&d3dCaps);
// ハードウェア情報表示
wsprintf(buff, "%d * %d\n", d3dCaps.MaxTextureWidth, d3dCaps.MaxTextureHeight);
MessageBox(hWnd, buff, "最大テクスチャサイズ", MB_OK);
while ( TRUE ) {
// メッセージがあるかどうか
if ( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) ) {
// メッセージを取得し、WM_QUITかどうか
if ( !GetMessage(&msg, NULL, 0, 0) ) break;
TranslateMessage(&msg); //キーボード利用を可能にする
DispatchMessage(&msg); //制御をWindowsに戻す
} else if ( g_appActive ) {
// ゲームメイン処理
if ( FAILED( UpdateFrame() ) ) break;
Sleep(1);
} else {
WaitMessage();
}
}
// DirectX8オブジェクトの削除
ReleaseD3D();
return msg.wParam;
}
最近のビデオカードであれば、2048*2048以上の巨大なテクスチャ描画が可能であるが、古いビデオカード(Voodooなど)では256*256という小さなテクスチャしか描画できない。
そのことを考慮し、開発の段階である程度、実行する環境のターゲット(最低動作環境)をしぼらなければならない。
| BACK(1つの画像ファイルに複数の画像を載せるには?) | NEXT(練習問題) |