Введение в Direct3D8 | страница 5



>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-буфер, цветовой формат буфера такой же как у экрана.

• Устройство создано для использования в оконном режиме. Весь рендеринг будет направлен на окно m_hwndRenderTarget. Эта переменная соотвествует окну нашего вида C3DGraphFrame. Антиподом оконному режиму служит полноэкранный режим. Для работы с ним надо при создании устройства переменную Windowed установить в FALSE, а не в TRUE.

• Устройство имеет автоматически созданный depth-буфер, который иногда еще называют z-буфером. Формат z-буфера – 16 бит на точку. В наше время трудно (но, правда, можно) найти видеоадаптер, который не поддерживает такой формат z-буфера. Z-буфер используется вычислительным ядром Direct3D для хранения информации о текущей z-координате каждой точки картинной плоскости. В конечном счете это используется для удаления невидимых линий и поверхностей.

• 3D устройство должно использовать все возможности аппаратуры. Если какое-либо требуемое свойство не поддерживается, Direct3D попытается эмулировать его на программном уровне. Вы можете поменять тип устройства с D3DDEVTYPE_HAL на D3DDEVTYPE_REF. В этом случае все вычисления будут проводиться на программном уровне. Такая эмуляция является очень медленной, и не все на свете можно эмулировать.