Алгоритм функции DX3DInit
Создание интерфейса устройства и инициализация дисплея.
Установка метода показа.
Инициализация Direct3D и запуска графической системы
Три общих этапа инициализации и запуска графической системы:
1. Запрос указателя на интерфейс IDirect3D9. Этот интерфейс применяется для получения информации об установленных в компьютере устройствах и создания интерфейса IDirect3DDevice9, являющимся нашим объектом C++, представляющим аппаратные устройства, используемые для вывода трехмерной графики.
#include "dxfunc.h" // Функция инициализации Direct3DHRESULT DX3DInit(IDirect3D9 **ppiD3D9, IDirect3DDevice9 **ppiD3DDevice9, HWND hWnd, DWORD iWidth, DWORD iHeight, BOOL bFullScreen){ // Инициализация if((*ppiD3D9 = Direct3DCreate9(D3D_SDK_VERSION)) == NULL) return E_FAIL; // Заполняем основные параметры D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.BackBufferWidth = iWidth; d3dpp.BackBufferHeight = iHeight; // Запрос на отображение в полноэкранном режиме int iRes; if (!bFullScreen) iRes=MessageBox(hWnd, _T("Use fullscreen mode?"), _T("Screen"), MB_YESNO | MB_ICONQUESTION); else iRes = IDYES; if(iRes == IDYES) { ////////////////////////////////////////////////////////// // Полноэкранный режим ////////////////////////////////////////////////////////// // Установка параметров полноэкранного режима d3dpp.BackBufferFormat = D3DFMT_R5G6B5; d3dpp.SwapEffect = D3DSWAPEFFECT_FLIP; d3dpp.Windowed = FALSE; d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; } else { ////////////////////////////////////////////////////////// // Оконный режим ////////////////////////////////////////////////////////// RECT wndRect; RECT clientRect; GetWindowRect(hWnd, &wndRect); GetClientRect(hWnd, &clientRect); int iWinWidth = iWidth + (wndRect.right-wndRect.left) - (clientRect.right-clientRect.left); int iWinHeight = iHeight + (wndRect.bottom-wndRect.top) – (clientRect.bottom-clientRect.top); MoveWindow(hWnd, wndRect.left, wndRect.top, iWinWidth, iWinHeight, TRUE); // Получить формат пикселя D3DDISPLAYMODE d3ddm; (*ppiD3D9)->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm); // Установка параметров d3dpp.BackBufferFormat = d3ddm.Format; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.Windowed = TRUE; } // Создать 3D устройство DWORD Flags= D3DCREATE_MIXED_VERTEXPROCESSING | D3DCREATE_MULTITHREADED; HRESULT hRes; if(FAILED(hRes = (*ppiD3D9)->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, Flags, &d3dpp, ppiD3DDevice9))) return hRes; // Установить перспективу float Aspect = (float)d3dpp.BackBufferWidth / (float)d3dpp.BackBufferHeight; D3DXMATRIX matProjection; D3DXMatrixPerspectiveFovLH(&matProjection, D3DX_PI/4.0f, Aspect, 10.0f, 1000.0f); (*ppiD3DDevice9)->SetTransform(D3DTS_PROJECTION, &matProjection); return S_OK;}
1) Запрос указателя на интерфейс IDirect3D9.
Создаем экземпляр интерфейса IDirect3D9 с помощью функции Direct3DCreate9 и сохраняем результат в переменной *ppiD3D9:
if((*ppiD3D9 = Direct3DCreate9(D3D_SDK_VERSION)) == NULL) return E_FAIL;
Единственным аргументом этой функции должна быть константа D3D_SDK_VERSION, указывающая используемую версию SDK. Возвращаемая переменная — это указатель на созданный объект IDirect3D9, или, если при создании объекта Direct3D произошла ошибка, будет возвращен NULL.
Объект IDirect3D9 используется для двух вещей: перечисления устройств и создания объекта IDirect3DDevice9. Перечисление устройств подразумевает определение возможностей, видеорежимов, форматов и другой информации о каждой установленной в системе видеокарте.