Введение в Direct3D8
Версия текста: 1.0
Демонстрационное приложение (только .exe) (72 kb)
Демонстрационное приложение (исходный код) (44 kb)
Демонстрационное приложение
Компьютерная графика всегда была одним из самых интересных проявлений развития информационных технологий. Давным-давно, во времена текстовых терминалов никто даже и представить себе не мог, что пройдет совсем немного времени и образы фантастических монстров будут создаваться не с помощью папье-маше и пластилина, а прямо на экране компьютера. Это сейчас все привыкли к графическому интерфейсу, и изображением на экране уже никого не удивишь. На самом деле надо поставить памятник человеку, который впервые решил нарисовать картинку из текстовых символов – такого рода искусство было очень распространено в свое время, и его отголоски до сих пор встречаются в различного рода конференциях. История развития компьютерной графики интересна сама по себе и заслуживает отдельной книги, но данный документ имеет чисто технический характер, поэтому мы не будем останавливаться на этапах становления искусства рисования на экране монитора, а обратимся сразу к нашим дням. Стандартом де-факто на компьютерах под управлением операционной системы Windows стали две 3D библиотеки: OpenGL и Direct3D (часть библиотеки DirectX). OpenGL, разработанный фирмой Silicon Graphics, уже стал классикой и характеризуется своей устойчивостью и стабильностью интерфейсов. Напротив, Direct3D, детище Microsoft, постоянно изменяется, совершенствуется и двигается вперед. Последняя версия этого продукта имеет номер 8, и это не конец. В этой статье я бы хотел познакомить читателя с некоторыми аспектами использования этого нового продукта, указать на его отличия от предыдущей версии и продемонстрировать его использование для решения одной из весьма распространенных задач – построения графика функции двух переменных. Исходный код примера вы может получить с этого сайта и свободно использовать в своих приложениях.
DirectX 8.0a SDK можно найти здесь.
Англоязычную версию DirectX 8.0a Runtime for Windows 95, Windows 98, Windows 98 SE, Windows ME можно найти здесь.
Англоязычную версию DirectX 8.0a Runtime for Windows 2000 можно найти здесь.
Локализованные версии DirectX 8.0a Runtime расположены тут.
Перед тем как начать, хотелось бы еще сказать несколько слов по поводу терминологии, используемой в статье. Приведенная информация базируется в основном на документации от Microsoft, которая доступна пока (и похоже, что так будет всегда) исключительно на английском языке. Не то, что бы никто у нас не знает английского языка, но уж человеческая психика так устроена, что одни и те же термины все авторы переводят на русский по своему. Поэтому мной было принято решение: термины, по которым читатель скорее всего захочет узнать больше из официальной документации, оставлять на их родном языке. Так что не удивляйтесь, увидев термин "flip chain" вместо "последовательность отображения" или "цепочка переворота"… В некоторых случаях представлен перевод термина с указанием в скобках оригинального слова или выражения. Например: "матрица проектирования (projection matrix)".
Немного о демонстрационном приложении.
Любой автор статьи рано или поздно сталкивается с нелегким вопросом: какую среду разработки использовать для иллюстрирования излагаемого материала. Даже после выбора Visual C++ в качестве базы остается несколько альтернативных путей: уж больно много расплодилось различных библиотек и frameworks. Можно выделить 4 наиболее заметных (сразу же отмечу их недостатки и достоинства):
• Чистое API приложение. Небольшое по размеру получаемого исполняемого файла, теоретически легко переносимое. Исходный код, правда, компактностью не отличается…
• MFC приложение. Наиболее распространенный выбор. Сейчас уже трудно найти компьютер, на котором отсутствует mfc42.dll, хотя, распространяя приложение, вы должны предусмотреть все варианты. К недостаткам можно отнести некоторую угловатость и тяжеловесность исходников.
• WTL (Windows Template Library) приложение. Замечательная штука, но почему-то еще не все люди слышали о WTL, и, что еще более печально, не у всех она установлена.
И, наконец, ATL приложение. Наиболее любимый мною подход, пригодная (вопреки общему мнению) для создания практически любого Windows-приложения. К сожалению, мастер ATL из комплекта Visual C++6 не поддерживает генерацию не-COM приложения.
После долгих размышлений я остановился на последнем варианте. Как говорится, читателю все равно, а мне приятно. Шутка. На самом деле, я действительно считаю, что этот подход позволил мне сделать код максимально понятным, и человек, не измученный нарзаном в виде MFC, разберется там без особых проблем. Если вы ненавидите ATL – не читайте эту статью дальше. Чтобы внести некоторую ясность и определенность, спешу представить вашему вниманию диаграмму классов для демо-приложения. Выполнено в Rational Rose 2000 – нотация Буча.
Несколько комментариев по назначению реализованных классов:
• CMainDlg – Главный класс приложения. Унаследован от CDialogImpl и создается в функции WinMain как немодальный диалог. Содержит в себе один экземпляр класса C3DGraphic, один C3DGraphFrame, 4 немодальных диалога редактирования свойств (CMaterialPropsWindow, CLightPropsWindow, CBackColorWindow and CFunctionTypeWindow) и 3 объекта 3D функций (CSplashFunction, CPlaneFunction and CParabaloidFunction).
• CPropertyWindow – Базовый класс для всех окон редактирования свойств. Унаследован от CDialogImpl.
• C3DFunction – Базовый абстрактный класс, определяющий интерфейс получения информации о какой-либо функции 2-х переменных.
• CPropertyWindowNotify – Абстрактный класс-интерфейс, реализуемый клиентами окон свойств. Через этот интерфейс клиенты уведомляются об изменениях, происходящих со свойствами.
• CD3D8Application – Весьма простой класс-обертка для управления жизнью и смертью IDirect3D8 объекта.
• C3DGraphFrame – Окно, в котором будет отображаться результирующая 2D проекция трехмерного изображения. Говоря в терминах MFC, класс вида для трехмерного графика.
• C3DGraphic – Наиболее значимый и нагруженный класс, выполняющий всю основную работу по построению и обработке 3D картинки. Именно он реализует операции управления светом, свойствами материала, рендеринга и тому подобные. Собственно, ради него все и затевалось…
То ли Микеланджело, то ли еще кого-то из великих однажды спросили, как создать скульптуру. Великий, недолго думая, ответил: "Возьмите большой камень и удалите все лишнее." Окинув взглядом все вышеизложенное, можно сделать простой вывод: демо-приложение является ни чем иным, как обычным ATL EXE COM сервером, из исходного кода которого хитрой рукой автора было удалено все относящееся к COM технологии. Построение такого приложение само по себе является интересной задачей, но мы не скульпторы, так что подробности оставим в стороне. Тем более, что тема моей статьи все-таки DirectX, а не ATL. Вот сейчас – как раз об этом…
А что это за Direct3D8, и где оно живет???
Если вы когда-либо имели дело с предыдущими версиями DirectX, то Вас ждет очень интересное открытие: DirectDraw больше нет вообще!!! Microsoft в очередной раз решил обобщить все что можно, и теперь все относящееся к рисованию в DirectX представлено под одним общим заголовком DirectX Graphics. Все изменилось кардинальным образом по сравнению с DirectX7. Интерфейс IDirect3DDevice8, например, имеет 94 метода. Для сравнения, IDirect3DDevice7 позволял выполнить лишь 48 операций. Back-буферизация теперь поддерживается автоматически, без каких-либо усилий с Вашей стороны – не надо больше вручную создавать эти загадочные flip chains. Инициализация Direct3D стала простой как i++, и многие низкоуровневые детали теперь стали вообще недоступны программисту. Не всегда это здорово – например, теперь вы не можете рисовать что-либо непосредственно на primary surface. Более того, вы и читать то с нее ничего не можете. Точнее можете, но Microsoft не советует. От себя посоветую никогда не делать что-либо нерекомендованное Microsoft, а любопытных отсылаю к документации по методу IDirect3DDevice8::GetFrontBuffer. Впрочем, к вопросам совместимости Microsoft всегда относилась внимательно, и, установив DirectX8, Вы можете свободно работать и со всеми предыдущими версиями этого продукта.
А что же делать тем людям, которые никогда не имели дела с Direct3D вообще??? Специально для них я бы хотел вкратце обрисовать основное назначение этой библиотеки (предполагается, что Вы все же знакомы с теоретическими аспектами построения 3D моделей):
• Direct3D8 обеспечивает аппаратно-независимый путь доступа к возможностям видеооборудования, установленного на машине. Если запрошенные возможности не поддерживаются видеокартой, библиотека обеспечивает прозрачную эмуляцию. Эмуляция работает намного медленнее, да и не все эмулируется…
• Поддерживается стандартный конвейер 3D преобразований: матрица окружения (world matrix), матрица моделирования (view matrix) и матрица проектирования (projection matrix).