Создание устройства трехмерной визуализации
Вы уже установили параметры отображения, так что настало время создать объект устройства IDirect3DDevice9. Он является основой для всех относящихся к визуализации вызовов и поэтому исключительно важен. Без этого маленького объекта вы ничего не сможете отобразить на экране. Для его создания применяется функция IDirect3D9::CreateDevice(). Вот как выглядит ее прототип:
HRESULT CreateDevice( UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviorFlags, D3DPRESENT_PARAMETERS *pPresentationParameters, IDirect3DDevice9 **ppReturnedDeviceInterface );Первый параметр, Adapter, содержит порядковый номер используемой видеокарты. Для большинства систем с одним монитором можно использовать значение D3DADAPTER_DEFAULT. Этот параметр работает точно так же как и первый параметр функции GetAdapterDisplayMode(), который я описал ранее.
Второй параметр, DeviceType, является перечислением, задающим тип устройства. Доступные типы перечислены в таблице 6.5. В данной программе я использую значение D3DDEVTYPE_HAL. Из-за этого программа может не работать с видеокартами, не поддерживающими аппаратное ускорение. В этом случае для того, чтобы программа запустилась попробуйте изменить значение этого параметра на D3DDEVTYPE_REF.
Таблица 6.5. Типы устройств | ||
Значение | Константа | Описание |
1 | D3DDEVTYPE_HAL | Визуализация выполняется аппаратурой видеокарты. Этот метод позволяет использовать преимущества доступных методов аппаратного ускорения. |
2 | D3DDEVTYPE_REF | Direct3D всю визуализацию выполняет программно. Это плохой выбор, если видеокарта поддерживает аппаратное ускорение. |
3 | D3DDEVTYPE_SW | Используется программное устройство визуализации, эмулирующее аппаратуру. |
Третий параметр, hFocusWindow, задает окно, которому будет принадлежать фокус системы визуализации DirectX. Для полноэкранного режима это должно быть окно самого верхнего уровня. В рассматриваемом примере я использую дескриптор окна, созданного в функции WinMain(). Это общепринятая практика для приложений, работающих в оконном режиме.
Четвертый параметр, BehaviorFlags, задает один или несколько флагов, определяющих параметры создаваемого устройства отображения. Доступные флаги перечислены в таблице 6.6.
Таблица 6.6. Флаги, задающие поведение устройства | |
Значение | Описание |
D3DCREATE_FPU_PRESERVE | Приложение требует вычислений с плавающей точкой двойной точности. |
D3DCREATE_MULTITHREADED | Direct3D будет работать в безопасном многопоточном режиме. Этот режим приводит к значительному падению производительности и должен применяться только в случае крайней необходимости. |
D3DCREATE_PUREDEVICE | Указывает, что устройство не поддерживает вызовы Get для использования в блоках состояния. Кроме того, устройство не будет поддерживать обработку вершин. Лично я никогда не использую этот флаг. |
D3DCREATE_HARDWARE_VERTEXPROCESSING | Обработка вершин производится аппаратурой видеокарты. Этот флаг используется в рассматриваемой программе. Если приложение на вашем компьютере не работает, попробуйте заменить его на следующее значение из спсика. |
D3DCREATE_SOFTWARE_VERTEXPROCESSING | Обработка вершин производится программно. Это значительно медленнее, чем аппаратная обработка. |
D3DCREATE_MIXED_VERTEXPROCESSING | Обработка вершин производится как аппаратурой, так и программно. Этот вариант может работать медленнее, чем чисто аппаратная обработка. |
D3DCREATE_DISABLE_DRIVER_MANAGEMENT | Устраняет драйвер видеокарты от управления ресурсами. Если флаг установлен, всеми ресурсами управляет Direct3D. |
D3DCREATE_ADAPTERGROUP_DEVICE | Используется, если одновременно работают несколько видеокарт. |
D3DCREATE_MANAGED | Передает вопросы управления памятью в ведение устройства. |
Пятый параметр, pPresentationParameters, задает параметры отображения для устройства. В рассматриваемом примере я использую указатель на инициализированную ранее структуру.
Последний параметр, ppReturnedDeviceInterface, содержит адрес указателя, который после завершения работы функции будет представлять созданное устройство. В этом параметре я передаю глобальный указатель на интерфейс IDirect3DDevice9 с именем g_pd3dDevice.
Если все прошло хорошо, функция создания устройства возвращает значение, свидетельствующее об успешном завершении, и программа продолжает работу, перейдя к настройке среды визуализации. В ином случае функция возвращает код ошибки и программа не может продолжать выполнение графических операций.