
- •Урок 1. Простейшее приложение DirectX11
- •Инициализация DirectX:InitDevice
- •Отображение сцены:Render
- •Цикл обработки сообщений
- •Очистка объектов:CleanupDevice
- •Цикл обработки сообщений
- •Обзор приложения
- •Дополнение к уроку. Настройка среды разработки
- •Заключение
- •Урок 2. Вывод 3d геометрии на экран в DirectX11
- •Обзор архитектуры для вывода геометрии в DirectX11
- •Инициализация геометрии: InitGeometry
- •Инициализация геометрии – создание вершин: InitGeometry
- •Создание буфера глубины: zBuffer
- •Отображение геометрии: Render
- •Обзор приложения
- •Обзор шейдера для нашего приложения
- •Заключение
- •Урок 3. Математические основы Direct3d
- •Знакомство с базовыми 3d представлениями данных
- •Норма вектора
- •Нормализованный вектор
- •Символические обозначения векторов
- •Преобразования матриц и операции с ними
- •Математические операции с матрицами
- •Единичная матрица
- •Модуль матрицы
- •Нормализованная матрица
- •Матрицы трансформаций
- •Матрицы, используемые в DirectX
- •Заключение
- •Урок 4. Установка матриц трансформаций и камеры в DirectX11
- •Урок 5. Процедурная генерация моделей для DirectX11
- •Процедурная генерация
- •Определение формата исходных данных
- •Обзор приложения
- •Заключение
- •Урок 6. Установка источников освещения DirectX11
- •Урок 7. Текстуры в Direct3d11
- •Урок 8. Загрузка мешей в DirectX11
- •Урок 9. Шейдеры в Direct3d11
- •Урок 10. Различные шейдеры DirectX11
- •Шейдеры
- •Шейдер для эффекта bump
- •Шейдер для эффекта металлической поверхности
- •Использование нескольких шейдеров в приложении
- •Обзор приложения
- •Заключение
Отображение сцены: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(); } |