Directx api

Увага! Даний сайт не оновлюється. Нова версія: shatalov.su

Нарешті ми закінчили розгляд C ++ і створили заготовку програми використовує WinAPI. З сьогоднішнього дня ми приступаємо до другого етапу - до вивчення DirectX API (API - інтерфейс програмувати додатків), який надає DirectX SDK.

У найближчі місяці ми познайомимося з базовими можливостями DirectX API. Після цього вже можна буде спробувати зробити простеньку гру.

Хочу сказати відразу, то що ми будемо вивчати - не складно, а дуже дуже складно! Від вас буде потрібно надзвичайних зусиль. Доведеться добре попрацювати щоб все засвоїти. Але повірте, результат цього вартий!

DirectX заснований на моделі COM (C omponent O bject M odel - компонентна модель об'єктів). В COM все класи успадковують від одного базового класу IUnknown. У цього класу є три методи. Відповідно всі похідні класи (в тому числі і ті, які входять до складу DirectX API) успадковують можливості IUnknown. Ми поки будемо користуватися тільки одним методом цього класу Release. Цей метод звільняє пам'ять, яку займав ваш об'єкт. Наприклад, у нас є вказівник на об'єкт IDirect3D (це базовий клас Direct3D) - d3d. Щоб звільнити пам'ять, потрібно викликати метод Release:

Запам'ятайте: використовувати delete з об'єктами DirectX не можна !.

Ми не будемо поки детально зупинятися на COM. Створювати COM об'єкти досить складно. Але ось користуватися COM легко. Всі об'єкти DirectX є об'єктами COM.

Класи COM називаються інтерфейсами. Перед кожним ім'ям інтерфейсу стоїть буква I: IDirect3DDevice9, IDirect3DVertexBuffer9. Спочатку вам може здатися що інтерфейсів дуже багато. Але це не так. У Direct3D всього близько двадцяти інтерфейсів (класів).

Зауважте, що операція new не використовується при створенні об'єктів (екземплярів інтерфейсів). Справа в тому, що в базовому класі IUnknown є спеціальний метод, який дозволяє отримати будь-який інтерфейс COM. Як це відбувається, залишиться за рамками сьогоднішнього уроку. Взагалі кажучи, як такими можливостями COM ми користуватися не будемо (крім методу Release) - розробники DirectX API сховали все що пов'язано з COM, натомість надавши зручні методи інтерфейсів.

Ще дещо щодо імен інтерфейсів: в різних навчальних матеріалах вам може зустрітися такий код:

І так для кожного інтерфейсу. Всі три рядки роблять одне і те ж - створюють покажчик на IDirect3DVolumeTexture. Просто в двох останніх рядках використовується перевизначення IDirect3DVolumeTexture9 * за допомогою typedef. Ми завжди будемо користуватися першим варіантом.

І ще одне важливе зауваження: все інтерфейси (об'єкти) створюються як покажчики! Чому так, ми ще обговоримо.

DirectX 9 vs. DirectX 10 і DirectX 11

Ми будемо вивчати DirectX 9. У DirectX 10 і DirectX 11 дуже багато відмінностей. Там все влаштовано трошки по іншому. Десяту версію ми швидше за все взагалі не будемо вивчати. Можливо відразу перейдемо на 11. Чому ж все-таки ми будемо вивчати DirectX 9. Перше: DirectX 9 вже пройшов перевірку часом - 6 років це не жарти. Друге: більшість користувачів Windows досі використовує Windows XP, а з цієї операційної системи не вийде запустити програми створені за допомогою DirectX 10 і DirectX 11. І навпаки, в Windows Vista і Windows 7 можна запустити програми використовують DirectX 9.

З чого ж, з чого ж зроблений Direct3D

DirectX API складається з декількох частин. Зараз нас цікавить частина, яка відповідає за графіком. В DirectX за графіком відповідає Direct3D.

Модуль Direct3D відповідає в DirectX за тривимірну графіку. В DirectX немає модуля для виведення двомірної графіки. Двомірна графіка виводиться засобами Direct3D. Раніше існував окремими модуль DirectDraw. А в одинадцяту версію збираються включати його реінкарнацію Direct2D.

Інтерфейси. Як я вже писав вище, їх близько двадцяти штук. Інтерфейс - це звичайний клас. Ви не отримаєте доступ до даних інтерфейсів, але у кожного інтерфейсу є набір методів. Все взаємодія з DirectX відбувається за допомогою методів інтерфейсів.

Головним інтерфейсом Direct3D є IDirect3DDevice9. На основі цього інтерфейсу будується вся програма. У IDirect3DDevice9 більше ста методів. В інших інтерфейсах методів набагато менше. Буває по три методу.

Ще раз: інтерфейси - це звичайні класи з набором методів.

Наступна складова частина Direct3D - функції. Тобто ці функції не прив'язані ні до якого інтерфейсу. Функцій трохи - рівно чотири штуки.

Найголовніша функція - Direct3DCreate9. Ця функція дозволяє створити об'єкт IDirect3D9 (базовий інтерфейс, який починає запускати програму). Ця функція дозволяє не влазити у нутрощі COM. Якби її не було, то довелося б скористатися засобами COM для отримання інтерфейсу IDirect3D9.

Наступна частина - макроси. Макроси це такі функції, які визначені за допомогою define. наприклад:

Арканоід

Directx api

Камера
Directx api

клітини
Directx api

спрайт
Directx api