Выбрать главу

 a. Project->Settings…

 b. Вкладка "Link"

 c. В строке "Object/library modules" добавь в начало "d3d8.lib d3dx8.lib"

 d. Должно получиться примерно следующее: "d3d8.lib d3dx8.lib kernel32.lib user32.lib gdi32.lib…"

2. Программе необходим файл texture.jpg — он должен лежать в той же директории, что и exe'шник.

Полезные статьи:

Автор: voxatu.

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

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

Первым делом вам нужно убедиться, что на вашей машине установлен компилятор C++ и DirectX8 SDK. Если у вас нет DirectX8 SDK, его можно скачать с сайта Microsoft, учтите только, что скачиваемый файл занимает примерно 140 Мб.

Дальше необходимо немного подстроить вашу среду разработки, а именно указать рабочие пути к DirectX, то есть к заголовочным файлам (.h — файлам) и файлам статических библиотек (.lib). Например, В Visual C++ это делается следующим образом. Меню Tools/Options вызывает диалоговое окно Options. В нем выбираем закладку Directories и выбираем из списка Show directories for сперва Include files для пути к заголовочным файлам, затем добавляем путь (папка Include в каталоге, куда установлен DirectX SDK) и выставляем его, нажимая на иконку "стрелочка вверх", в первую позицию. Аналогично и для пути к библиотечным файлам, выбираем из списка Show directories for пункт Library files и добавляем путь к библиотечным файлам (директория LIB в каталоге DirectX SDK).

Теперь попробуем написать простейшую программу, инициализирующую DirectX. Для этого познакомимся с некоторыми интерфейсами Direct3D и их методами.

Для создания объекта d3d используется функция Direct3DCreate8():

pD3D = Direct3DCreate8(D3D_SDK_VERSION);

здесь pD3D — указатель на интерфейс IDirect3D8, D3D_SDK_VERSION объявлено в d3d8.h.

Файл d3d8.h содержит объявления функций, работающих с Direct3D. Поэтому его необходимо включить в свой код директивой препроцессора:

#include <d3d8.h>

Функция Direct3DCreate8() возвращает указатель на созданный объект d3d. Если она вернула значение NULL, то это означает, что ваша программа не может инициализировать DirectX8. В этом случае ваша программа должна закончить своё выполнение.

Компонент, который занимается просчётом объектов на экран в Direct3D, называется Direct3D device. Он также включает в себя и сохраняет установки, касающиеся просчёта, занимается операциями трансформации, освещения и растеризацией. Метод CreateDevice() интерфейса объекта d3d создаёт такой device. Одним из параметров этого метода является объект структурного типа D3DPRESENT_PARAMETERS. Для ознакомления с Direct3D, мы не будем углубляться в значения всех полей этой структуры. Скажем только про те, которые нам сейчас понадобятся. Поле Windowed отвечает за то, будет ли графика отображаться на весь экран или в окне; значение может быть соответственно FALSE или TRUE.

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