Приложение MFC D3D: руководство по Direct3D часть I

ОГЛАВЛЕНИЕ

Новая среда разработки Direct3D, в этот раз для приложений MFC, с пошаговым руководством

·        Скачать исходные файлы - 58.6 Кб


Введение

 

Освоение Microsoft Direct3D – трудная задача для новичков в нем или в программировании 3D графики вообще. После того, как вы просмотрели примеры SDK, прочитали некоторые из руководств, опробовали некоторые из примеров кода и, наконец, решили, что вы хотите разработать свою программу или игровой движок с его использованием, вы остаетесь с вопросом, откуда начать. С этим я столкнулся около года назад, поэтому я углубился в изучение разбора программы примера применения каркаса. Я прочитал множество материалов, чтобы попытаться понять, что происходит (буквально) за кадром.

Все дело в том, что помощь SDK очень краткая, а форумы предназначены для опытных программистов графики. Более того, речь идет о версии 9 (фактически 10 в настоящее время), что означает, что технология существует уже более десятилетия. Складывается впечатление, что вся библиотека была разработана группой Direct3D для использования лишь ими самими. Но не отчаивайтесь: существует много руководств, и здесь еще одно. Прежде чем начать, рассмотрим управляемый и неуправляемый Direct3D – ради тех, кто все еще задается вопросом, что такое управляемый код. Можете сразу переходить к следующему разделу, чтобы дать делу ход!

Управляемый код против неуправляемого

Кроме различных версий, в настоящее время Direct3D существует в двух разных видах, а именно: управляемый и неуправляемый Direct3D. Неуправляемый Direct3D предназначен для программистов C++, не связанных со средой разработки .NET, напрямую обращающихся к центральному Direct3D API, и использующих служебную библиотеку расширений Direct3D (D3DX). Управляемый Direct3D – уровень абстракции для неуправляемого Direct3D, который преимущественно обеспечивает взаимно однозначное преобразование неуправляемых интерфейсов, структур и перечислений в управляемые классы, структуры и перечисления.

Здесь ваш второй шанс пропустить данный раздел, так как это все, что вам на самом деле нужно знать. Если вы все еще остаетесь здесь, то к вашему сведению, вся модель .NET работает вокруг управляемого кода. Это приводит к вопросу: "Что такое управляемый код?"

Управляемый код – код, выполнением которого управляет общеязыковая среда исполнения системы разработки .NET или CLR. Он относится к договору о сотрудничестве между выполняющимся в родном формате кодом и средой выполнения. Этот договор устанавливает, что в любой момент выполнения среда выполнения может остановиться и извлечь информацию, специфичную для текущего адреса команды центрального процессора, а именно – состояние времени выполнения, такое как содержимое регистров или стековой памяти.

Необходимая информация закодирована в промежуточном языке (IL) и наборе знаков, иначе называемых метаданными, описывающими все точки входа и конструкции (например, методы и свойства) и их характеристики. CLR – наиболее коммерчески успешная версия стандарта инфраструктуры общего языка (CLI), описывающего, как информация будет кодироваться, чтобы компилятор мог генерировать правильное кодирование. Эта система позволяет всем популярным языкам программирования - от COBOL до Camel, наряду с C#, J#, VB .Net, Jscript .Net и C++ от Microsoft – создавать управляемый код в виде файлов формата загружаемого кода (PE), содержащих IL и метаданные.

Перед выполнением кода, IL компилируется в родной исполняемый код компилятором, знающим о времени выполнения, который знает, как нацеливать управляемую среду выполнения. Это позволяет вставить ловушки и надлежащие зацепки сбора мусора, обрабатывать исключения, обеспечивать безопасность типов, проверять границы массивов и, наконец, дать гарантии относительно того, какой код будет работать. По сути, это устраняет целый набор ошибок программирования, часто приводящих к дырам в защите.

Напротив, неуправляемые исполняемые файлы, по сути, являются кодом исполняемой программы, загруженным в память. ОС знает о счетчике команд, и это все. Безусловно, действует защита вокруг управления памятью и ввода-вывода через порты и т.д., но система на самом деле не знает, что приложение делает. Поэтому она не может дать никаких гарантий относительно того, что произойдет, когда приложение запустится.

Так или иначе, данная статья рассматривает неуправляемый Direct3D, но большинство из рассмотренных концепций подходят также для управляемого Direct3D; они лишь обрабатываются по-разному.

Обратно к началу

Эта статья содержит заказную версию среды разработки Direct3D 9 SDK, в состав которой входит набор классов оберток, готовящих Direct3D к внедрению в приложение MFC (Фундаментальные классы Майкрософт), и определенное руководство по Direct3D для начинающих. Разумеется, вы должны знать C++ и программирование для Windows. Вы имеете право спросить, почему я решил изобрести велосипед. Во-первых, чтобы я мог понять его, во-вторых, потому что мне нравится добавлять комментарии, так как я сам начинаю понимать его, и, наконец, потому что я предпочитаю правильно структурировать код.

Еще один отказ и сведения об авторах: некоторые куски текста непосредственно скопированы из помощи SDK. Иногда вам не нужно быть кратким, как в следующем абзаце:

Чтобы использовать Direct3D, сначала вы создаете окно приложения, а затем создаете и инициализируете объекты Direct3D. Вы используете интерфейсы компонентной модели объектов (COM), которые эти объекты реализуют, чтобы управлять ими и создавать другие объекты, требуемые для отображения сцены. Приложения, написанные на C++, напрямую обращаются к этим интерфейсам и объектам. Нам нужно окно для отображения сцены и некоторое знание COM, но незначительный его объем. Окно может быть самым верхним окном для полноэкранного приложения, что является распространенным вариантом для игры. Это может быть элемент управления в диалоговом окне, для которого может быть получен дескриптор окна. Это имеет место для, скажем, редактора уровня, в котором вам нужна отрисовка геометрии уровня и множества элементов управления (то есть инструментов редактора). Приложенный демонстрационный проект предусматривает второй вариант, но за счет небольших дополнительных усилий его можно расширить до переключения режимов.

Для целей данной статьи приложенный пример – это приложение на основе форм архитектуры документ/вид MFC SDI (интерфейс одного документа), созданное с помощью мастера приложений Visual Studio C++ 6.0. Вы также можете создать приложение MDI (интерфейс множества документов) и использовать заголовки Direct3D и файлы CPP. Пример строит изображение в клиентской области элемента управления, принадлежащего виду. Первая интересная вещь, которую моя программа MFC делает как приложение Direct3D – порождает класс, наследуемый от классов CWnd и CXD3D:

class CD3DWnd : public CXD3D, public CWnd

Можно сказать, что CD3DWnd имеет мать и отца.