Шаг 2 - Создание Direct3D в оконном режиме

Во-первых, нам нужно подключить библиотеки DirectX8, ниже следующий код ставим после подключения библиотеки windows.h:

#include <d3d8.h>
#pragma comment (lib, "d3d8.lib")

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

LPDIRECT3D8 p_d3d = NULL;	// наш главный интерфейс d3d8
LPDIRECT3DDEVICE8 p_d3d_Device = NULL;	// наше устройство d3d8

Без указателя p_d3d у нас ничего не выйдет, он обязательно нужен, чтобы инициализировать Direct3d. Указатель p_d3d_Device нужен для работы с графикой.

В функцию AppInit, после строки UpdateWindow (hWnd); добавляем следующий код:

p_d3d = Direct3DCreate8 (D3D_SDK_VERSION);
	
D3DDISPLAYMODE d3ddm;
p_d3d->GetAdapterDisplayMode (D3DADAPTER_DEFAULT, &d3ddm);

D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory (&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = true;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = d3ddm.Format;

p_d3d->CreateDevice<&&/local&&> (<&&llink dxhelp 2&&>D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, 
	D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &p_d3d_Device);

Direct3DCreate8 создает объект Direct3D и присваивает адрес указателю p_d3d. Затем мы получаем режим адаптера, в котором он сейчас работает (Direct3D у нас создался) и заносим все его параметры в структуру d3ddm. Структура d3dpp содержит в себе параметры заднего буфера (т.е. та часть экрана, которую мы не видим, но увидим позже). При помощи функции ZeroMemory данный буфер заполняем нулями, чтобы в нем не было мусора. Если Windowed истинный (включен) то данное приложение воспринимать как оконное, если нет (false), то полноэкранным (им мы воспользуемся позже). D3DSWAPEFFECT_DISCARD говорит о том, что мы будем данному приложению сообщать о времени, когда можно использовать буфер для заполнения нашими параметрами. Строка d3dpp.BackBufferFormat = d3ddm.Format; в данном случае нужна, потому что у нас, как мы ранее поставили, оконный режим и должен соответствовать формату текущего показа. А далее создаем устройство при помощи функции CreateDevice принадлежащий главному интерфейсу. Параметр D3DADAPTER_DEFAULT говорит, что используется первичный адаптер. Второй параметр в качестве желательного устройства несет D3DDEVTYPE_HAL - используем ускоритель и программный эмулятор, в случае если ускоритель не поддерживает функций. D3DCREATE_SOFTWARE_VERTEXPROCESSING - определяет средства обработки вершин. Дальше присваиваем адрес буфера и адрес устройства представляемому устройству, который будет использовать эти структуры.

Ну вот, с инициализацией покончили, все назначили, а как мы назначили, так мы должны и удалить все это корректно, добавьте в функцию WinMain после всего цикла while:

DestroyDirect3D8 ();

Эту функцию писать нужно нам, т.к. Direct3D об этом не заботится и мы ее напишем, смотрите ниже:

//---------------------------
// Name: DestroyDirect3D8 ()
// Desc: 
//---------------------------
void DestroyDirect3D8 (void)
{
	_RELEASE_ (p_d3d_Device);
	_RELEASE_ (p_d3d);
};

Можете расположить после "функции показа и обновления окна" (забыли? см. "Шаг 1 - Инициализация оконного приложения", какая функция за это отвечает ;)

Подводим итоги: мы инициализировали DirectDraw и Direct3D одновременно, но на деле ничего не изменилось, все тоже окно, а столько кода написали... Но ничего, дальше мы начнем писать код, где наш глаз уже заметит изменения на мониторе ;)


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Хавов Евгений Валерьевич - 10.08.2002