DirectX 8. Начинаем работу с DirectX Graphics (Ваткин, Dempski) - страница 16

Чтобы не было видно, как перерисовывается графика, все отображаемые объекты выводят сперва в невидимой области видеопамяти, так называемой 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(), для каждого из этих объектов: