DirectXを使った描画がうまくいかない – プログラミング – Home

DirectXを使った描画がうまくいか...
 
通知
すべてクリア

[解決済] DirectXを使った描画がうまくいかない


佐藤
 佐藤
(@佐藤)
ゲスト
結合: 21年前
投稿: 19
Topic starter  

初めまして。佐藤と申します。

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

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


引用未解決
トピックタグ
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

解決に結びつくかどうかわかりませんがヒントだけ。

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

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

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

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


返信引用
gak
 gak
(@gak)
ゲスト
結合: 21年前
投稿: 132
 

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

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


返信引用
佐藤
 佐藤
(@佐藤)
ゲスト
結合: 21年前
投稿: 19
Topic starter  

たいちろうさま、gakさま

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

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

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

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

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


返信引用
佐藤
 佐藤
(@佐藤)
ゲスト
結合: 21年前
投稿: 19
Topic starter  

d3dpp.BackBufferWidth = 960;
d3dpp.BackBufferHeight = 544;

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました