读书人

LPDIRECT3DDEVICE9初始化为0x00000000

发布时间: 2012-03-11 18:15:38 作者: rapoo

LPDIRECT3DDEVICE9初始化为0x00000000的问题
小弟在创—3D的时候遇到一个问题,问题是这样的:

在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

读书人网 >网络游戏

热点推荐