2. Инициализация Direct3D

    Direct3D представляет собой API для отображения графики. Предположим, мы запустили некоторое приложение, которому необходимо выводить на экран графику, возможно трехмерную. Для этого оно, приложение, посредством некоторого набора интерфейсов, предоставляемых Direct3D, обращается к HAL. HAL (Hardware Abstraction Level), или уровень абстрагирования от аппаратуры - это особый код, включаемый производителями видеокарт в состав драйверов, который содержит описание всех возможностей, предоставляемых графическим адаптером.
    Использование возможностей, предоставляемых Direct3D, но не документированных в HAL, может привести к сбою в работе программы. Но, иногда требуется написать программу, которая, все же, использует неподдерживаемые возможности. В таких случаях, на помощь приходит устройство REF (Reference Rasterizer), которое программно эмулирует некоторые возможности (например, шейдерную обработку вершин). Однако, следует учитывать, что устройство REF работает крайне медленно, и предназначено только для разработчиков.
    Перейдем, собственно, к инициализации Direct3D. Первым делом, нужно получить указатель на объект IDirect3D9.

//Указатель на экземпляр интерфейса D3D
    IDirect3D9* pD3D;
    pD3D = Direct3DCreate9(D3D_SDK_VERSION);

    Как не трудно заметить, единственным параметром функции Direct3DCreate9 является константа D3D_SDK_VERSION, которая гарантирует использование правильных заголовочных файлов (хотя лично мне трудно представить, какие неправильные заголовочные файлы можно подключить). Объект IDirect3D9 необходим для создания объекта IDirect3DDevice9, а также для перечисления возможностей, поддерживемых видеокартой. Вот пример проверки одной из возможностей адаптера:

    pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);
    int vp = 0;
    if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
        vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
    else
        vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;

    Здесь мы заполняем структуру D3DCAPS9* caps и поверяем, поддерживает ли первичный видеоадаптер (D3DADAPTER_DEFAULT) аппаратную обработку вершин. После этого, нам нужно заполнить структуру D3DPRESENT_PARAMETERS, которая задает некоторые параметры визуализации.

    D3DPRESENT_PARAMETERS d3dpp = {0};
    d3dpp.BackBufferWidth = WindowWidth;
    d3dpp.BackBufferHeight = WindowHeight;
    d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
    d3dpp.BackBufferCount = 1;
    d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
    d3dpp.MultiSampleQuality = 0;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.hDeviceWindow = hWnd;
    d3dpp.Windowed = false;
    d3dpp.EnableAutoDepthStencil = true;
    d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
    d3dpp.Flags = 0;
    d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
    d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;

    Рассмотрим каждое поле в отдельности.
    BackBufferWidth, BackBufferHeight - задают размеры вторичного буфера в пикселях.
    BackBufferFormat - формат вторичного буфера.
    BackBufferCount - количество используемых вторичных буферов.
    MultiSampleType - тип множественной выборки.
    MultiSampleQuality - качество множественной выборки.
    SwapEffect - определяет, как будет осущесвлятся переключение внеэкранных буферов.
    hDeviceWindow - дескриптор окна, в которое будет выводиться графика.
    Windowed - задает полноэкранный или оконный режим.
    EnableAutoDepthStencil - задает автоматическое создание и поддержку буферов глубины и трафарета.
    AutoDepthStencilFormat - формат буферов глубины и трафарета.
    Flags - дополнительные флаги.
    FullScreen_RefreshRateInHz - частота кадров. D3DPRESENT_RATE_DEFAULT устанавливает частоту кадров по умолчанию.
    PresentationInterval - частота обновления окна.

    Для полной инициализации приложения осталось только создать объект IDirect3DDevice9.

    IDirect3DDevice9* pDevice;
-------------------------------------------------
    HRESULT hr;
    hr = pD3D->CreateDevice(
                D3DADAPTER_DEFAULT,
                D3DDEVTYPE_HAL,
                hWnd,
                D3DCREATE_HARDWARE_VERTEXPROCESSING,
                &d3dpp,
                &pDevice);
    if( FAILED(hr) || !pDevice)
        return false;

    Пример приложения: "Инициализация Direct3D"