Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
DirectX.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.15 Mб
Скачать

Отображение сцены:Render

Теперь нужно что-нибудь отобразить в нашем окне. Функция Render обычно вызывается в играх несколько десятков раз в секунду. Но нам не нужно заботится о том, чтобы устанавливать конкретные цифры. Функция g_pSwapChain::Present

сама вносит необходимую задержку, в соответствии с тем, какую частоту мы поставили в предыдущем разделе в структуре sd. Так что мы будем просто вызывать Render так часто, как получиться, а задержка выставиться автоматически. Рассмотримфункцию:

void Render()

{

// Очистка рендер-таргета

float ClearColor[4] = { 0.0f, 0.9f, 0.5f, 1.0f }; // цвет

g_pImmediateContext->ClearRenderTargetView( g_pRenderTargetView, ClearColor );

 

// Рендер

 

// Вывод на экран содержимого рендер-таргета

g_pSwapChain->Present( 0, 0 );

}

В нашей функции Render мы сначала очищаем рендер-таргет, затем рисуем на нем, — об том как это делать – в дальнеших уроках, — а затем выведем изображение на экран. В данном примере мы просто заполняем рендер-таргет зеленым цветом и сразу-же выводим изобажение на экран. Обратите внимение, что функции g_pSwapChain::Present не передаются никакие параметры о том, какой рендер-таргет нужно выводить на экран. В функцииInitDevice мы уже дали знать Direct3D какойрендер-таргет мы используем для рисования. Так что все операции рисования, сколько бы их не было Direct3D будет осуществлять на один раз установленном в начале RenderTarget — е.

Цикл обработки сообщений

Итак, возвратимся на некоторое время к функции WinMain. Каждое приложение Windows имеет так называемый цикл обработки сообщений. В этом цикле мы должны получить сообщения от системы Windows. В идеале конечно мы могли бы просто запускать в цикле функцию Render для отрисовки всего что будет происходить в окне несколько десятков раз в секунду, не заботясь об остальном. Однако нужно еще и перехватывать сообщения от мыши и клавиатуры, да и собственно если нажата кнопка закрытия окна – это нужно тоже как-то обрабатывать. Так что для этих целей нужен цикл обработки сообщений.

// Цикл обработки сообщений

MSG msg = {0};

while( WM_QUIT != msg.message )

{

        if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )

        {

            TranslateMessage( &msg );

            DispatchMessage( &msg );

        }

        else

        {

            Render();

        }

}

CleanupDevice();

return ( int )msg.wParam;

}

На этом функция WinMain завершена. Обратите внимание, что внутри цикла выполняется функция Render, что не удивительно, так как периодически нужно перерисовывать динамически изменяющуюся в играх сцену. Цикл обработки сообщений завершается тогда когда поступает сообщение WM_QUIT, прерывающий цикл. Функция WinMain завершается и также завершается программа и закрывается окно.

Очистка объектов:CleanupDevice

Когда окно закрывается, нужно очистить все ранее инициализированные объекты Direct3D. Для этого предназначена небольшая функция очистки, вызываемая из MsgProc. То есть, когда приходит сообщение о закрытии окна (а также когда приходят и другие особщения) Windows вызывает MsgProc, и если окно закрывается, то мы делаем из MsgProc очистку объектов и завершение приложения.

void CleanupDevice()

{

    if( g_pImmediateContext ) g_pImmediateContext->ClearState();

    if( g_pRenderTargetView ) g_pRenderTargetView->Release();

    if( g_pSwapChain ) g_pSwapChain->Release();

    if( g_pImmediateContext ) g_pImmediateContext->Release();

    if( g_pd3dDevice ) g_pd3dDevice->Release();

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]