|
|
初始化IDirect3DDevice9时
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = d3ddm.Format;
d3dpp.BackBufferCount = 1;
d3dpp.BackBufferHeight = 600;
d3dpp.BackBufferWidth = 800;
d3dpp.hDeviceWindow = g_hWnd;
result = g_pD3D->CreateDevice( D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
//D3DDEVTYPE_REF,//未通过改为D3DDEVTYPE_HAL
g_hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&g_pd3dDevice ) ;
屏幕设为24位色时,初始化IDirect3DDevice9失败,难道说24色下不能玩窗口模式的DX游戏?
屏幕位16位色时,初始化成功,
初始化IDirect3DSurface9时
g_pd3dDevice->CreateOffscreenPlainSurface(Width,
Height,
Format,
//D3DPOOL_DEFAULT,//未通过
D3DPOOL_SCRATCH,
&surface,
NULL) ;
为何使用D3DPOOL_DEFAULT无法通过,而使用D3DPOOL_SCRATCH却通过了呢?
DEFAULT不应该时系统默认设置是通用的吗?
最后在我要显示一副24位BITMAP时,(当时是16位色模式)却无法显示出来, StretchRect返回D3DERR_INVLIADCALL
result=g_pd3dDevice->StretchRect(g_psufBackground,
NULL,
backbuffer,
&dest,
D3DTEXF_NONE);
这是render函数主体
void render(D3DCOLOR Color)
{
g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,Color,1.0f,0);
result=g_pd3dDevice->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&backbuffer);
result=g_pd3dDevice->StretchRect(g_psufBackground,
NULL,
backbuffer,
NULL,
D3DTEXF_NONE);
//此处result返回D3DERR_INVLIDCALL
result=g_pd3dDevice-> resent(NULL,NULL,NULL,NULL);
}
不好意思,浪费空间了,所有代码如下,因为我实在无法断定问题出现在何处
#include <d3d9.h>
#include <d3dx9.h>
//#include <dxerr9.h>
#include <windows.h>
#include <string>
HINSTANCE g_hInst;
HWND g_hWnd;
bool g_Active;
LPDIRECT3D9 g_pD3D;
LPDIRECT3DDEVICE9 g_pd3dDevice;
LPDIRECT3DSURFACE9 g_psufBackground;
bool initWindow(HINSTANCE hInstance,int nShowCmd);
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
bool initDirect3D(void);
void render(D3DCOLOR);
void cleanUp(void);
bool D3DError(HRESULT result);
LPDIRECT3DSURFACE9 getSurfaceFromBitmap(std::string filename);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
if(!initWindow(hInstance,nShowCmd))
return false;
if(!initDirect3D())
return false;
MSG msg;
ZeroMemory(&msg,sizeof(msg));
g_Active=true;
g_psufBackground=getSurfaceFromBitmap("bg.bmp");
while(1)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if(msg.message==WM_QUIT)
{
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else if(g_Active)
{
render(D3DCOLOR_XRGB(0,0,255));
}
else
{
WaitMessage();
}
}
cleanUp();
return (int)msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
// case WM_CLOSE:
case WM_DESTROY:
PostQuitMessage(0);
// return 0;
break;
}
//always return default wndproc
return DefWindowProc(hWnd,message,wParam,lParam);
}
void render(D3DCOLOR Color)
{ HRESULT result;
RECT src;
RECT dest;
src.left=0;
src.top=0;
src.right=800;
src.bottom=600;
dest.left=0;
dest.right=800;
dest.top=0;
dest.bottom=600;
LPDIRECT3DSURFACE9 backbuffer=NULL;
if(NULL==g_pd3dDevice)
return;
g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,Color,1.0f,0);
result=g_pd3dDevice->GetBackBuffer(0,
0,
D3DBACKBUFFER_TYPE_MONO,
&backbuffer);
result=g_pd3dDevice->StretchRect(g_psufBackground,
NULL,
backbuffer,
&dest,
D3DTEXF_NONE);
//此处result返回D3DERR_INVLIDCALL
result=g_pd3dDevice->Present(NULL,NULL,NULL,NULL);
}
bool initDirect3D(void)
{
g_pD3D=NULL;
g_pd3dDevice=NULL;
//Create Direct3D Device
if(NULL==(g_pD3D = Direct3DCreate9(D3D_SDK_VERSION) ) )
return false;
D3DDISPLAYMODE d3ddm;
if( D3DError( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) )
return false;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = d3ddm.Format;
d3dpp.BackBufferCount = 1;
d3dpp.BackBufferHeight = 600;
d3dpp.BackBufferWidth = 800;
d3dpp.hDeviceWindow = g_hWnd;
HRESULT result;
result = g_pD3D->CreateDevice( D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
//D3DDEVTYPE_REF,
g_hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&g_pd3dDevice ) ;
//24位800x600模式下CreateDevice返回D3DERR_INVALIDCALL
//16位1024*768模式下通过
if(D3DError(result))
{
return false;
}
return true;
}
bool initWindow(HINSTANCE hInstance,int nShowCmd)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.lpfnWndProc = WNDPROC(WndProc);
wcex.style = CS_HREDRAW|CS_VREDRAW;
wcex.hInstance = hInstance;
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszClassName = "D3DShow";
wcex.hCursor = LoadCursor(NULL,IDC_ARROW);
wcex.lpszMenuName = NULL;
wcex.hIcon = LoadIcon(hInstance, NULL);
wcex.hIconSm = LoadIcon(hInstance, NULL);
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
RegisterClassEx(&wcex);
g_hWnd=CreateWindow(
"D3DShow",
"D3DShow",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
800,
600,
NULL,
NULL,
hInstance,
NULL
);
if(!g_hWnd)
return false;
ShowWindow(g_hWnd,nShowCmd/*SW_SHOW*/);
UpdateWindow(g_hWnd);
return true;
}
LPDIRECT3DSURFACE9 getSurfaceFromBitmap(std::string filename)
{
HRESULT result;
LPDIRECT3DSURFACE9 surface=NULL;
D3DXIMAGE_INFO imageinfo;
result=D3DXGetImageInfoFromFile(filename.c_str(),&imageinfo);
if (D3DError(result))
return NULL;
result= g_pd3dDevice->CreateOffscreenPlainSurface(imageinfo.Width,
imageinfo.Height,
imageinfo.Format,
//D3DFMT_X8R8G8B8,
//D3DPOOL_DEFAULT,//未通过
D3DPOOL_SCRATCH,
&surface,
NULL) ;
if (D3DError(result))
return NULL;
result = D3DXLoadSurfaceFromFile(surface,NULL, NULL, filename.c_str(), NULL, D3DX_DEFAULT, 0, NULL);
if (D3DError(result))
return NULL;
return surface;
}
void cleanUp(void)
{
if(g_pd3dDevice!=NULL)
g_pd3dDevice->Release();
if(g_pD3D!=NULL)
g_pD3D->Release();
}
bool D3DError(HRESULT result)
{
if(D3D_OK==result) return false;
LPCTSTR str;
// LPCTSTR str=DXGetErrorString9(result);
switch(result)
{
case D3DERR_INVALIDCALL:
str="One of the given parameters is invalid";
break;
case D3DERR_NOTAVAILABLE:
str="the Device doesn't support this call";
break;
case D3DERR_OUTOFVIDEOMEMORY:
str="The Video Memory haven't enough space to finish this call";
break;
default:
str="Direct3D Error";
}
MessageBox(g_hWnd,str,"DxError",MB_OK);
return true;
}
|
|