Искусство программирования игр на С++

Аннотация

Описаны современные технологии программирования 3D игр, а также некоторые решения типичных проблем, с которыми может столкнуться программист при их разработке. В качестве практических примеров на протяжении всей книги рассматривается процесс создания простого движка игры, который использует все описываемые технологии: вершинные и пиксельные шейдеры, скелетную и вершинную анимацию, а также компоненты DirectMusic, DirectSound и DirectInput, входящие в библиотеку DirectX. Программный код, приведенный в книге, легко адаптировать и превратить в полноценную игру. Описываемый движок очень прост, но универсален и позволяет создавать игры любого жанра. На компактдиске к книге содержатся листинги примеров и дополнительная информация по DirectX.

Купить книгу онлайн

Скачать исходные коды

Введение

С самого начала необходимо определиться, что именно будет рассматриваться в данной книге. Не смотря на то, что в названии присутствует слово "игра", полноценную игру мы писать не будем, потому что для этого понадобиться достаточно большая книга или даже несколько книг объемом в 1000 страниц. За 300--400 страниц можно описать только самую простейшую игру определенного жанра и с простейшими графическими возможностями. Но не это наша цель. Наша цель рассмотреть используемые технологии понять проблемы, с которыми может столкнуться разработчик движка игры и заложить багаж знаний, который пригодиться вам в будущем.

Если честно, то популярность игры зависит от графических возможностей не более чем на 30%. Можно привести массу примеров, когда игра становилась популярной, а использовала старинные графические движки и текстуры плохого качества. Недаром, даже в те времена, когда на PC уже начал властвовать Wolfstain 3D мы продолжали на работе раскладывать примитивный тетрис. Проходят годы и появляются более красивые игры, но даже во времена Half-Life мы с удовольствием раскладываем линии (Lines). Самое главное в игре – это сюжет и геймплей. Если в игру интересно играть, то она будет популярной.

Сложность графики – это всего лишь вспомогательная составляющая, но зато какая приятная для игрока и интересная для программиста. Создавать красивую графику интересно, и смотреть на нее приятно.

Слишком сложная графика может наоборот отрицательно повлиять на популярность игры. Если для формирования сцены необходимо слишком много процессорных ресурсов и для ее запуска требуется компьютер, стоимостью в $3000, то игра никогда не станет популярной, потому что такими компьютерами обладают единицы и не факт, что все они заплатят за ваш труд. А если сделать игру слишком простой, чтобы она запускалась даже на Pentium в 100МГц, то на такую графику невозможно будет смотреть и с вероятностью в 99% такую игру ждет полный провал, если нет супер уникального и супер великолепного геймплея.

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

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

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

Какое отношение имеют хакеры к играм и графическим эффектам? Дело в том, что графические эффекты получили распространение именно благодаря хакерам. Именно они, с помощью Demo роликов (небольшие программы, которые используют скрытые возможности компьютера для создания красивых графических эффектов). Некоторые программисты, попав в мир Demoscene, продолжают совершенствовать свои умения на общественных началах или просто уходят со сцены.

Если не иметь постоянного источника дохода, то такие программисты долго не держатся на сцене, потому что создаваемые ролики не приносят дохода. А ведь нужно как-то кушать самому и кормить свою семью, если она существует. Себя прокормить на пособия по безработице в Европе и штатах можно, а вот семью проблематично. Работать где-то и параллельно заниматься сценой сложно, потому что графика отнимает слишком много времени. Именно поэтому demoscene принадлежит молодым, и чаще всего не работающим ребятам.

Чтобы остаться в мире графики и получать за свою работу зарплату или другого вида доход, нередко программисты уходят в мир создания компьютерных игр. Именно так можно продолжать оттачивать мастерство в сфере графических эффектов, заниматься любимым делом и получать за это деньги. Это мечта любого землянина – заниматься своим любимым делом за деньги.

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

Более подробно о Demo сцене и о графических эффектах в роликах вы можете узнать из книги Demo сцена глазами хакера [4] или [6]. Если вы не читали эту работу и мало знакомы с DirectX и ее 9-й версией, то рекомендую прочитать сначала именно ее. Дело в том, что книга, которую вы держите сейчас в руках, является своего рода продолжением книги Demo сцена глазами хакера, и более глубоко погружает нас в мир компьютерной графики и создания эффектов.

Я буду очень часто ссылаться на книги [4] и [6] ("DirectX и С++. Искусство программирования" и "DirectX и Delphi. Искусство программирования"). Обе книги описывают одни и те же примеры, только для иллюстрации используется свой язык программирования – С++ или Delphi. Нет смысла покупать сразу две книги, возьмите только одну, которая использует тот язык программирования, который вы знаете.

Для понимания книги вам понадобиться знать язык С++ и DirectX. Глубокие знания языка программирования С++ не нужны, потому что в работе с графикой мы практически не будем использовать MFC. В основном нам понадобиться математика, циклы и условные операторы.

А вот DirectX желательно знать хорошо, в том числе и работу с шейдерами, благодаря которым можно получить наиболее реалистичные эффекты. Все, что необходимо знать из пакета DirectX, описано в книге [4] и [6] и если вы ее читали, то с пониманием этой книги вопросов не должно возникнуть. Те вопросы, которые не рассматривались в моей первой книге по графике, здесь будут освещены очень подробно. Получается, что лучше все же купить обе книги. Данная работа является как бы продолжением моей первой работы по графике - "DirectX и С++. Искусство программирования" и "DirectX и Delphi. Искусство программирования".

Комментарий к новому интерфейсу Microsoft

Совсем недавно MS убрала из интерфейса ID3DXEffect метод Pass, который обязательно используется при отображении графики с помощью шейдеров, что и применялось М. Фленовым в книгах: DirectX и C++. Искусство программирования, DirectX и Delphi. Искусство программирования, Искусство программирования игр на С++ . Теперь нужно использовать не метод Pass, а пару методов BeginPass и EndPass.

Если раньше код отображения выглядел так:

pEffect[ef_index]->Begin(&uPass, NULL);
for(UINT i = 0; i < uPass; i++)
{
pEffect[ef_index]->Pass(i);
// Здесь выводим шейдер
}
pEffect[ef_index]->End();

То теперь:

pEffect[ef_index]->Begin(&uPass, NULL);
for(UINT i = 0; i < uPass; i++)
{
pEffect[ef_index]->BeginPass(i);
//Здесь выводим шейдер
pEffect[ef_index]->EndPass();
}
pEffect[ef_index]->End();

Содержимое

Оглавление Предисловие 6
О чем эта книга 7
Что нужно знать 9
Что не вошло в книгу 9
Благодарности 9
Структура книги 10

Глава 1. Введение в программирование игр

12
1.1. Подготовка к созданию приложения 12
1.2. Скелет приложения 15
1.3. Инициализация Direct3D 20
1.4. Функция формирования сцены 23
1.5. Функция загрузки сетки 24
1.6. Пример загрузки сетки 26
1.7. Моделирование 29
1.8. Шейдеры 32
1.8.1. Простейший пример шейдеров 36
1.8.2. Использование вершинного шейдера 41
1.8.3. Пиксельный шейдер 46

Глава 2. Разработка движка

52
2.1. Структура движка 53
2.2. Двигатель объекта 54
2.3. Двигатель игры 62
2.4. Запуск движка 68
2.5. Тени 72
2.6. Множество источников освещения 83

Глава 3. Скелетная анимация

86
3.1. Что такое скелет 87
3.2. Формат хранения сетки 89
3.3. Основы программирования скелетов 95
3.4. Загрузка сетки и скелета из X-файла 98
3.5. Разбор объектов 103
3.6. Загрузка сетки 106
3.7. Загрузка дочерних элементов 109
3.8. Поиск фрейма 110
3.9. Обновление сетки 112
3.10. Обновление сетки 113
3.11. Анимация скелета 116
3.12. Анимация из X-файла 121
3.13. Загрузка анимации из X-файла 123
3.13.1. Необходимые классы 124
3.13.2. Анализ файла 125
3.13.3. Анализ блока анимации 126
3.13.4. Анализ ключа 127
3.14. Использование анимации 129

Глава 4. Войдите

132
4.1. Введение в DirectInput 132
4.2. Класс для входа 134
4.3. Реализация класса ввода 137
4.4. Перечисление устройств 141
4.5. Опрос состояния действий 145
4.6. Использование класса клавиатуры 149

Глава 5. "Фейсом об тейбл"

154
5.1. Алгоритмы обнаружения 154
5.1.1. Точка против плоскости 155
5.1.2. Точка против куба 155
5.1.3. Точка против сферы 156
5.1.4. Сфера против сферы 157
5.2. Столкновения в играх 157
5.3. Пример реализации коллизий 160
5.4. Ниже плинтуса 165
5.5. Напутствие 169

Глава 6. Вершинная анимация

170
6.1. Теория 170
6.2. Загрузка ключа 175
6.3. Отображение сетки 176
6.4. Использование шейдера 178
6.5. Множественность кадров 182
6.6. Практика использования 187

Глава 7. Программирование звука

189
7.1. Введение в звук 189
7.1.1. IDirectMusicLoader 191
7.1.2. IDirectMusicPerformance 193
7.1.3. IDirectMusicSegment8 194
7.2. Воспроизведение 194
7.3. Завершение воспроизведения 199
7.4. Погружение в 3D 199
7.5. Контроль над 3D 206
7.6. Мультизвук 207
7.7. Управление параметрами 208
7.8. Резюме 209

Глава 8. Игровые эффекты

210
8.1. Обман зрения 210
8.2. Видео 213
8.2.1. База для разработки фильтра 214
8.2.2. Разработка фильтра 216
8.2.3. Подтверждение типов медиаданных 219
8.2.4. Получение кадра 221
8.2.5. Загрузка видео и использование фильтра 223
8.2.6. Компиляция 227
8.3. Мелочи жизни 228
8.4. Не все золото, что блестит 230
8.5. Искусственный интеллект 235
8.6. Оптимизация графики 238
Заключение 251
Приложение. Описание компакт-диска 253
Список литературы 254
Предметный указатель 255
4 Оглавление 5 Оглавление

Отзывы

Добавить Комментарий

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповидания на русском или английском языке.

Пишите мне


Я в социальных сетях
Facebook Telegram Програмысли
Youtube Instagram Твитер