Введение в 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. В этом случае все вычисления будут проводиться на программном уровне. Такая эмуляция является очень медленной, и не все на свете можно эмулировать.