创建Direct3D9设备的最小代码

时间:2011-01-23 15:11:37

标签: visual-c++ directx direct3d direct3d9

这不适用于稳定的发布代码,我只需要在我的开发PC上从HWND获得一个在C ++应用程序中创建的窗口化D3D9设备,用于测试某些内容......它可以默认加载选项。

我试图从一个旧的D3D8课程中一起攻击它,但我得到的是D3DERR_INVALIDCALL。

基本上我现在有这个:

    HWND mHWnd = ...;
    LPDIRECT3D9 mpD3D = Direct3DCreate9(D3D_SDK_VERSION);

    D3DPRESENT_PARAMETERS md3dpp;
    ZeroMemory( &md3dpp, sizeof(D3DPRESENT_PARAMETERS) );
    md3dpp.Windowed                 = true;
    md3dpp.SwapEffect               = D3DSWAPEFFECT_DISCARD;
    md3dpp.BackBufferCount          = 1;
    md3dpp.EnableAutoDepthStencil   = 0;
    md3dpp.hDeviceWindow            = mHWnd;
    md3dpp.BackBufferWidth          = 0;
    md3dpp.BackBufferHeight         = 0;
    md3dpp.FullScreen_RefreshRateInHz = 0;
    md3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
    md3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
    md3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
    md3dpp.MultiSampleQuality = 0;

    LPDIRECT3DDEVICE9 mpD3DDevice=0;
    HRESULT hr = mpD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,mHWnd,0,&md3dpp,&mpD3DDevice);

我认为一些D3DPRESENT_PARAMETERS选项可能是罪魁祸首 - 我不关心z缓冲区或模板或AA的后台缓冲区,任何旧的普通设备都可以。

我是否将一些不兼容的标志复制粘贴在一起?

1 个答案:

答案 0 :(得分:1)

1问题是你需要设置一些行为标志。

来自CreateDevice.上的文档:

  

BehaviorFlags [in]
   DWORD
   结合控制设备创建的 一个或更多选项。有关更多信息,请参阅D3DCREATE。

来自D3DCREATE文档:

  

D3DCREATE_HARDWARE_VERTEXPROCESSING,D3DCREATE_MIXED_VERTEXPROCESSING和D3DCREATE_SOFTWARE_VERTEXPROCESSING是互斥的标志。 调用CreateDevice时必须至少指定一个这些顶点处理标志。

尝试:

HRESULT hr = mpD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,mHWnd,D3DCREATE_MIXED_VERTEXPROCESSING,&md3dpp,&mpD3DDevice);