ここから本文です

DirectX9で初期化できない

lon********さん

2011/7/1721:26:01

DirectX9で初期化できない

3Dゲームを作りたいと思い、DirectX9シェーダプログラミングという本を参考にしながら勉強しているのですが、初期化のところで詰まってしまいました。調べてみたらCreateDeviceが、D3DERR_INVALIDCALLを返していることがわかりました。サンプルと比べてみても、同じようには見えるのですが。。。以下初期化のところ(とグローバル変数の宣言)のソースです。よろしくお願いします。

LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pD3DDev = NULL;

HRESULT Init3D(HWND hwnd)
{
g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
if(NULL == g_pD3D) return E_FAIL;

D3DDISPLAYMODE d3ddm;
if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm))) return E_FAIL;

D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp , sizeof(D3DPRESENT_PARAMETERS));
d3dpp.BackBufferFormat = d3ddm.Format;
d3dpp.BackBufferCount = 1;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.Windowed = TRUE;

HRESULT hr = g_pD3D->CreateDevice(D3DADAPTER_DEFAULT , D3DDEVTYPE_HAL , hwnd ,D3DCREATE_SOFTWARE_VERTEXPROCESSING , &d3dpp , &g_pD3DDev);
if(FAILED(hr))
{
if(hr == D3DERR_OUTOFVIDEOMEMORY)
MessageBox(hwnd, TEXT("D3DERR_OUTOFVIDEOMEMORY"), TEXT("error"), MB_OK);
else if(hr == D3DERR_INVALIDCALL)
MessageBox(hwnd, TEXT("D3DERR_INVALIDCALL"), TEXT("error"), MB_OK);
else if(hr == D3DERR_NOTAVAILABLE)
MessageBox(hwnd, TEXT("D3DERR_NOTAVAILABLE"), TEXT("error"), MB_OK);
return E_FAIL;
}
return S_OK;
}

閲覧数:
2,215
回答数:
1
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

chi********さん

2011/7/1812:16:21

D3DERR_INVALIDCALL とは、メソッドの呼び出しが無効であるという意味で
例として”メソッドのパラメータに無効な値が設定されている場合など”です
コードを読んだ限りでは D3DPRESENT_PARAMETERS の設定が気になります

コードを解析するのは相当面倒なので、
普段、私が使っている Direct3D の初期化コードをお渡しします
エラートラップなどは作っておらず、動けば何でも良いという考えで書いているため
不足分は自分で修正してください
(VisualC、DirectX9で作成)

#include <windows.h>
#include <d3d9.h>
#include <d3dx9.h>

#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"dxguid.lib")
#pragma comment(lib,"winmm.lib")

LRESULT CALLBACK WindowProc(HWND,UINT,WPARAM,LPARAM);
bool end=FALSE;

INT WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,INT)
{
WNDCLASS wc;
ZeroMemory(&wc,sizeof(WNDCLASS));
wc.lpszClassName="BASE";
wc.lpfnWndProc=WindowProc;
wc.hbrBackground=(HBRUSH)COLOR_WINDOW;
RegisterClass(&wc);

HWND hWnd=CreateWindow("BASE","CAPTION",WS_SYSMENU|WS_VISIBLE,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,NULL,NULL);

LPDIRECT3D9 lpD3D9=Direct3DCreate9(D3D_SDK_VERSION);
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(D3DPRESENT_PARAMETERS));
d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;
d3dpp.SwapEffect=D3DSWAPEFFECT_FLIP;
d3dpp.Windowed=TRUE;
d3dpp.EnableAutoDepthStencil=TRUE;
d3dpp.AutoDepthStencilFormat=D3DFMT_D16;
LPDIRECT3DDEVICE9 lpD3DDEV9=NULL;
lpD3D9->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&lpD3DDEV9);

MSG msg;
while(end==FALSE)
{
if(PeekMessage(&msg,hWnd,0,0,PM_REMOVE)!=0)
{
DispatchMessage(&msg);
}
else
{
lpD3DDEV9->Clear(0,NULL,D3DCLEAR_ZBUFFER|D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1,0);
lpD3DDEV9->BeginScene();

lpD3DDEV9->EndScene();
lpD3DDEV9->Present(NULL,NULL,NULL,NULL);
}
}
return msg.wParam;
}
LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_CLOSE:
end=TRUE;
break;
}
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}

質問した人からのコメント

2011/7/20 21:42:14

間違ってるところを探すのをあきらめて写させてもらうことにしました。回答ありがとうございます。

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる