DirectX 8. Начинаем работу с DirectX Graphics [Сергей Ваткин] (fb2) читать постранично
[Настройки текста] [Cбросить фильтры]
- 1
- 2
- 3
- . . .
- последняя (25) »
GameDev.ru
DirectX 8: Начинаем работу с DirectX Graphics
(пример написан на основе первого "родного" туториала к DirectX SDK 8.0) Ну, наконец-то мы дошли до самой сути, а именно - до начала работы непосредственно с DirectX! Сейчас напишем вместе прогу, которая создаст класс, окошко, инициализирует объекты Direct3D и… в итоге у нас получится — сами увидите что :-) Советую СКАЧАТЬ ПРИМЕР в архиве и читать дальше, имея исходники перед глазами. Чтобы открыть пример, необходимо сначала разархивировать его в отдельную директорию, затем нажать File->Open Workspace и открыть файл "D3D Init.dsw" из этой директории. Ну… поехали. Сначала необходимо написать include'ы, описать глобальные переменные, которые мы будем использовать в программе, а также объявить прототипы функций: //Включаем все функции, необходимые для работы с D3D. //<windows.h> уже включен в этом файле #include <d3d8.h> #include <stdio.h> //В дальнейшем нам понадобится функция sprintf() LPDIRECT3D8 g_pD3D = NULL; //Понадобится нам, чтобы создать D3DDeviceАвтор: voxatu
//Это наше устройство rendering'а (Rendering Device) LPDIRECT3DDEVICE8 g_pd3dDevice = NULL; WNDCLASSEX wclass; //Объявляем прототипы функций VOID Init(HWND); //Инициализация D3D VOID Render(); //Рендеринг сцены VOID Sweep(); //Очистка после выполнения программы //Обработка сообщений, поступивших окну LRESULT CALLBACK MessageProc(HWND, UINT, WPARAM, LPARAM); Что же такое Render? "Render" с английского переводится как: "переводить", "просчитывать", "визуализировать". Все объекты, которые находятся на нашей виртуальной сцене, хранятся в памяти в виде отдельных блоков: источники света, каркас, состоящий из вершин (точка в 3-D пространстве), текстуры, и т.д. Но видеокарта не может все это показать на экране, т.к. может вывести только последовательность разноцветных точек. Rendering Device как раз и выполняет эту функцию, т.е. преобразует всю нашу сцену в "понятный" для видеокарты вид. В своих статьях я не буду переводить некоторые английские термины на русский язык, а буду их "руссифицировать" (например, я не буду переводить "rendering device", как "делательное устройство" или "устройство просчёта", а буду просто говорить "устройство рендеринга" или вообще "девайс для рендеринга" (всякое может случиться %) )). Дело не в том, что я не могу подобрать тому или иному английскому термину русский эквивалент. Просто иногда лучше пользоваться "родными" названиями (мы же не называем "Visual C" Визульным Си =-)). Едем дальше… В нашей программе будет пять функций: функция WinMain(), Init(), Render(), Sweep() и функция обработки сообщений MessageProc(). Каждая функция представляет собой некий блок программы, который выполняет исключительно свою операцию. Например Init() будет инициализировать Direct3D (в дальнейшем, просто D3D), Render() — рендерить сцену, а Sweep() — производить очистку после выполнения программы. Я постарался, как можно больше упростить программу, поэтому урезал некоторые моменты (например, обработку ошибок, которые могут возникнуть при инициализации). В последующих программах мы будем стараться "честно" учитывать все возможные ошибки и обрабатывать их. Итак, рассмотрим подробнее, что же делают наши функции.
Функция WinMain()
Самая главная функция. Именно с нее начинается выполнение любой программы, написанной под Windows. В нашем случае она делает вот что: Описываем переменные. HWND hWnd; //Handle окна MSG msg; Затем идет настройка параметров класса, регистрация класса в системе и создание окна, представляющего этот класс. //Настраиваем параметры класса wclass перед его регистрацией в системе wclass.cbSize=sizeof(wndclassex); wclass.style=CS_DBLCLKS; wclass.lpfnWndProc=&MessageProc; //Функция обрабатывающая сообщения wclass.cbClsExtra=0; wclass.cbWndExtra=0; wclass.hInstance=hInst; wclass.hIcon=LoadIcon(NULL, IDI_APPLICATION); wclass.hCursor=LoadCursor(NULL, IDC_ARROW); wclass.hbrBackground=GetSysColorBrush(COLOR_APPWORKSPACE); wclass.lpszMenuName=NULL; wclass.lpszClassName="InitClass"; wclass.hIconSm=NULL;//Выходим, если не удалось зарегистрировать класс if (!RegisterClassEx(&wclass)) return 0; //Теперь создадим окно и занесем его handle в hWnd hWnd = CreateWindow("InitClass", "D3D Init", WS_SYSMENU|WS_OVERLAPPED|WS_MINIMIZEBOX, 100, 100, 420, 300, NULL, NULL, hInst, NULL); Подробное описание структуры WNDCLASSEX и параметров функции CreateWindow() смотри в статье JM'а "Введение в программирование под Windows". Стоит обратить внимание на то, что мы после всех манипуляций будем иметь в hWnd дескриптор окна, в котором затем сможем отображать нашу сцену. Теперь обратимся к функции инициализации D3D: Init(hWnd); Остается только показать на экране наше окно ShowWindow(hWnd, nCmdShow); //Рисуем окошко UpdateWindow(hWnd); и организовать цикл обработки сообщений окну while (GetMessage(&msg, NULL, 0, 0)) //Цикл обработки сообщений { TranslateMessage(&msg); DispatchMessage(&msg); } return (msg.wParam);
Функция Init()
Теперь, когда у нас есть окно, мы готовы к инициализации объекта Direct3D. Зачем он нужен? Как только будет создан объект Direct3D, мы сможем использовать метод IDirect3D8::CreateDevice() для создания устройства- 1
- 2
- 3
- . . .
- последняя (25) »
Последние комментарии
18 часов 41 минут назад
20 часов 58 минут назад
1 день 11 часов назад
1 день 11 часов назад
1 день 16 часов назад
1 день 20 часов назад