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.