L"Чтобы исправить вызов CDXUTDialog::Init() первым. Смотрите комментарии для деталей."

После вызова функции обратного вызова DXUTCreateDevice() возвращается ошибка проверки DXUTgui.cpp. Assert говорит, что сначала вызывается CDXUTDialog::Init(), но куда мне его поместить в WinMain()?

1 ответ

Решение

Сравните ваш клиентский код DXUT с содержимым EmptyProject и SimpleSample- при условии, что вы используете DXUT11 из GitHub.

Типичным шаблоном является создание глобальной переменной для CDXUTDialogResourceManager, а затем позвоните CDXUTDialog::Init от InitApp прежде чем вы получите обратный звонок от DXUTCreateDevice

int WINAPI wWinMain( _In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow ) 
{ 
    // Enable run-time memory check for debug builds. 
#ifdef _DEBUG 
    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); 
#endif 


    // DXUT will create and use the best device 
    // that is available on the system depending on which D3D callbacks are set below 


    // Set DXUT callbacks 
    DXUTSetCallbackMsgProc( MsgProc ); 
    DXUTSetCallbackKeyboard( OnKeyboard ); 
    DXUTSetCallbackFrameMove( OnFrameMove ); 
    DXUTSetCallbackDeviceChanging( ModifyDeviceSettings ); 


    DXUTSetCallbackD3D11DeviceAcceptable( IsD3D11DeviceAcceptable ); 
    DXUTSetCallbackD3D11DeviceCreated( OnD3D11CreateDevice ); 
    DXUTSetCallbackD3D11SwapChainResized( OnD3D11ResizedSwapChain ); 
    DXUTSetCallbackD3D11SwapChainReleasing( OnD3D11ReleasingSwapChain ); 
    DXUTSetCallbackD3D11DeviceDestroyed( OnD3D11DestroyDevice ); 
    DXUTSetCallbackD3D11FrameRender( OnD3D11FrameRender ); 

    InitApp();  <-- // THIS IS WHERE DXUT GUI WIDGETS GET INITIALIZED, BEFORE THE WINDOW OR DEVICE IS CREATED
    DXUTInit( true, true, nullptr ); // Parse the command line, show msgboxes on error, no extra command line params 
    DXUTSetCursorSettings( true, true ); 
    DXUTCreateWindow( L"SimpleSample11" ); 


    // Only require 10-level hardware, change to D3D_FEATURE_LEVEL_11_0 to require 11-class hardware 
    // Switch to D3D_FEATURE_LEVEL_9_x for 10level9 hardware 
    DXUTCreateDevice( D3D_FEATURE_LEVEL_10_0, true, 800, 600 ); 


    DXUTMainLoop(); // Enter into the DXUT render loop 


    return DXUTGetExitCode(); 
} 

Начинать новый проект с использованием DXUT не рекомендуется. Он действительно предназначен только для поддержки существующего кода, который имеет зависимости от DXUT, при удалении зависимостей от D3DX11 и другого устаревшего содержимого DirectX SDK. Подавляющее большинство функциональных возможностей DXUT полностью излишни для большинства приложений. Это также глючит и действительно предназначено только для образцов.

Другие вопросы по тегам