Выбрать главу

Автор: Павел Воронин

Приблизительно так можно перевести с английского «Beyond Triangles» — название последней главы замечательной книги «GPU Gems». Она одной из первых рассказала массовому читателю о возможности использовать графический процессор для чего-то большего, нежели рендеринг составленных из треугольников моделей. Тогда это были главным образом научные расчеты: динамика жидкостей, визуализация результатов объемного сканирования, расчет стереограмм и т. д. Однако за прошедшие несколько лет ситуация радикально изменилась: на GPU были перенесены все классические алгоритмы и разработан целый ряд новых, максимально использующих преимущества, даваемые архитектурой современных видеокарт. Техника GPGPU[General-Purpose Computation on GPUs, вычисления общего назначения на графических процессорах] становится по-настоящему general-purpose, универсальной, подходящей для решения практически любых задач. Мне, как большому энтузиасту этой области компьютерных наук, хотелось бы рассказать об одном из самых многообещающих ее направлений: использовании GPU для расчета внутренней логики игр.

Отчего да почему

Дело в том, что обычно ядро игры устроено так: сначала на центральном процессоре рассчитываются все перемещения и взаимодействия объектов, изменение их формы (анимация), параметры среды и пр. Затем, с учетом всех этих данных, сцена (то есть набор моделей и спецэффектов) переводится все тем же центральным процессором в стандартное представление: набор координат вершин треугольников и их атрибутов (нормалей, цветов, текстурных координат и прочего). Полученный массив данных, зачастую довольно большой, пересылается на видеокарту, которая и занимается их выводом на экран: расчетом освещения, наложением текстур и применением различных спецэффектов. И хотя пропускная способность шины процессор-видеокарта за последние годы подросла довольно сильно, она до сих пор зачастую является «узким местом» при программировании игр. Поэтому весьма соблазнительно избежать этой пересылки и реализовать выполнение как можно большей части алгоритмов прямо на графическом процессоре.

Уроки физики

Чего не хватает современным играм, чтобы их наконец-то можно было назвать по-настоящему реалистичными? Поиграв во второй HalfLife на максимальных настройках графики, я уже совсем не уверен, что главным препятствием на пути окончательного переселения человечества в компьютерные миры является несовершенство визуальной составляющей. Несколько лет назад мне довелось повозиться с хорошим шлемом виртуальной реальности, и я не сомневаюсь: подай на него картинку уровня детища Valve, и достоверности изображения для девяноста девяти процентов случаев хватит с лихвой.

Другое дело, взаимодействие объектов игрового мира друг с другом и отклик их на действия человека. Лично меня при игре даже в самые динамичные игры вроде Warcraft III, Need For Speed, Grand Theft Auto или ту же HalfLife не покидает ощущение, что я попал в галактику, вдруг остывшую до нуля градусов по Кельвину. Планеты здесь подобно Луне лишены атмосферы, и ветер на них отсутствует. Дым и осколки разорвавшихся снарядов во всем подражают рентгеновским лучам и проходят сквозь тела, не причинив им ни малейшего вреда. Сами тела при этом сделаны из сплошного куска металла, но, разрушаясь, тут же растворяются в воздухе. Жидкостей здесь не бывает. Как, впрочем, и резины, дерева, глины или ваты.

Одним словом, играм чертовски не хватает качественной физики. И, положа руку на сердце, я не могу их винить. Обсчет физических моделей — это, пожалуй, самая трудоемкая и ресурсозатратная программистская задача из встающих перед разработчиками игр (сравниться с ней может разве что реализация приличного ИИ). Даже в самых новых и продвинутых шутерах количество одновременно обрабатываемых физической подсистемой тел измеряется десятками, максимум сотнями. Опыт же фотореалистичного рендеринга эффектов вроде разламывающихся стен, взрывов или текущей лавы показывает, что о каком бы то ни было реализме можно будет говорить не раньше, чем игровой движок сможет в реальном времени оперировать тысячами, а лучше десятками тысяч взаимодействующих друг с другом объектов. Причем речь идет не только о таких сравнительно несложных вещах, как столкновения или жесткие закрепления, но и о по-настоящему мощных математических приемах, например решении дифференциальных уравнений, описывающих связи объектов и поведение гибких или рвущихся материалов.

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

Тут я тоже начну издалека. Идея снять нагрузку по расчету физики с явно не справляющегося с ней центрального процессора витает в воздухе не первый год. В числе прочих долгое время муссировалась и концепция специально сконструированного для этих целей сопроцессора. И вот в марте 2005 года никому не известная тогда фирма AGEIA, с кучей шума и надоевшего до зубовного скрежета пиара в околокомпьютерных изданиях, публично огласила свои планы по созданию физического акселератора PhysX. Употребленное здесь слово «акселератор» говорит сердцу бывалого игромана больше тысяч эпитетов и стопок хвалебных пресс-релизов. Оно, сердце, истосковавшись по былым потрясениям, вновь наполняется кровью и бешено колотится в предчувствии революции. Всего каких-то десять лет назад появление легендарного 3D-акселератора Voodoo Graphics взорвало рынок трехмерных игр, впервые дав ощущение реальности происходящего — и мы не забыли, как это было. Мы хотим еще.

Но давайте глядеть на вещи трезво. В отличие от видеокарты, работающей с потоками треугольников и пикселов, гипотетический PhysX должен будет эффективно справляться с обсчетом самых разных взаимодействий и математических моделей, разнообразие которых порой кажется мне даже большим, чем разнообразие реального мира. В возможность такого верится, прямо скажем, с трудом. Более того, по заявлению разработчиков, прямого API предоставляться не будет, и все программирование будет вестись через фирменную библиотеку. Негибкость такого подхода многим сразу же показалась фатальной, особенно если учесть, что главным конкурентом в борьбе за роль физического ускорителя выступает практически универсальный вычислитель — GPU.

Еще в 2002 году, выпуская на рынок Radeon 9700, корпорация aTI бросалась громкими заявлениямио переносе физических вычислений на карту и незамедлительном наступлении эры кинематографического качества рендеринга. Хотя за рекламной мишурой не стояло ничего, кроме нескольких лабораторных исследований и пары кривых прототипов, чаяния отрасли и научного сообщества эти слова отражали очень точно: в том, что считать физику на GPU можно и нужно, были уверены все. Так что никто из сторонних наблюдателей иллюзий по поводу будущего aGEIa не питал: все сходились во мнении, что nVidia и aTI постараются задавить начинание в зародыше. И вот буквально на днях битва за потребителя началась: 23 марта было объявлено о выпуске PhysX на рынок, а двумя днями ранее на GDC[Game Developers Conference] миру было представлено детище nVidia и знаменитых Havok — работающий целиком на карте физический движок Havok FX.

Анонсированная на второй квартал новинка продолжает сверхудачную серию физических движков Havok, использовавшихся в Max Payne 2, Age of Empires III, HalfLife 2, F.E.A.R. и еще доброй сотне самых крутых тайтлов последних лет, так что внимание разработчиков к Havok FX обеспечено.

Заявлено, что система будет работать на любых картах, поддерживающих Shader Model 3.0, то есть это линейки GeForce 6xxx и 7xxx плюс Radeon X1xxx. Более того, наконец-то в полную мощь заработает технология SLI: одна карточка будет заниматься просчетом физики, а другая — отрисовкой сцены.

Подробностей внутреннего устройства движка сообщается пока очень мало. В общих чертах устроено все будет так: к набору стандартных базовых типов объектов добавляется ряд новых, описывающих те структуры, которые удалось эффективно реализовать на GPU. Например, примитив Debris[Переводится это слово вовсе не так, как вы подумали, а «осколки», «обломки», «частицы»], абстракция твердого тела. Примитивы можно будет как задавать готовыми 3D-моделями, так и конструировать на лету силами центрального процессора. Последнее может оказаться особенно полезным при визуализации взрывов и прочих разрушений: например, размер и форма выбиваемых снарядами из кирпичной стены кусков будут зависеть от силы выстрела и места попадания. После того как описание объекта передано на карту, CPU им больше не занимается: все, начиная от расчета столкновений и заканчивая выводом треугольников на экран, делает графический процессор.