初めまして。佐藤と申します。
DirectXを使用したアプリを友人PCで実行したところ
プログラムは動いているのですが描画がうまくいきませんでした。
ざっとみた問題点
・画面が更新されない
・ポリゴンがでない
・スプライトのαがおかしい(pngを使用)
気になる点といえば、友人PCがノートでグラフィックがオンボードです。
DirectXの初期化コードを載せておきます。
何か解決策をご存知であればご教示願います。
簡単ではありますが宜しくお願いします。
開発環境
WindowsXP(SP3)、VisualStudio2005、DirectX9.0c
友人PC(ノート)
WindowsXP(SP3)、VisualStudio無、DirectX9.0c(Runtime入れました)
//---- 以下コード -----------------------------------------
// Direct3Dオブジェクトの取得
if( (mpD3d = Direct3DCreate9( D3D_SDK_VERSION )) == NULL )
{
return false;
}
// 現在のディスプレイモードを取得
D3DDISPLAYMODE dmode;
if( FAILED( mpD3d->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &dmode ) ) )
{
return false;
}
// バックサーフェースのフォーマットをコピーして使用する
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(D3DPRESENT_PARAMETERS) );
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = dmode.Format;
d3dpp.BackBufferCount = 1;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
// HALモード
if( FAILED( mpD3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &mpDevice ) ) )
{
if( FAILED( mpD3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &mpDevice ) ) )
{
// REFモード
if( FAILED( mpD3d->CreateDevice( D3DADAPTER_DEFAULT,
D3DDEVTYPE_REF, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp,
&mpDevice ) ) )
{
if( FAILED( mpD3d->CreateDevice(
D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &mpDevice ) ) )
{
return false;
}
}
}
}
//-----------------------------------------------------
解決に結びつくかどうかわかりませんがヒントだけ。
開発環境では正しく表示されているのですよね?
真っ先に疑うべきは自分の書いたコードなので、
これが開発環境では、たまたま正しく表示されているだけ
という可能性があります。
信頼できるサンプルコードをそのままコンパイルしたものが、
開発環境と友人PCとで正しく表示できるかどうかを確認しましょう。
設定上の問題か、プログラム上の問題かは別として、
怪しい部分だけでも関数の戻り値をチェックしましょう。
例えば、3つのCreateDevice()について、友人PCでは何回目が成功しているか、
知っていますか?
開発環境では起こらないバグの追跡のためには、MessageBoxの表示や
ログファイルへの出力が、デバッグの常套手段です。
情報が少なすぎるが、それでも原因を想像するならば
・VRAM不足でテクスチャ/サーフェイス等の作成に失敗してる(本命)
・グラフィックボードの性能不足 or ドライバ更新してなくてバグ持ち状態(穴)
って辺りを俺は疑う。
とりあえず、たいちうさんも言っているように各関数の成否、エラー時のエラーコードを
厳密にチェックしてみたら。関数が成功する前提でソース組んでる箇所とかあるんじゃない?
(テクスチャ/サーフェイス作成部分があるならソコを特に。どっかで
D3DERR_OUTOFVIDEOMEMORY が返ってる気がする)
たいちろうさま、gakさま
返信ありがとうございます。
原因が分からなかったのでとりあえず初期化コードだけ載せた次第であります。
友人PCで dxdiag から Direct3Dテストには成功していました。
>CreateDevice()が何回目で成功しているか?
HALモードのHARDWARE_VERTEXPROCESSING は失敗して
HALモードのSOFTWARE_VERTEXPROCESSING で成功しました。
お二方の助言を参考に調べてみます。
有難う御座いました。
d3dpp.BackBufferWidth = 960;
d3dpp.BackBufferHeight = 544;
上記を追加したら無事動きました。
皆様ありがとうございました。