Исходные коды программ и игр

Программирование - работа и хобби

Простой 3D движок DirectX с помощью MFC

Язык программирования C++

DirectX и GDI

вид 3D сцены приложенияБиблиотеки GDI оказывают огромную помощь в создании красочного окна приложения. Перья, кисти, регионы, битовые массивы... Можно не заботиться о совместимости кода с аппаратными средствами компьютера. Но в большинстве случаев можно создавать только статические и плоские изображения. Динамичные же сцены или попытка создать объемные изображения омрачает своей медлительностью и сложностью.

Вот здесь и приходит на помощь DirectX. Библиотеке DirectX подвластны реалистичные объемные изображения. Графические сущности 3D визуализации схожи с реальным окружающим миром : 3D среда, мировое пространство, трехмерное пространство. На плоском мониторе DirectX творит чудеса, завораживающие своей реалистичностью. Плата за эту мощь - сложность настройки 3D среды и обеспечения устойчивости работы 3D рендеринга (передача, воспроизведение 3D сцены) при изменениях некоторых настроек приложения и операционной системы.

Устойчивость 3D приложения

На устойчивость работы 3D приложения влияют внутренние и внешние факторы. Внутренние факторы зависят от корректности кода, внешние факторы в основном зависят от пользователя компьютера (и чем "чайней" пользователь, тем серьезней могут быть последствия их действий).

Внешние факторы влияющие на устойчивость работы 3D движка, рассмотренные в прилагаемом исходном коде, это:

  1. Изменение размеров окна;
  2. Изменение режима работы приложения (оконный, полноэкранный);
  3. Изменение цветовой глубины пикселя монитора;
  4. Переход в спящий/ждущий режим;
  5. Обработка потери/восстановления фокуса приложением в полноэкранном режиме.

Direct3D - потеря устройства

В Direct3D (визуальная часть библиотеки DirectX) есть такое понятие - потеря устройства. В нормальном состоянии рендеринг (показ 3D сцены) осуществляется без проблем. Но при возникновении событий выше перечисленных факторов, устройство Direct3D может быть потеряно. Потерянное состояние характеризуется тем, что функции, подготавливающие и осуществляющие рендеринг, возвращают код успеха, но при этом на экране не отображается 3D сцена. Определить это состояние помогает метод IDirect3DDevice9::Present. При потере устройства код его возврата равен D3DERR_DEVICELOST. Расшифровка кода возврата D3DERR_DEVICELOST - устройство было потеряно и рендеринг 3D сцены невозможен. Протестировать устройство Direct3D может быть восстановлено или нет можно с помощью метода IDirect3DDevice9::TestCooperativeLevel. При возврате кода равного D3DERR_DEVICENOTRESET появляется возможность восстановления устройства.

Принудительный сброс устройства Direct3D

В случае изменения размеров окна рендеринга, показ 3D сцены не прекращается, но при изменении форматного отношения (ширины окна к высоте) искажаются геометрические пропорции объектов сцены. В данной ситуации необходим "принудительный" сброс устройства и восстановление объектов 3D сцены для сохранения правильных форм.

Исходник на С++ устойчивого движка 3D приложения

Представленный ниже исходник, с подробными комментариями, описывает выходы из состояния потери устройства Direct3D и сброс/восстановление объектов 3D сцены. На примере полета сквозь звезды шаг за шагом создается устойчивое 3D приложение с использованием MFC.

Исходник создан в среде программирования MS Visual Studio .NET 2003. SDK DirectX9.

Файл: initd3d_vs8.zip
Размер: 191 Кбайт
Загрузки: 7302