DirectX 8. Начинаем работу с DirectX Graphics

Поздняков Константин

Поздняков Константин - DirectX 8. Начинаем работу с DirectX Graphics скачать книгу бесплатно в формате fb2, epub, html, txt или читать онлайн
Размер шрифта
A   A+   A++
Читать
Cкачать

GameDev.ru

DirectX 8: Начинаем работу с DirectX Graphics

Автор: voxatu

(пример написан на основе первого "родного" туториала к 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

//Это наше устройство 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 для создания устройства Direct3D (предварительно настроив его параметры), т.е. нашего устройства рендеринга. Параметры устройства задаются непосредственно перед его созданием с помощью структуры D3DPRESENT_PARAMETERS, и передаются в метод IDirect3D8::CreateDevice. Рассмотрим этот процесс подробнее. Итак, создаем объект Direct3D:

g_pD3D=Direct3DCreate8(D3D_SDK_VERSION);

Единственным параметром функции Direct3DCreate8 является UINT SDKVersion, который должен быть D3D_SDK_VERSION. Это необходимо для того, чтобы при компиляции программы были использованы правильные заголовочные файлы [*.h] (замечание: если после создания объекта были подключены новые адаптеры, необходимо повторно инициализировать объект Direct3D, чтобы использовать их). Если в процессе инициализации произошла ошибка, то Direct3DCreate8 возвращает NULL (т.е. пустой указатель).

Скачать книгуЧитать книгу

Предложения

Фэнтези

На страница нашего сайта Fantasy Read FanRead.Ru Вы найдете кучу интересных книг по фэнтези, фантастике и ужасам.

Скачать книгу

Книги собраны из открытых источников
в интернете. Все книги бесплатны! Вы можете скачивать книги только в ознакомительных целях.