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

Урок 1. Простейшее приложение DirectX11

В этом уроке вы узнаете: как установить среду разработки для DirectX; как создавать окно; как инициализировать DirectX и получать доступ к интерфейсу Direct3Ddevice11; как отобразить наше первое окно DirectX.

Установка среды разработки DirectX11

Для того, чтобы работать с DirectX, необходимо иметь минимальные базовые навыки программирования под Windows. Более того, нужно быть неплохим программистом под Windows и хорошо знать C++, чтобы освоить DirectX и уже иметь определенный опыт написания программ под эту операционную систему. Для разработки подойдет компилятор MicrosoftVisualStudio2010. В наших примерах мы будем пользоваться MicrosoftDirectXSDK, этот SDK свободно распространяется Microsoft, так что вы легко сможете его найти в Интернете. После установки SDK в ProgramFiles вы найдете папку MicrosoftDirectX SDK. Для того, чтобы работать с нашими примерами, загрузите архив с примером, расположенный тут. Затем распакуйте папку с примером в любое место.  Откройте VisualC++  и загрузите в него проект. Вы также можете создать новый проект VisualC++ на основе одних файлов .cpp. О том как это сделать, будет сказано в конце этого урока. Сейчас же разберем наш пример простейшего приложения.

Архитектура нашей программы

Наше приложение Direct3D как и последующие приложения будет иметь следующую архитектуру: Для каждой отдельной операции мы будем использовать функцию. Большинство из этих функций будут вызываться из WinMain, некоторые из MsgProc. В наших примерах мы будем рассматривать отдельно каждую функцию и её содержимое.

Главная функция приложения: WinMain

Каждое приложение Windows должно иметь функцию WinMain. Мы будем использовать эту функцию с той-же целью, что и всегда – как главную функцию программы. Рассмотрим исходный текст нашей функции WinMain:

int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow )

{

UNREFERENCED_PARAMETER( hPrevInstance );

UNREFERENCED_PARAMETER( lpCmdLine );

 

if( FAILED( InitWindow( hInstance, nCmdShow ) ) )

        return 0;

if( FAILED( InitDevice() ) )

{

        CleanupDevice();

        return 0;

}

 

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

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;

}

Первое что нужно сделать, это создать главное окно программы. Мы просто сделаем вызов функции InitWindow и создадим окно. В следующих разделах этой статьи мы ознакомимся более детально со всеми функциями, которые мы вызываем из WinMain. Следующая операция – это инициализация устройства: InitDevice. В этой функции мы установим глобальные переменные а также инициализируем объекты, и наконец – в этой функции уже включится наш видеоускоритель. В данном примере мы не будем рассматривать функцию

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

Инициализация окна:InitWindow

Итак, откройте исходный текст нашего первого приложения и найдите функцию InitWindow. Эта функция просто создает окно для нашей программы. Не забываем, что так как мы пользуемся функциями Windows, то мы должны сделать в начале программы #include . Эта строка подключит необходимые функции из Windows API

Внутри функции InitWindow существует два основных вызова – это регистрация класса окна:

if( !RegisterClassEx( &wcex ) )        return E_FAIL;

И создание окна:

g_hInst = hInstance;

RECT rc = { 0, 0, 640, 480 };

AdjustWindowRect( &rc, WS_OVERLAPPEDWINDOW, FALSE );

g_hWnd = CreateWindow( LWCaption,LWName , WS_OVERLAPPEDWINDOW,

                           CW_USEDEFAULT, CW_USEDEFAULT, rc.right - rc.left, rc.bottom -                  rc.top, NULL, NULL, hInstance,NULL );

Обратите внимание, что при создании окна мы можем указать различные параметры, в том числе его размер.

Глобальные переменные

Для того, чтобы приложение функционировало, нужно объявить типы объектов и переменные для их хранения, так что в начале программы (сразу после #include)

вы видите глобальные переменные:

HINSTANCE               g_hInst = NULL;

HWND                    g_hWnd = NULL;

D3D_DRIVER_TYPE         g_driverType = D3D_DRIVER_TYPE_NULL;

ID3D11Device*           g_pd3dDevice = NULL;

ID3D11DeviceContext*    g_pImmediateContext = NULL;

IDXGISwapChain*         g_pSwapChain = NULL;

ID3D11RenderTargetView* g_pRenderTargetView = NULL;

Первые две строки нужны для хранения указателя на экземпляр окна. Дальнейшие переменные, которые мы заполним уже в следующем разделе относятся к Direct3D. Это –главный объект, через который мы будем обращаться к устройству Direct3D — g_pd3dDevice, а также второй главный наследуемый объект g_pImmediateContext. Также мы видим здесь объект для цепочки-обмена и рендер–таргет, то есть поверхности для рендеринга. В следующем разделе мы познакомимся поближе с этими объектами и их назначением.

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