Минимальный код для создания устройства Direct3D9 - PullRequest
1 голос
/ 23 января 2011

Это не для стабильного кода выпуска, мне просто нужно получить устройство D3D9 с окном, созданное в приложении C ++, из HWND на моем ПК разработчика для проверки чего-либо ... оно может использоваться по умолчанию при множестве опций.

Я пытался взломать его из старого класса 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 Ответ

1 голос
/ 25 января 2011

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);
...