Введение в программирование трехмерных игр с DX9

         

Anons


Аннотация

Книга «Введение в программирование трехмерных игр с DirectX 9.0» представляет собой введение в программирование интерактивной трехмерной компьютерной графики с использованием DirectX 9.0, в котором основное внимание уделяется разработке игр. Книга начинается с исследования необходимых математических инструментов и базовых концепций трехмерной графики. Другие темы охватывают как выполнение в Direct3D базовых операций, таких как рисование графических примитивов, освещение, наложение текстур, альфа-смешивание и работу с трафаретами, так и использование Direct3D для реализации техник, необходимых в играх. Главы посвященные вершинным и пиксельным шейдерам включают описание каркасов эффектов и нового высокоуровневого языка программирования шейдеров (HLSL).



Для кого предназначена эта книга


Создавая эту книгу мы адресовали ее следующим категориям читателей:

Программистам со средним уровнем знаний С++, которые хотят узнать о программировании трехмерной графики с использованием последней версии Direct3D— Direct3D 9.0.

Программистам трехмерной графики, обладающим опытом работы с другими API (например, OpenGL), которые хотят узнать о Direct3D 9.0.

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



Использование библиотеки DX


Начиная с версии 7.0, в состав DirectX входит библиотека D3DX (Direct3D Extension). Эта библиотека предоставляет набор функций, классов и интерфейсов, упрощающих выполнение обычных операций, связанных с трехмерной графикой, таких как математические операции, работа с текстурами и изображениями, операции с сетками и операции с шейдерами (например, компиляция и сборка). Можно сказать, что D3DX содержит много возможностей, которые были бы рутинной работой, если бы вам их пришлось выполнять самостоятельно.

На протяжении всей книги мы будем использовать библиотеку D3DX, что позволит нам сосредоточиться на более интересном материале. Например, мы предпочитаем не тратить страницы книги на объяснение того, как загружать изображения различных форматов (bmp, jpeg ит.д.) в интерфейс текстуры Direct3D, когда мы можем сделать это с помощью единственного вызова функции D3DXCreateTextureFromFile. Другими словами, D3DX делает наш труд более производительным и позволяет сосредотачиваться на более важном материале, а не тратить время на повторное изобретение колеса.

Есть и другие причины для использования D3DX:

D3DX является библиотекой общего назначения и может использоваться в различных типах приложений, связанных с трехмерной графикой.

D3DX работает быстро (по крайней мере, настолько быстро, насколько это может делать библиотека общего назначения).

Другие разработчики используют D3DX. Поэтому, скорее всего, вы столкнетесь с кодом, который использует D3DX. Следовательно, хотите ли вы использовать библиотеку D3DX или нет, вы должны быть знакомы с ней, чтобы суметь разобраться в коде, который использует ее.

D3DX уже существует и тщательно протестирована. Более того, с каждой новой версией DirectX эта библиотека совершенствуется и в нее добавляются новые возможности.





Использование документации и примеров из DirectX SDK


Direct3D — огромный API и мы даже не надеемся описать все его детали в одной книге. Поэтому, для того, чтобы получать дополнительную информацию, крайне важно научиться использовать документацию DirectX SDK. Чтобы получить доступ к документации по использованию DirectX из С++, откройте файл DirectX9_c.chm из каталога \DXSDK\Doc\DirectX9, где DXSDK — каталог, в который вы установили DirectX.

Документация DirectX охватывает почти все части DirectX API и поэтому очень полезна в качестве справочника. С другой стороны, документации не хватает глубины в изложении деталей, и поэтому она не столь хороша в качестве учебника. Тем не менее с каждой версией DirectX документация становится все лучше и лучше.

Как было сказано, в основном документация используется в качестве справочника. Предположим, вы наткнулись на относящийся к DirectX тип данных или функцию (скажем, функцию DSDXMatrixInverse), о которой хотите получить больше информации. Вы просто выполняете поиск в алфавитном указателе документации и получаете описание объекта данного типа, или, в нашем случае, функции, как показано на Рисунок  I.7.



Ясность


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



Настройка среды разработки

Для написания приложений, использующих DirectX вам следует выбрать тип приложения Win32Application. Кроме того, в VC++ 6.0 и 7.0 вы должны указать пути к каталогам с заголовочными и библиотечными файлами DirectX чтобы VC++ мог найти необходимые файлы. В нашем случае заголовочные и библиотечные файлы DirectX расположены по путям D:\DXSDK\Include и D:\DXSDK\Lib, соответственно.

ПРИМЕЧАНИЕ

Местоположение каталога DirectX DXSDK на вашем компьютере может быть другим. Оно зависит от пути, который вы задали во время установки.

Обычно программа установки DirectX SDK сама добавляет эти пути в VC++ за вас. Однако, если это не произошло, проделайте все вручную, выполнив следующие действия:

В VC++ 6.0 выберите в меню команду Tools | Options | Directories и введите пути к заголовочным и библиотечным файлам DirectX, как показано на Рисунок  I.3.



Необходимые средства разработки

В качестве языка программирования для всех представленных в книге примеров программ используется С++. Процитируем документацию к DirectX: «DirectX9.0 поддерживается только Microsoft Visual C++ 6.0 и более поздними версиями». Следовательно, для того, чтобы писать приложения на С++, использующие DirectX 9.0, вам необходим либо Visual C++ (VC++) 6.0 либо VC++ 7.0 (.NET).

ПРИМЕЧАНИЕ

Код примеров для этой книги компилировался и строился с использованием VC++ 7.0. Его большая часть должна компилироваться и строиться также и в VC++ 6.0, но при этом следует помнить об одном существенном отличии. Приведенный ниже фрагмент кода успешно компилируется в VC++ 7.0, поскольку переменная cnt считается локальной для цикла for.

int main() { for(int cnt = 0; cnt < 10; cnt++) { std::cout << "hello" << std::endl; } for(int cnt = 0; cnt < 10; cnt++) { std::cout << "hello" << std::endl; } return 0; }

Однако в VC++ 6.0 этот код компилироваться не будет. Вы получите сообщение об ошибке C2374: 'cnt': redefinition; multiple initialization поскольку в VC++ 6.0 переменная cnt не считается локальной для цикла. Поэтому, перенося код в VC++ 6.0, вы должны сделать в нем небольшие изменения, чтобы он компилировался с учетом этого различия.

Обработка ошибок


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



Предпосылки


Эта книга разрабатывалась таким образом, чтобы служить учебником начального уровня. Однако это не означает, что она будет простой для людей, не имеющих опыта программирования. Ожидается, что читатель хорошо знает алгебру, тригонометрию, свою среду разработки (т.е. Visual Studio), C++ и фундаментальные структуры данных, такие как массивы и списки. Опыт программирования для Windows тоже будет полезен, но он не обязателен — получить начальные сведения о программировании для Windows можно в Приложении А.



Примеры программ и дополнительная поддержка


Веб-сайт для этой книги (www.moon-labs.com) играет важную роль, если вы хотите получить от книги максимум возможного. Там вы найдете полный исходный текст всех рассматриваемых в книге примеров. Мы побуждаем читателей изучить соответствующие примеры либо в процессе чтения главы, либо сразу после того, как глава прочитана. Как правило, прочитав главу и потратив некоторое время на изучение исходного кода примеров, читатель сможет создать аналогичный пример самостоятельно. Фактически, попытка самостоятельно создать собственное приложение, используя материал главы и пример кода в качестве справочника, будет хорошим упражнением.

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

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

Сопроводительные файлы можно также загрузить с сайта www.wordware.com/files/dx9.



Рекомендуемое оборудование


Приведенные ниже рекомендации предназначены тем, кто хочет, чтобы примеры программ работали с приемлемой частотой кадров. Любой пример может выполняться с использованием устройства REF, которое осуществляет программную эмуляцию всех функциональных возможностей Direct3D. Поскольку все возможности эмулируются программно, приложения будут работать очень медленно. Более подробно устройство REF будет обсуждаться в главе 1.

Примеры программ из второй части книги очень просты и должны работать на старых бюджетных моделях видеокарт, таких как Riva TNT и аналогичные. Примеры программ из третьей части требуют большего числа геометрических преобразований и используют некоторые новые возможности, такие как точечные спрайты. Для них рекомендуется использовать видеокарты уровня GeForce 2. Примеры программ, приведенные в четвертой части, используют вершинные и пиксельные шейдеры. Поэтому для того, чтобы они выполнялись в реальном времени, вам потребуется видеокарта с поддержкой шейдеров, такая как GeForce 3.



I Для разработки приложений



Рисунок I.1. Для разработки приложений при установке DirectX лучше выбрать вариант Debug, поскольку это упростит отладку

Если выбран переключатель Debug, на компьютер будут установлены как отладочные, так и дистрибутивные версии DLL DirectX, а если выбран переключатель Retail, будут установлены только дистрибутивные версии DLL. Для разработки предпочтительнее отладочные версии DLL, поскольку они могут выводить связанную с Direct3D отладочную информацию в окно Visual Studio, когда программа работает в отладочном режиме. Несомненно это очень полезно при отладке приложений, использующих DirectX. На Рисунок I.2 показана отладочная информация, выводимая когда объект Direct3D не был корректно освобожден.



и библиотечным файлам DirectX, как



Рисунок I.3. Добавление путей к включаемым и библиотечным файлам DirectX в VC++ 6.0



В VC++ 7.0 выберите в меню команду Tools | Options | Projects Folder | VC++ Directories и введите пути к заголовочным и библиотечным файлам DirectX, как показано на Рисунок  1.4.




Рисунок I.4. Добавление путей к включаемым и библиотечным файлам DirectX в VC++ 7.0



Затем, чтобы примеры программ были корректно построены, ваш проект необходимо скомпоновать с библиотечными файлами d3d9.lib, d3dx9.lib и winmm.lib. Обратите внимание, что winmm.lib— это не библиотечный файл DirectX, а библиотечный файл с мультимедийными функциями Windows, и мы будем использовать находящиеся в нем функции работы с таймером.

В VC++ 6.0 чтобы указать библиотечные файлы для компоновки, выберите в меню команду Project | Settings, перейдите на вкладку Link и введите имена библиотек, как показано на Рисунок  I.5.


I Отладочные сообщения, выводимые если объект Direct не был освобожден


Рисунок I.2. Отладочные сообщения, выводимые если объект Direct3D не был освобожден


ПРИМЕЧАНИЕ

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

I Просмотр документации, относящейся к SDK


Рисунок I.7. Просмотр документации, относящейся к SDK


ПРИМЕЧАНИЕ

В этой книге мы время от времени будем отсылать вас к документации за дополнительными сведениями.

Документация к SDK также содержит несколько учебных примеров, которые расположены по URL \DirectX9_c.chm::/directx/graphics/programmingguide/tutorialsandsamplesandtoolsandtips/tutorials/tutorials.htm. Эти учебные примеры соответствуют некоторым темам, рассматриваемым во второй части книги. Поэтому мы рекомендуем вам изучить эти примеры, когда будете читать соответствующую часть книги, чтобы вы могли получить альтернативные объяснения и альтернативные примеры.

Мы также хотели бы обратить ваше внимание на поставляемые с DirectX SDK примеры программ, работающих с Direct3D. Примеры на С++ находятся в каталоге \DXSDK\Samples\C++\Direct3D. Каждый пример демонстрирует как реализовать в Direct3D определенный эффект. Эти примеры достаточно сложны для начинающего программиста графики, но закончив читать книгу, вы будете готовы к их изучению. Исследование этих примеров хорошо подходит на роль «следующего шага» после завершения чтения этой книги.



Указание библиотекчных файлов для компоновки



Рисунок I.5. Указание библиотекчных файлов для компоновки с проектом в VC++ 6.0



В VC++ 7.0 чтобы указать библиотечные файлы для компоновки, выберите в меню команду Project | Properties | Linker | Input Folder и введите имена библиотечных файлов, как показано на Рисунок  I.6.




Рисунок I.6. Указание библиотекчных файлов для компоновки с проектом в VC++ 7.0




Соглашения об оформлении кода


Соглашения об оформлении кода примеров программ достаточно просты. Отдельного упоминания заслуживают лишь два момента. Во-первых, имена переменных класса начинаются с символа подчеркивания. Например:

class С { public: // ...определение открытого интерфейса private: float _x; // имя переменной начинается с подчеркивания float _y; float _z; };

Имена всех глобальных переменных и функций начинаются с заглавной буквы, а имена локальных переменных и методов— со строчной. Мы находим эти приемы полезными для определения области видимости переменной или функции.



вам необходимо установить на компьютер


Чтобы писать и выполнять программы, использующие DirectX 9.0, вам необходимо установить на компьютер как библиотеки времени выполнения DirectX 9.0, так и DirectX 9.0 SDK (Software Development Kit). Обратите внимание, что при установке SDK устанавливаются и библиотеки времени выполнения. DirectX SDK можно бесплатно скачать с сайта http://msdn.microsoft.com/downloads. Установка достаточно проста, и внимания заслуживает только один момент. В диалоговом окне, изображенном на Рисунок  I.1 необходимо установить переключатель Debug.

Эта книга представляет собой введение


Эта книга представляет собой введение в программирование интерактивной трехмерной компьютерной графики с использованием DirectX9.0, в котором основное ударение делается на разработку игр. Прочитав ее, вы изучите основы Direct3D, после чего сможете перейти к изучению и применению более сложных технологий. Раз вы держите в руках эту книгу, у вас есть начальное представление о том, что представляет собой DirectX. С точки зрения разработчика DirectX — это набор API (интерфейсов программирования приложений) для разработки мультимедйных приложений на платформе Windows. В этой книге мы сосредоточимся на ограниченном подмножестве DirectX, называемом Direct3D. Как видно из названия, Direct3D — это API, используемый для разработки приложений с трехмерной графикой.
Книга разделена на четыре части. В первой части исследуются математические инструменты, применяемые в остальных частях книги. Во второй части объясняются базовые технологии трехмерной графики, такие как освещение, текстурирование, альфа-смешивание и работа с трафаретами. Третья часть посвящена использованию Direct3D для реализации различных более интересных техник и приложений, таких как выбор объектов, визуализация ландшафтов, системы частиц, настраиваемая виртуальная камера, а также загрузка и визуализация трехмерных моделей (X-файлов). Темой четвертой части являются вершинные и пиксельные шейдеры, включая каркасы эффектов и новый (появившийся в DirectX 9.0) высокоуровневый язык шейдеров. Настоящее и будущее трехмерных игр неразрывно связано с использованием шейдеров, и, посвящая им целую часть, мы хотели получить книгу, соответствующую современному состоянию дел в программировании графики.
Новичкам лучше всего читать эту книгу с начала и до конца. Главы упорядочены таким образом, что сложность материала постепенно возрастает с каждой новой главой. Предложенный путь позволит избежать скачкообразного увеличения сложности, которое может оставить читателя в недоумении. Часто в отдельной главе мы используем техники и концепции, объясненные ранее. Поэтому, перед тем, как продолжить чтение, необходимо тщательно изучить материал текущей главы. Опытные читатели могут выбирать те главы, которые им интересны.
Наконец вы можете задаться вопросом — какие игры вы сможете разрабатывать после прочтения этой книги. Чтобы ответить на него лучше всего пролистать книгу и взглянуть на типы разрабатываемых приложений. Это поможет вам представить типы игр, которые можно разработать, основываясь на рассматриваемых в книге методах и вашей собственной изобретательности.