Исходные коды программ и игр
программируй и твори!

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

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

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

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

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


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

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

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

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

Файл исходникаКоличество загрузокРазмер
initd3d.rar4218175 КБ

<< Исходник карточной игры девятки на С++ вверх Исходный код программы расчета трансформатора >>
Дополнительные источники

CodingRUS.ru -
Delphi/C++/ Pascal/Basic/
Java/Assembler/ PHP/Perl

CodeNet - все для
программиста

 

Друзья сайта

Все для CS: Скачать карты для Counter-Strike Source

Яндекс цитирования Rambler's Top100