LPDIRECT3DDEVICE9初始化为0x00000000的问题
小弟在创建D3D的时候遇到一个问题,问题是这样的:
在m_d3d->CreateDevice这一步发现:
m_device:0x00000000
__vfptr = CXX0030: 错误: 无法计算表达式的值
m_device是一个LPDIRECT3DDEVICE9的对象.
感觉可能是HWND,D3DPRESENT_PARAMETERS的问题,排查过了都没发觉有问题,实在找不到原因了.特来请教大侠.
代码如下:
HRESULT CGame::InitDXDevice(bool blFullScreen,bool onoffStencil,int MultiSampleType,UINT GameWidth,UINT GameHeight){ m_d3d=Direct3DCreate9(D3D_SDK_VERSION); m_d3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&mode); m_d3d->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL, &caps); DWORD ddselect = 0; if(caps.VertexProcessingCaps != 0) ddselect = D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE; else ddselect = D3DCREATE_SOFTWARE_VERTEXPROCESSING; d3dpp.BackBufferWidth=GameWidth; d3dpp.BackBufferHeight=GameHeight; d3dpp.BackBufferFormat=D3DFMT_X8R8G8B8; d3dpp.BackBufferCount=1; d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD; d3dpp.hDeviceWindow=m_hwnd; if (blFullScreen==true) { d3dpp.Windowed=false; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; }else { d3dpp.Windowed=true; d3dpp.FullScreen_RefreshRateInHz = mode.RefreshRate; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; } if (onoffStencil) { d3dpp.EnableAutoDepthStencil=true; }else d3dpp.EnableAutoDepthStencil=false; d3dpp.AutoDepthStencilFormat=D3DFMT_D16; GetMultiSampleType(MultiSampleType); D3DDEVTYPE MultisampleDevtype=(D3DDEVTYPE )-1; DWORD numq=0; if( SUCCEEDED(m_d3d->CheckDeviceMultiSampleType(D3DADAPTER_DEFAULT,D3DDEVTYPE_REF ,D3DFMT_X8R8G8B8, d3dpp.Windowed, d3dpp.MultiSampleType, &numq ) ) ) { MultisampleDevtype=D3DDEVTYPE_REF; } if( SUCCEEDED(m_d3d->CheckDeviceMultiSampleType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL , D3DFMT_X8R8G8B8, d3dpp.Windowed, d3dpp.MultiSampleType, NULL ) ) ) { MultisampleDevtype=D3DDEVTYPE_HAL; } if(MultisampleDevtype==(D3DDEVTYPE )-1) return E_FAIL; m_d3d->CreateDevice(D3DADAPTER_DEFAULT,MultisampleDevtype, m_hwnd, ddselect,&d3dpp, &m_device); m_device->SetRenderState(D3DRS_LIGHTING, FALSE); m_device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); SetProjMatrix(D3DX_PI / 4, 0.1f, 1000); SetView(D3DXVECTOR3(0.0f,0.0f,-10.0f),D3DXVECTOR3(0.0f,0.0f,0.0f),D3DXVECTOR3(0.0f,1.0f,0.0f)); return S_OK;}