DirectXを使った描画がうまくいかない

[戻る]
佐藤 2008/12/15(月) 23:11:58
初めまして。佐藤と申します。


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;
            }
        }
    }
}

//-----------------------------------------------------

たいちう 2008/12/16(火) 13:31:03
解決に結びつくかどうかわかりませんがヒントだけ。

開発環境では正しく表示されているのですよね?
真っ先に疑うべきは自分の書いたコードなので、
これが開発環境では、たまたま正しく表示されているだけ
という可能性があります。

信頼できるサンプルコードをそのままコンパイルしたものが、
開発環境と友人PCとで正しく表示できるかどうかを確認しましょう。


設定上の問題か、プログラム上の問題かは別として、
怪しい部分だけでも関数の戻り値をチェックしましょう。
例えば、3つのCreateDevice()について、友人PCでは何回目が成功しているか、
知っていますか?

開発環境では起こらないバグの追跡のためには、MessageBoxの表示や
ログファイルへの出力が、デバッグの常套手段です。

gak 2008/12/16(火) 17:06:25
情報が少なすぎるが、それでも原因を想像するならば
・VRAM不足でテクスチャ/サーフェイス等の作成に失敗してる(本命)
・グラフィックボードの性能不足 or ドライバ更新してなくてバグ持ち状態(穴)
って辺りを俺は疑う。

とりあえず、たいちうさんも言っているように各関数の成否、エラー時のエラーコードを
厳密にチェックしてみたら。関数が成功する前提でソース組んでる箇所とかあるんじゃない?
(テクスチャ/サーフェイス作成部分があるならソコを特に。どっかで
D3DERR_OUTOFVIDEOMEMORY が返ってる気がする)

佐藤 2008/12/16(火) 22:36:30
たいちろうさま、gakさま


返信ありがとうございます。
原因が分からなかったのでとりあえず初期化コードだけ載せた次第であります。

友人PCで dxdiag から Direct3Dテストには成功していました。

>CreateDevice()が何回目で成功しているか?

HALモードのHARDWARE_VERTEXPROCESSING は失敗して
HALモードのSOFTWARE_VERTEXPROCESSING で成功しました。

お二方の助言を参考に調べてみます。
有難う御座いました。

佐藤 2008/12/16(火) 22:47:54
[[解決]]
d3dpp.BackBufferWidth    = 960;
d3dpp.BackBufferHeight    = 544;

上記を追加したら無事動きました。
皆様ありがとうございました。

古いスレッドには追加発言できません。