Библиотеки GDI оказывают огромную помощь в создании красочного окна приложения. Перья, кисти, регионы, битовые массивы... Можно не заботиться о совместимости кода с аппаратными средствами компьютера. Но в большинстве случаев можно создавать только статические и плоские изображения. Динамичные же сцены или попытка создать объемные изображения омрачает своей медлительностью и сложностью.
Вот здесь и приходит на помощь DirectX. Библиотеке DirectX подвластны реалистичные объемные изображения. Графические сущности 3D визуализации схожи с реальным окружающим миром : 3D среда, мировое пространство, трехмерное пространство. На плоском мониторе DirectX творит чудеса, завораживающие своей реалистичностью. Плата за эту мощь - сложность настройки 3D среды и обеспечения устойчивости работы 3D рендеринга (передача, воспроизведение 3D сцены) при изменениях некоторых настроек приложения и операционной системы.
На устойчивость работы 3D приложения влияют внутренние и внешние факторы. Внутренние факторы зависят от корректности кода, внешние факторы в основном зависят от пользователя компьютера (и чем "чайней" пользователь, тем серьезней могут быть последствия их действий).
Внешние факторы влияющие на устойчивость работы 3D движка, рассмотренные в прилагаемом исходном коде, это:
Изменение размеров окна;
Изменение режима работы приложения (оконный, полноэкранный);
Изменение цветовой глубины пикселя монитора;
Переход в спящий/ждущий режим;
Обработка потери/восстановления фокуса приложением в полноэкранном режиме.
В Direct3D (визуальная часть библиотеки DirectX) есть такое понятие - потеря устройства. В нормальном состоянии рендеринг (показ 3D сцены) осуществляется без проблем. Но при возникновении событий выше перечисленных факторов, устройство Direct3D может быть потеряно. Потерянное состояние характеризуется тем, что функции, подготавливающие и осуществляющие рендеринг, возвращают код успеха, но при этом на экране не отображается 3D сцена. Определить это состояние помогает метод IDirect3DDevice9::Present. При потере устройства код его возврата равен D3DERR_DEVICELOST. Расшифровка кода возврата D3DERR_DEVICELOST - устройство было потеряно и рендеринг 3D сцены невозможен. Протестировать устройство Direct3D может быть восстановлено или нет можно с помощью метода IDirect3DDevice9::TestCooperativeLevel. При возврате кода равного D3DERR_DEVICENOTRESET появляется возможность восстановления устройства.
В случае изменения размеров окна рендеринга, показ 3D сцены не прекращается, но при изменении форматного отношения (ширины окна к высоте) искажаются геометрические пропорции объектов сцены. В данной ситуации необходим "принудительный" сброс устройства и восстановление объектов 3D сцены для сохранения правильных форм.
Представленный ниже исходник, с подробными комментариями, описывает выходы из состояния потери устройства Direct3D и сброс/восстановление объектов 3D сцены. На примере полета сквозь звезды шаг за шагом создается устойчивое 3D приложение с использованием MFC.
Исходник создан в среде программирования MS Visual Studio .NET 2003. SDK DirectX9.
Скачать исходник
Тема: «Простой 3D движок DirectX с помощью MFC»
initd3d_vs8.zip
Размер:191 КбайтЗагрузки:8188