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

Шрифт
Интервал

стр.

Чтобы не было видно, как перерисовывается графика, все отображаемые объекты выводят сперва в невидимой области видеопамяти, так называемой back buffer (задний буфер). После того, как кадр полностью прорисован, его копируют в видимую область памяти — front buffer или render target. Если приложение отображает графику на весь экран, то в копировании нет необходимости, достаточно просто говорить Direct3D какая часть видеопамяти является видимой, то есть просто переключать (flip) видимость с одного буфера на другой. Ясно, что если мы выводим графику в окно, то мы можем пользоваться только копированием back buffer'а в front buffer. Поле SwapEffect мы выставим в значение d3dswapeffect_discard чтобы наиболее эффективно представить back buffer для отображения.

BackBufferFormat — ещё одно поле структуры D3DPRESENT_PARAMETERS, которое нам необходимо задать, чтобы сказать Direct3D, какого формата будет back buffer. Пусть наше приложение, для простоты, будет выводить графику в окно. Формат back buffer'а должен совпадать с форматом front buffer'а, который в свою очередь в нашем случае совпадает с текущим форматом desktop'а. Его же мы можем получить методом интерфейса объекта d3d GetAdapterDisplayMode(), указав в качестве первого параметра D3DADAPTER_DEFAULT.

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

>// функция Init создаёт объекты d3d и d3d device

>bool Init(HWND hWnd) {

> if (pD3d = Direct3DCreate8(D3D_SDK_VERSION)) {

>  D3DDISPLAYMODE d3ddm; // отсюда нам нужно поле Format

>  if (FAILED(pD3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)))

>   return false;

>  D3DPRESENT_PARAMETERS d3dpp;

>  ZeroMemory(&d3dpp, sizeof(d3dpp)); // выставляем в 0 все поля d3dpp

>  d3dpp.Windowed = TRUE;

>  d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;

>  d3dpp.BackBufferFormat = d3ddm.Format;

>  if (FAILED(pD3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDevice))) {

>   return false;

>  }

>  return true;

> }

> returnfalse;

>}

Здесь pD3d — объект d3d, объявленный как

>IDirect3D8 * pD3d;

а pDevice — указатель на интерфейс device'а

>IDirect3DDevice8 * pDevice;

В методе CreateDevice() вторым параметром мы задали D3DDEVTYPE_HAL. Это означает, что мы пытаемся создать устройство просчёта, поддерживаемое hardware.

Таким образом, если наша функция Init() вернула значение true, означает, что инициализация прошла успешно. После этого мы можем выводить графику средствами DirectX. Об этом мы поговорим во второй части урока. Единственное, что осталось добавить к выше сказанному, раз уж мы научились создавать объекты, нужно не забывать их удалять. Объекты DirectX являются обычными COM объектами. После того, как мы закончили ими пользоваться, необходимо вызвать методы Release(), для каждого из этих объектов:

>// функция ReleaseAll освобождает объекты d3d device и d3d

>void ReleaseAll() {

> // Освобождаются в обратном порядке создания

> if (pDevice) pDevice->Release();

> if (pD3d) pD3d->Release();

>}

Поведал: Ваткин.

Первые шаги под DirectX 8. (Часть 2)

Автор: Сергей Ваткин.

Попробуем вывести простейший объект в нашем приложении. Любой трехмерный объект, который может вывести DirectX, является полигональной моделью. То есть любой объект состоит из некоторого количества треугольников. Треугольники задаются своими вершинами. Вершины, в свою очередь, могут иметь какие-то координаты, цвет, текстурные координаты и т.д. Вершины могут быть разных типов, например, если мы не используем текстурирование, зачем нам задавать текстурные координаты. Зададим самый простой формат вершины. У вершины такого формата будут координаты положения в трёхмерном пространстве и цвет:

>#define D3DFVF_MYVERT (D3DFVF_XYZ | D3DFVF_DIFFUSE)

Структура данных для такой вершины будет выглядеть следующим образом:

>struct MyVert{

> float x, y, z; // координаты

> DWORD Color; // диффузный цвет

>};

Цвет вершины задаётся 32-х битовым целым числом. Для установки нужного цвета можно использовать макроподстановку D3DCOLOR_XRGB(r,g,b), где r,g и b — составляющие компоненты цвета, соответственно красная, зелёная и синяя, могут принимать целые значения от 0 до 255-ти.


стр.

Похожие книги