LPDIRECT3DDEVICE9初始化为0x00000000的有关问题
LPDIRECT3DDEVICE9初始化为0x00000000的问题
小弟在创建D3D的时候遇到一个问题,问题是这样的:
在m_d3d->CreateDevice这一步发现:
m_device:0x00000000
__vfptr = CXX0030: 错误: 无法计算表达式的值
m_device是一个LPDIRECT3DDEVICE9的对象.
感觉可能是HWND,D3DPRESENT_PARAMETERS的问题,排查过了都没发觉有问题,实在找不到原因了.特来请教大侠.
代码如下:
感激~
------解决方案--------------------
为什么要根据MultiSampleType来确定使用D3DDEVTYPE_HAL还是D3DDEVTYPE_REF呢?
如果显卡不支持你查询的MultiSampleType类型,你就会要求建立一个D3DDEVTYPE_REF类型的设备,但是你前面又设定了D3DCREATE_HARDWARE_VERTEXPROCESSING|D3DCREATE_PUREDEVICE,那就冲突了吧?
------解决方案--------------------
HRESULT hr = m_d3d->CreateDevice(D3DADAPTER_DEFAULT,MultisampleDevtype, m_hwnd, ddselect,&d3dpp, &m_device);
看看返回的错误是啥
另外在DirectX contral pannel(开始菜单里有)里选择Use Debug Version of Direct3D 9, Debug Output Level选择More, 然后你可以看VC的output窗口是输出什么信息
另外如果对d3d不是很熟悉的话,建议不要用 pure device
------解决方案--------------------
create设备都失败了,看来是create之前代码有什么问题
------解决方案--------------------
继续检查D3DPRESENT_PARAMETERS
小弟在创建D3D的时候遇到一个问题,问题是这样的:
在m_d3d->CreateDevice这一步发现:
m_device:0x00000000
__vfptr = CXX0030: 错误: 无法计算表达式的值
m_device是一个LPDIRECT3DDEVICE9的对象.
感觉可能是HWND,D3DPRESENT_PARAMETERS的问题,排查过了都没发觉有问题,实在找不到原因了.特来请教大侠.
代码如下:
- C/C++ code
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; }
感激~
------解决方案--------------------
为什么要根据MultiSampleType来确定使用D3DDEVTYPE_HAL还是D3DDEVTYPE_REF呢?
如果显卡不支持你查询的MultiSampleType类型,你就会要求建立一个D3DDEVTYPE_REF类型的设备,但是你前面又设定了D3DCREATE_HARDWARE_VERTEXPROCESSING|D3DCREATE_PUREDEVICE,那就冲突了吧?
------解决方案--------------------
HRESULT hr = m_d3d->CreateDevice(D3DADAPTER_DEFAULT,MultisampleDevtype, m_hwnd, ddselect,&d3dpp, &m_device);
看看返回的错误是啥
另外在DirectX contral pannel(开始菜单里有)里选择Use Debug Version of Direct3D 9, Debug Output Level选择More, 然后你可以看VC的output窗口是输出什么信息
另外如果对d3d不是很熟悉的话,建议不要用 pure device
------解决方案--------------------
create设备都失败了,看来是create之前代码有什么问题
------解决方案--------------------
继续检查D3DPRESENT_PARAMETERS