3D-технологии в играх: Call of Duty 2



Введение в обзоры графических технологий в играх

Разработчик: Infinity Ward
Издатель: Activision
Дата выхода: Октябрь 2005 г.
Графический API: Direct3D 9

Техническая характеристика

Игра Call of Duty 2 использует графический движок собственного изготовления (тут даже не знаю, как лучше написать, может быть, даже "собственной модификации"), судя по всему, имеющий в основе своей Quake 3 Engine, но очень сильно модифицированный по сравнению с ним. Настолько модифицированный, что теперь он использует в качестве графического API Direct3D, а не OpenGL. Уровни игры представляют в основном открытые пространства среднего и большого размеров, но есть и закрытые помещения, особых ограничений в этом плане у движка нет, как и у его прародителя. Игру выгодно отличает большое количество поверхностей с несколькими текстурными слоями и множеством применяемых вершинных и пиксельных шейдеров: бампмаппинг/нормалмаппинг практически на всех поверхностях, несколько текстурных слоев для каждой поверхности: diffuse, bump, specular. Впрочем, это сейчас уже практически стало стандартом… А вот очень большое количество такого великолепного дыма встречается впервые. Причем, он тут и к месту, война все-таки, и смотрится замечательно, заметно лучше, чем где-либо ранее. Дымовые эффекты сильно сказываются и на производительности игры: чем больше дыма (большое количество поверхностей с альфа-блендингом), тем меньше FPS. Также, в игре используются продвинутые способы постобработки изображения, что тоже сейчас в моде. Вот несколько примеров, заметных сразу же: blur в виде размытия всей картинки после смерти игрока и при попаданиях пуль, motion blur — чаще всего во время контузии игрока, sun glare и heat haze, которые действительно удачно применены на африканских уровнях, где им самое место. Также heat haze использовали и для взрывов, огня и эффекта перегретого ствола скорострельного орудия.

Для визуализации теней в игре применяются карты теней (shadow maps), которые позволяют получить мягкие тени, достаточно реалистичные в определенных условиях. С некоторыми ограничениями, конечно, и основное из которых — один очень яркий (относительно других) удаленный источник света, вроде солнца или луны. Для таких игр, которые проходят в основном на открытых пространствах, такой метод рендеринга теней как раз подходит лучше всего на данном моменте развития технологий. К сожалению, авторы не выполнили всего того, что обещалось ими в предварительных скриншотах — там все тени были с самозатенением и явно использовались карты теней более высокого разрешения. Примерно такие, какие мы видим в 3DMark 05. В результате, в игре мы получили лишь уже привычные shadow maps отдельно для каждой модели, которые видим в играх несколько лет.

В типичных условиях и уровнях игры количество геометрии, обрабатываемое на один кадр, находится выше среднего уровня для современных игр, и варьируется примерно от 50000 до 500000 полигонов. А в среднем тут от 100000 до 250000 полигонов в кадре при максимальных настройках, в зависимости от уровня игры. Так, бои в городах (Сталинград) одни из самых "тяжелых", средняя сложность геометрии в них составляет 200000-250000 треугольников на кадр, а вот "африканские" уровни заметно менее сложны — лишь 100000-150000 полигонов в среднем.

Call of Duty 2 очень требовательна к объему видеопамяти, в разрешении 1024x768 с включенным антиалиасингом уровня 4x и максимально возможным качеством текстур (Extra в настройках игры) использует до 340-350 мегабайт видеопамяти! Среднее же использование видеопамяти в тестовом разрешении 1024x768 с включенным 4x антиалиасингом и максимальными настройками составляет около 280-300 Мб. Понятно, что на большинстве систем с физически меньшим количеством набортной памяти частично используется системная память. Это же показывают и результаты тестов на максимальных настройках, все карты с 512 Мб локальной видеопамяти в игре оказываются заметно быстрее своих собратьев, оснащенных 256 Мб памяти. Приведу пример из 3DGiТогов — видеокарта ATI RADEON X800 XL 256MB отстает в игре Call of Duty 2 от точно такой же модели с теми же частотными характеристиками, но с 512 Мб видеопамяти, на 15-45%, в зависимости от видеорежима!

Графическим движком игры используются шейдерные программы, написанные на HLSL, и на тестовой системе с видеокартой, поддерживающей Shader Model 3.0, они на лету компилируются в вершинные и пиксельные шейдеры версий 1.1 и 2.0, причем наибольшее количество программ именно версии 2.0, обычно более сложных и длинных. Это касается как пиксельных шейдеров, так и вершинных. Количество пиксельных и вершинных шейдеров версии 2.0 примерно в четыре раза больше, чем программ версии 1.1, то есть игра явно рассчитана на видеочипы с поддержкой DirectX 9. Кстати, абсолютно во всех пиксельных шейдерах версии 2.0 сделаны оптимизации в виде расчетов с пониженной точностью (partial precision), которые должны пойти на пользу всем видеокартам NVIDIA, а особенно — серии NVIDIA GeForce FX. Хотя даже в этом случае, включить режим "DirectX 9" на младших видеокартах GeForce FX, особенно при остальных максимальных настройках, вряд ли получится. Для таких случаев в игре есть специальный "DirectX 7" режим, в котором недоступно подавляющее большинство эффектов (но дым остается), зато производительность значительно выше и пользователи старых видеокарт тоже могут спокойно поиграть. Об этом режиме читайте подробнее ниже по тексту, в описании настроек качества графики.

Краткая история появления

Первые скриншоты игры Call of Duty 2 появились в первом квартале 2005 года, они "утекли" в сеть и были растиражированы множеством игровых веб-сайтов. Поражаться в те времена было чем, несмотря на не очень хорошее качество тех скриншотов:

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

По первым же скриншотам сразу было видно, что много бампмаппинга и нормалмаппинга нам обеспечено:

Очень неплохие складки на одежде, каменная кладка и прочая мелкая геометрия на всех поверхностях смотрятся просто замечательно! Получился старый знакомый по геймплею Call of Duty, но теперь с многочисленными улучшениями графики: современной системой частиц (искры, дым, пыль), повсеместным нормалмаппингом, отличными тенями. Но более поздние скриншоты показали, что самозатенения и тех качественных карт теней высокого разрешения, что были на ранних изображениях, мы не увидим. Зато разрешение текстур продолжало радовать:

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

Особенности графики в игре

Итак, релиз Call of Duty 2 подтвердил весьма высокое качество графики, не зря ведь версию игры и для Xbox 360 одновременно делали, нужно было чем-то удивлять обладателей игровой системы нового поколения. В игре очень хорошо выглядит и сразу же заметно применение карт нормалей (normal mapping), практически каждый материал, помимо diffuse текстуры, имеет specular и normal слои, картинка сразу обретает объемность, а все поверхности — мелкие детали (складки на одежде, трещины на неровных поверхностях, выпуклые камни, кирпичи). Сравните изображение из игры с нормалмаппингом и без него:

Normalmapping ON Normalmapping OFF

Без карт нормалей сразу пропадает часть деталей, все поверхности выглядят плоскими. И это в динамике становится еще заметнее, ведь освещение рассчитывается попиксельно.

Несмотря на то, что разработчики не воплотили в алгоритме наложения теней все то, что от них ожидалось, игра выгодно отличается и мягкими реалистичными тенями (кстати, движок позволяет менять степень "размытости" теней, задавая уровень фильтрации от 0 до 4). Статические тени от больших объектов хоть и просчитаны заранее и записаны в лайтмапы, но отлично сочетаются с динамическими:

3D графика игры порадовала и неплохими эффектами постобработки (postprocessing) изображения. В виде фильтров blur и motion blur:

К постобработке относится и эффект искажений воздуха от взрывов, огня (heat haze) и эффект слепящего солнца (glare). Кстати, на мой взгляд, налицо недостаток динамического диапазона, весьма желательно было бы применение движком расчетов в HDR, что помогло бы и качеству постобработки.

Ну и нельзя не отметить просто лучшую на сегодняшний день реализацию дыма! В Call of Duty 2 Он разнообразен и завораживающе реалистичен, а применяемый метод смягчения границ пересечения полупрозрачных полигонов и геометрии уровня (подробнее — в описании настроек) так и вообще ранее в играх не применялся.

Все остальные аспекты в графике также весьма хорошего уровня технического исполнения. Особых претензий к 3D графике игры у меня лично нет, а это не так уж часто встречается. Разве что для немногочисленных поверхностей воды можно было бы сделать динамические отражения и несколько увеличить разрешение скайбоксов (skybox), но последнее — бич всех нынешних игр, особенно мультиплатформенных…

Настройки качества графики

Основные графические настройки финальной версии игры, доступные из меню:

С общей частью, думаю, все понятно. Как обычно, настраивается разрешение, антиалиасинг, текстурная фильтрация, синхронизация, яркость и т.п. Опишу лишь те пункты, которые оригинальны для Call of Duty 2 или редко встречаются в других играх.

  • "Rendering Method Preference" — опция, позволяющая форсировать путь рендеринга, оптимальный для современных и устаревших или слабых видеокарт соответственно, возможные варианты установки: DirectX 9, DirectX 7 и Auto. "DirectX 9" — основной вариант для быстрых современных видеокарт, а "DirectX 7" подойдет и для довольно старых видеокарт, и для видеокарт с недостаточной производительностью. Также, этот режим может оказаться полезным для тех, кого не устраивает производительность его современной системы в нормальном DX9 режиме, дающем максимально возможное качество. С последней опцией проще всего, игра сама предложит оптимальный режим для вашей системы. Ну а получаемую в разных режимах картинку сравните сами:

    DX7 mode DX9 mode

    В упрощенном DirectX 7 режиме отсутствуют: normal mapping, specular mapping, тени (кроме предрассчитанных в лайтмапы, от крупных неподвижных объектов) и эффекты постобработки: bloom, glow, heat haze, blur и так далее. В целом, картинка с включенным DX7 path получается заметно худшей, хотя и вполне играбельной. Думаю, что для видеокарт, начиная примерно с ATI RADEON 9700/X700 и GeForce 6600, предпочтительнее будет попробовать использовать DirectX 9 режим. Вероятно, на этих картах можно будет получить приемлемую производительность, пусть даже изменив некоторые другие настройки, отключив анизотропную фильтрацию и др. А вот более старые и медленные карты, хотя и обладающие поддержкой необходимых для этого возможностей, не смогут дать нужной производительности. Это относится, в первую очередь, к серии NVIDIA GeForce FX, которые недостаточно быстры в выполнении пиксельных шейдеров версии 2.0. Хотя и на самых быстрых из них можно попробовать включить DirectX 9 и снизить остальные настройки качества, о которых пойдет речь дальше. Дополнить информацию по данной опции должен тот факт, что на тестовой системе разница в производительности в режимах DX7 и DX9 (остальные настройки при этом были на максимуме) составляет 3-4 раза! Безусловно, свой вклад в повышение производительности вносит и снижение объемов текстур в DX7 режиме, ведь карты нормалей и specular карты в этом случае не используются. Но основной эффект дает полное отсутствие попиксельных расчетов освещения.

  • "Optimize for SLI" — опция, предназначение которой понятно из названия, ее я привел в качестве интересной для технического обзора особенности. Это одна из первых игр, в которой специально учитываются особенности подобных двухчиповых конфигураций. Возможные значения: Yes и No. Если у вас стоят две видеокарты NVIDIA с включенным режимом SLI в драйверах (а возможно и две видеокарты ATI в CrossFire, тут ничего определенного точно сказать не могу), то нужно включить эту опцию. В этом случае графический движок игры оптимизирует свою работу так, чтобы получить максимум производительности от двух видеокарт, работающих в тандеме. Вероятно, это касается оптимизаций работы с render targets, используемых в алгоритмах постобработки, именно подобные вещи могут послужить причиной недостаточного увеличения производительности от SLI системы. Интересно, что в демо-версии игры эта опция называлась "Optimize for Dual Cards", так что есть вероятность, что и пользователям CrossFire систем эта настройка тоже пригодится, хотя там используется совершенно иная технология объединения мощности двух видеочипов.

  • "Shadows". Настройка очень часто встречающаяся в играх, в Call of Duty 2 она отключает только динамические тени от моделей солдат и техники (скриншоты см. выше). Влияние построения теней на общую производительность весьма велико, до 20%! В конкретных цифрах это 41 FPS и 49 FPS в тестовой демке, соответственно для включенных и отключенных теней. Так что трижды подумайте, нужны ли вам довольно немногочисленные динамические тени, если вы обладатель недостаточно мощной системы. По этим цифрам понятно, почему разработчики игры упростили алгоритм наложения теней, по сравнению с тем, что мы видели в ранних скриншотах. Если даже существующие тени так сильно влияют на производительность, то что было бы в случае более сложных алгоритмов с самозатенением и при использовании теневых карт более высокого разрешения?

  • "Number of Dynamic Lights" — количество динамических источников света, освещение поверхностей от которых будет рассчитывать движок. Для этой опции из игры возможны значения: Off, Low, Normal и High. Эта настройка влияет на количество рассчитываемого освещения от вспышек выстрелов и взрывов, чем больше значение, тем больше источников света будут реально освещать поверхности в игре. Даже при установке "Low" динамическое освещение от основных источников света, таких, как вспышки выстрелов оружия самого игрока, включено. А на более высоких настройках реалистичность освещения увеличивается, большее количество вспышек и взрывов начинает действовать на освещенность сцены, тут и выстрелы врагов и союзников, и взрывы снарядов и гранат. Хотя на производительность игры в типичных ситуациях эта настройка влияет не очень существенно, на тестовой системе получалась разница максимум 5-7% между отключенными динамическими источниками освещения и максимальным их количеством. Возможно, на менее мощных видеокартах разница будет большей, поэтому пользователям лучше самим найти необходимый баланс на их собственной системе.

  • "Soften Smoke Edges" — эта настройка включает использование эффекта "ZFeather" (так она называлась в предрелизной демо-версии) для дыма в игре. Применяется специальный алгоритм, который нужен для того, чтобы убрать давно всем надоевшие линии пересечения полупрозрачных полигонов дыма с геометрией уровня и моделей. Наглядно эти пересечения видны на скриншоте:

    Возможные значения: Off, World Only и Everything. Опция, выставленная в "Off" полностью выключает режим, в результате пересечения дыма и геометрии уровня резкие, ярко выраженные и это выглядит нереалистично. Зато такая настройка обеспечивает лучшую производительность в игровых сценах с большим количеством дыма. Значение "World Only" смягчает края дымовых эффектов только на фоне геометрии уровня: земной поверхности, зданий, неба и так далее, но не на фоне динамических объектов: моделей людей и техники. А вот установка "Everything" убирает резкие пересечения полупрозрачных полигонов дыма и всех поверхностей, что еще более реалистично, но дополнительно снижает производительность. Далеко не всегда артефакты пересечений бросаются в глаза, посмотрите на скриншоты, это я еще старался, чтобы было видно (левый скриншот с режимом "Off", правый — "Everything", обратите внимание на тени в центре около бочек и на полученное количество кадров в секунду):

    Если FPS на вашей системе снижается во время появления большого количества дыма, можете попробовать поставить эту настройку в значение "Off". Ведь ее влияние заметно не всегда и в глаза артефакты не бросаются, то вот на тестовой системе настройка влияет на производительность довольно значительно, в режиме 1024x768 разница между крайними режимами составляет до 10%. Если принять показатель FPS при включенном "Everything" за 100%, то с "World Only" получается около 105%, а с "Off" — 110% на стандартной игровой ситуации.

  • Опции в разделе "Texture Settings" определяют используемый игрой размер текстур. К счастью, в отличие от демо-версии, в релизе пользователю дали и ручные настройки качества текстур из меню, что важно для достижения максимального качества изображения, ведь автоматически максимальные настройки разрешения текстур выставляются только для видеокарт с установленными 512 Мб видеопамяти, а все остальные довольствуются текстурами худшего качества. В релизе значение настройки "Texture Quality" может быть Automatic или Manual. Если данная настройка установлена в значение "Automatic", то игра сама выставляет настройки разрешения основных текстур, карт нормалей и specular карт, которые считает оптимальными для вашей системы. Для этого определяется объем свободной текстурной памяти, с учетом системной памяти, выделенной под видеонужды. То есть, при автоматических настройках размера текстур они могут получиться разными для различных разрешений экрана и уровней антиалиасинга. Обычно, автоматическая настройка работает нормально, но этого недостаточно для всех случаев. Иногда хочется поэкспериментировать или тонко подстроить качество для себя. Тогда нужно установить "Texture Quality" в значение "Manual" и изменять раздельные настройки для основных текстур, карт нормалей и specular карт.

  • Texture Resolution". Настройка служит для изменения разрешения используемых базовых (diffuse) текстур. Это самый главный текстурный слой, который во многом определяет поверхность материалов в игре. Возможные значения: Low, Normal, High и Extra. Разница в картинке между всеми этими уровнями есть и ощутимая (см. ниже). Параметр примерно должен соответствовать следующему правилу: если на вашей видеокарте установлено 512 мегабайт видеопамяти, то можно смело ставить "Extra". Также этот режим подойдет для некоторых мощных видеокарт с 256 Мб локальной памяти, таких, как GeForce 7800 GT/GTX и RADEON X1800 XL/XT и выше. Режим "High" подходит для остальных видеокарт с 256 Мб памяти средней мощности, а режим "Normal" — для менее быстрых видеокарт (low-end) с 256 Мб памяти и почти для всех 128 Мб видеокарт, кроме самых слабых. Понятно, что какой-нибудь GeForce FX 5600, даже имея 128 Мб набортной памяти, может банально не потянуть. Для таких карт и для всех видеоплат лишь с 64 мегабайтами памяти подойдет только самая низкая настройка "Low". Эти цифры стоит принимать лишь как примерное руководство к действию, конкретные настройки нужно подбирать на каждой отдельной модели видеокарты и даже системы в целом, ведь в ряде случаев используется часть системной памяти. Также не нужно забывать о настройках антиалиасинга и игрового разрешения, производительность и играбельные настройки качества текстур также сильно зависят от них.

  • "Normal Map Resolution" — опция, определяющая разрешение используемых карт нормалей, которые обычно используются для попиксельного освещения и отображения мелких геометрических деталей, вроде неровностей и складок поверхностей. Возможные значения такие же, что и в случае основных текстур: Low, Normal, High и Extra. Каждый из этих уровней также сразу заметен на получаемой в результате картинке. Производительность от изменения этой настройки также зависит не только от объема установленной видеопамяти, но и от вычислительных возможностей видеочипа. Многие современные видеокарты высокого уровня очень быстры и значительного влияния данная настройка на FPS не окажет, лишь бы хватало памяти. Ну а видеокарты уровня low-end могут потребовать более низких установок, даже обладая 256 Мб памяти.

  • Ну и последняя интересующая нас настройка — "Specular Map Resolution". Она делает то же самое, что и описанные выше две опции, но только для specular текстур, использующихся для расчета бликовой составляющей и определения того, какие поверхности обладают способностью отражать свет и насколько. Возможности по конфигурации те же: Low, Normal, High и Extra. Чем выше установлена настройка, тем более высокого разрешения specular карты используются в игре. Влияние на производительность примерно такое же, что и у ранее рассмотренных настроек размера текстур.

В общем, всё как обычно, чем менее мощная видеокарта установлена и меньший объем видеопамяти на ней присутствует, тем ниже должны быть выставлены эти три настройки разрешения текстур, производительность очень сильно зависит от них, причем важны как вычислительные возможности видеочипа, так и объем локальной видеопамяти. Даже если на карте стоит память большого объема, вроде 512 Мб варианта ATI RADEON X800 XL, мощностей видеочипа может не хватить для наложения всех текстур с приемлемой производительностью. А если выставить на карте с 128 Мб видеопамяти все текстурные настройки на максимум, то для значительной части ресурсов будет использоваться системная память, что вызовет неприятные проседания FPS во время игры, так как если в локальную память видеокарты все требуемые текстуры не входят, то при рендеринге каждого кадра их приходится запрашивать из системной памяти. В подобных случаях нужно снизить три настройки разрешения текстур или установить автоматический режим.

Приведу пример на основе одного из типичных уровней игры. При разрешении 1024x768, без использования антиалиасинга, но при прочих максимальных настройках, игрой используется до 250 мегабайт видеопамяти, если значения настроек Texture Resolution, Normal Map Resolution, Specular Map Resolution установлены в значение "Extra". При всех вышеперечисленных настройках, установленных в значение "High" используется уже всего 160 Мб видеопамяти, при настройках "Normal" — примерно 140 Мб, при наименьшем возможном "Low" — около 120 мегабайт. Если включить антиалиасинг уровня 4x, то получается примерно 280, 190, 165 и 140 мегабайт, соответственно для настроек: Extra, High, Normal и Low. Ну а выглядит игра на этих разных настройках качества текстур вот так:

Думайте сами, стоит ли прибавление в качестве картинки потерь в производительности для вас лично. А потери в скорости такие, что если среднее количество кадров в секунду в режимах всех текстурных настроек установленных в "Normal" принять за 100%, то в режимах Extra, High, Normal, Low в случае тестовой системы на базе ATI RADEON X1800 XL 256 Mb получается 72%, 97%, 100%, 103% соответственно. То есть, на тестовой системе оптимальными настройками размера текстур оказываются "High", на "Extreme" наблюдается слишком сильное падение производительности, а более низкие настройки ("Normal" и тем более "Low") не обеспечивают серьезного улучшения производительности. Ну а если вы не уверены в том, что правильно можете выставить текстурные настройки в игре, поставьте "Texture Quality" в "Automatic", игра сама подберет настройки под количество свободной видеопамяти, доступной на вашей системе.

Так как движок игры явно имеет отношение к графическому движку Quake, то и консольных команд в ней достаточно много. При помощи этих команд можно побороть интересный баг (проверялось только на версии 1.0) и слегка увеличить производительность. Для этого надо вызвать консоль, посмотреть и запомнить текущий уровень r_picmip. Затем, изменить эту настройку на любое другое значение (например, если r_picmip было равно "0", то поставить "1") и выполнить команду r_applypicmip. Затем выставить r_picmip обратно в нужное значение ("0" в нашем случае) и снова выполнить r_applypicmip. После этих действий количество кадров в секунду на многих системах несколько повышается, а качество изображения остается соответствующим начальным настройкам. Обратите внимание на цифры в левом верхнем углу у первого скриншота (до применения вышеописанных операций) и у второго. Качество текстур при этом, судя по всему, абсолютно одинаковое.

Относительно производительности остается добавить, что на тестовой системе все максимальные настройки играбельны только в режиме с включенным антиалиасингом уровня 2x и анизотропной фильтрацией 16x в разрешении 1024x768, для больших же разрешений и уровней антиалиасинга нужны более новые и производительные видеокарты: ATI RADEON X1900 XT, ATI RADEON X1800 XT и NVIDIA GeForce 7800GTX. А, к примеру, на средних сейчас системах с видеокартами уровня NVIDIA GeForce 6800GT и ATI RADEON X850 XT придется снизить некоторые настройки, а возможно даже отключить антиалиасинг или перейти в еще более низкое разрешение.





Дополнительно

iXBT BRAND 2016

«iXBT Brand 2016» — Выбор читателей в номинации «Процессоры (CPU)»:
Подробнее с условиями участия в розыгрыше можно ознакомиться здесь. Текущие результаты опроса доступны тут.

Нашли ошибку на сайте? Выделите текст и нажмите Shift+Enter

Код для блога бета

Выделите HTML-код в поле, скопируйте его в буфер и вставьте в свой блог.