• 3D текстурирование. Очень забавная и гибкая вещь, позволяющая делать поистине впечатляющие вещи: можно натянуть любое изображение на любой 3D объект.
• За деталями упомянутого и всего остального – добро пожаловать в DirectX 8.0a SDK.
С чего начать?
Работа с любой новой средой разработки или библиотекой начинается, как правило, с одного и того же вопроса: "Боже мой! Ну почему оно не компилируется???!!!". Для успешной компиляции Direct3D8 проекта Вам необходимо включить некоторые заголовочные файлы и скомпоновать Вашу программу с соотвествующими lib-файлами. Наиболее важными являются 2 заголовочных и 2 lib-файла:
• d3d8.h – Файл с определениями основных интерфейсов, констант и тому подобного.
• d3d8.lib – Файл для компоновки Вашей программы с динамической библиотекой Direct3D8.
• d3dx8.h – Вспомогательные интерфейсы и определения, несколько облегчающие жизнь среднестатистическому программисту.
• d3dx8.lib – Библиотека для компоновки программы с d3dx8.dll.
Среди файлов демо-проекта вы увидите 2 файла: D3D8Include.h и D3DX8Include.h. Просто включите их в файл stdafx.h Вашего проекта. Тем самым будут включены все необходимые header-файлы и обеспечена компоновка с соотвествующими lib-файлами.
Ну вот, вроде бы все готово к бою и что же теперь? Первым делом необходимо создать IDirect3D8 объект. Не совсем, правда, грамотно звучит. Правильнее было бы сказать, "необходимо создать некий объект, который выставляет интерфейс IDirect3D8", но, думаю, Вы мне простите подобные вольности. Объект IDirect3D8 обеспечивает создание 3D устройств, получение информации о возможностях устройства, перечисление видеорежимов адаптера и получение подробной информации о них, в общем, кучу всего интересного и нужного. Мой демо-проект для создания этого нужного объекта использует класс-обертку CD3D8Application. Для его использования надо просто унаследовать от него класс приложения и в какой-нибудь функции инициализации (например, в OnInitDialog) вызвать метод CD3D8Application::Direct3DInitOK() для проверки результата создания объекта. Объект IDirect3D8 создается в конструкторе класса CD3D8Application с помощью вызова функции Direct3DCreate8(). Замечательная функция в том плане, что принимает только один параметр, да и тот просто обязан быть D3D_SDK_VERSION. Таким образом, создание требуемого объекта сводится к следующему:
pDirect3DObject = Direct3DCreate8(D3D_SDK_VERSION);
if (!pDirect3DObject) {
// Do something!!! Error occured!!!
}
После создание объекта IDirect3D8 мы должны создать еще что-то, на чем мы будем рисовать. Это "что-то" называется IDirect3DDevice8 и мы можем его создать с помощью метода IDirect3D8::CreateDevice(). В демо-проекте эта функция вызывается из C3DGraphic::Create() следующим образом:
D3DDISPLAYMODE theDisplayMode;
hr = m_p3DApplication->m_pDirect3DObject->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &theDisplayMode);
if (FAILED(hr)) {
return hr;
}
D3DPRESENT_PARAMETERS thePresentParams;
ZeroMemory(&thePresentParams, sizeof(thePresentParams));
thePresentParams.Windowed = TRUE;
thePresentParams.SwapEffect = D3DSWAPEFFECT_DISCARD;
thePresentParams.BackBufferFormat = theDisplayMode.Format;
thePresentParams.EnableAutoDepthStencil = TRUE;
thePresentParams.AutoDepthStencilFormat = D3DFMT_D16;
hr = m_p3DApplication->m_pDirect3DObject->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
m_hwndRenderTarget, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &thePresentParams, &m_p3DDevice);
if (FAILED(hr)) {
return hr;
}
Только что мы создали 3D устройство, задав при этом кучу параметров. Несколько комментариев и разъяснений, что есть что:
• 3D устройство было создано для видеоадаптера, используемого по умолчанию. Об этом говорит параметр D3DADAPTER_DEFAULT. Средний житель России имеет от 0 до 1 видеоадаптеров, так что особых проблем с этим параметром возникнуть не должно.
• Созданное устройство имеет один back-буфер, цветовой формат буфера такой же как у экрана.