Вторую часть статьи «Цена фотореализма» мы, признаться, планировали опубликовать еще в прошлом номере «Лучших компьютерных игр». Однако выход 3DMark Vantage спутал все планы — пришлось уделить внимание новому тестовому пакету.
Итак, в первой части статьи мы рассмотрели базовые принципы работы видеокарт и разобрали основные этапы графического конвейера. Настала пора обратить внимание на одно из главных достижений в области современной компьютерной графики. Мы поговорим о шейдерах.
Простор для творчества
Итак, что же скрывается за термином «шейдер»? Говоря простым языком, это такая программа, которая загружается в графический чип и настраивает его, внося определенные изменения в работу конвейера. Видеокарты, лишенные поддержки шейдеров, могли выполнять лишь заранее запрограммированные действия, алгоритмы которых фиксировались на аппаратном уровне. Шейдеры же позволяют обойти эти ограничения: из стандартных инструкций теперь составляются достаточно сложные эффекты.
Первой видеокартой с поддержкой шейдеров стала GeForce 3. Вместе с ней компания NVIDIA представила стандарт Shader Model 1.0 (SM 1.0), описывающий структуру шейдерных команд. Microsoft поддержала инициативу NVIDIA и обеспечила поддержку SM 1.0 в API DirectX 8. Правда, изначально язык программирования шейдеров был очень сложен и мало чем отличался от низкоуровневого Assembler. Писать программы на этом языке — настоящая пытка, так что SM 1.0 разработчики игр использовали очень осторожно. К тому же максимальная длина шейдеров первой версии была очень мала, равно как и набор доступных команд. Однако при всех неудобствах шейдеры стали действительно революционным явлением.
В Shader Model 1.0 шейдеры были разделены на два типа: вершинные (или вертексные) и пиксельные (или фрагментарные). Первые отвечают за трансформацию и освещение вершин и могут выступать в качестве замены блоку Transforming&Lightning. Но если T&L в состоянии выполнять лишь фиксированный набор команд, то возможности шейдеров куда богаче и разнообразнее. Итоговые результаты здесь во многом зависят от фантазии программистов, а не только от архитектуры видеоадаптера. Использование вершинных шейдеров помогает существенно снизить нагрузку на центральный процессор, переложив ее на плечи видеокарты.
Пиксельные шейдеры отвечают за обработку отдельных пикселей изображения и вступают в дело уже ближе к концу графического конвейера. Как правило, их работа сразу бросается в глаза. Различные оптические эффекты, отражение и преломление света, текстуры, генерируемые «на лету», всяческие стилизации... все возможности пиксельных шейдеров с ходу не перечислить.
Выход следующей версии шейдеров — Shader Model 2.0 — существенно облегчил жизнь программистам. Во-первых, на свет наконец появился высокоуровневый язык программирования шейдеров — HLSL. По структуре команд и синтаксису он очень похож на Си. С помощью компилятора команды автоматически преобразовываются в низкоуровневый код, доступный для восприятия видеоадаптером. Итоговый результат варьируется в зависимости от того, какая видеокарта установлена в системе. Также в SM 2.0 увеличилась максимальная длина программ, появилась возможность использования условных переходов и циклов для вершинных шейдеров, а их пиксельные собратья научились оперировать числами с плавающей запятой.
С выходом DirectX 9.0c появилась и Shader Model 3.0, ставшая эволюцией предыдущей модели. У программистов теперь практически не было ограничений на длину и сложность шейдеров. SM 3.0 существует вот уже несколько лет, однако отказываться от нее пока что не планируется — ее поддерживают даже самые технологичные из современных игр.
А вот Shader Model 4.0, появившаяся вместе с DirectX 10,помимо очередных количественных улучшений, принесла с собой еще и новый тип шейдеров. Отвечают они за обработку целых массивов вершин и зовутся геометрическими. Важных свойств у этих шейдеров два. Во-первых, с их помощью геометрические объекты создаются непосредственно в графическом конвейере, без участия центрального процессора. Например, из одной-единственной вершины можно сделать куб или пирамиду. Другое важное свойство — возможность использования потокового вывода. Благодаря этому уже обработанные геометрические массивы могут отправляться в буфер вершин и повторно использоваться в графическом конвейере. Все это снижает нагрузку на процессор и увеличивает число возможных эффектов. Однако грамотно использовать возможности Shader Model 4.0 программисты, похоже, еще не научились.
Повсеместные явления
Сегодня практически в любой игре мы наблюдаем эффекты попиксельного освещения, реализованные посредством пиксельных шейдеров. С помощью этих программ удается имитировать неровности на абсолютно плоских поверхностях. При этом неровности будут корректно менять вид при изменении свойств источников света. Переоценить значимость попиксельного освещения трудно, ведь без этой технологии даже для отображения реалистичного асфальта требовались бы колоссальные вычислительные ресурсы. Попиксельное освещение объектов реализуется посредством алгоритмов bump mapping, normal mapping и parallax mapping.
Bump mapping — это самая простая технология симуляции неровностей. Работает она по следующему принципу: в память графического ускорителя помимо вершин плоскости и видимой текстуры загружается также карта высот. По сути, это черно-белая текстура, в которой интенсивность цвета текселя показывает, насколько должна быть изменена высота этой точки относительно плоскости объекта, на который накладывается карта высот. Сама карта высот не отображается на экране, но информация, содержащаяся в ней, используется пиксельными шейдерами для определения конечной яркости той или иной точки дисплея. При этом учитывается угол падения лучей, так что bump mapping прекрасно работает с динамическими источниками освещения. Как правило, этот метод используется для создания «псевдо-шершавых» поверхностей.
Технология normal mapping чуть более совершенна. Она предусматривает применение карт нормалей — цветных текстур, в которых каждая из трех составляющих цвета (красная, синяя и зеленая) показывает пространственные координаты нормалей (перпендикуляров к плоскости). Оперируя этими данными, можно сымитировать не только асфальт или кожу, но и гораздо более сложные вещи. Взять, к примеру, Doom 3. По контуру монстров видно, что им катастрофически не хватает полигонов. Однако сами по себе они выглядят более чем реалистично. Так вот это и есть работа normal mapping. Все мельчайшие детали внешности врагов в игре имитируются пиксельными шейдерами, а в реальной геометрической модели они отсутствуют.
Parallax mapping — это эволюционное развитие предыдущей технологии. В нем также используются карты нормалей, однако этот метод вносит отличия в сам процесс нанесения текстуры: ее координаты изменяются в зависимости от точки зрения наблюдателя. Алгоритмы эти достаточно сложны, но и результат себя оправдывает. Например, в F.E.A.R. дырки от пуль в стенах реализованы с помощью parallax mapping. Каменная кладка стен из Oblivion также создана с применением этой технологии.
Очень активно пиксельные шейдеры используются для реализации эффектов постобработки, коих великое множество. Они применяются в самом конце графического конвейера, когда кадр уже фактически готов к выводу на экран. В качестве примера постобработки приведем размытие в движении (motion blur), которое используется в каждом втором боевике или симуляторе. Другой пример — изменение глубины резкости (depth of field), при котором объекты, находящиеся вне фокуса зрения, намеренно размываются. Подобные явления мы часто наблюдаем при прицеливании и в роликах на движке игры. Ну и, конечно же, различные изменения цветовой гаммы с целью стилизации, скажем, под выцветшую картинку тоже относятся к эффектам постобработки.
|
|
|
В новейшей графической демонстрации от NVIDIA активно применяются геометрические шейдеры.
|
Реалистичный огонь, дым, взрывы и искажения, связанные с тепловыми потоками, — это все тоже работа пиксельных шейдеров. До их появления программисты реализовывали все эти эффекты с помощью двумерных текстур — спрайтов — и выглядело это, как понимаете, вяло.
Вершинные шейдеры вносят не менее серьезный вклад в повышение реализма трехмерной сцены. Однако эти улучшения, как правило, связаны с различной анимацией, будь то продвинутая лицевая мимика персонажей, развевающаяся на ветру ткань или труп злодея, падающий на землю в соответствии с особенностями человеческой анатомии. Впрочем, одной лишь анимацией все не ограничивается. К примеру, есть один интересный эффект, завязанный на вершинных шейдерах. Называется он toon shading. С его помощью имитируется «мультяшность», то есть все объекты становятся плоскими и как бы рисованными. Нечто подобное можно наблюдать в игре Bad Day L.A.
Из разнообразных инструментов, используемых программистами при работе с вершинными шейдерами, мы выделим displacement mapping. Сегодня эта технология часто используется при создании волн и имитации ткани. Метод очень похож на bump mapping — в память также подгружается карта высот, — однако в данном случае происходит реальное изменение геометрии. Плоскость, состоящая из пары треугольников, разбивается видеоадаптером на сотни полигонов, вершины которых меняют пространственные координаты в соответствие с картой высот. Сложность сцены увеличивается, однако нагрузка на центральный процессор и шину памяти при использовании displacement mapping остается минимальной.
Таковы основные примеры использования шейдеров. Теперь настал черед разобрать по полочкам другую не менее интересную технологию.
Все как в жизни
Человеческий глаз — потрясающее устройство, способное различать широкую гамму оттенков. Даже самые совершенные мониторы современности не в состоянии передать то обилие цветов, что воспринимает наше зрение в реальном мире. Приведем пару фактов. Максимальная яркость стандартных мониторов находится у отметки в 300 кд/м2, а минимальная составляет около 1-2 кд/м2. Исходя из этой цифры, мы можем высчитать, что динамический диапазон этих устройств, то есть отношение самой большой интенсивности свечения к самой малой, не превышает значения 300:1. Противопоставим этому человеческий глаз, способный различать цвета в диапазоне контрастности 800:1. Правда, здесь стоит сделать одну оговорку: то, какие именно значения будут попадать в эти рамки, зависит от окружения. В солнечный день глаз адаптируется под цвета с высокой яркостью, а в кромешной тьме будет лучше различать темные оттенки.
Для отображения картинки мониторы используют 24-битную RGB-палитру. Любой оттенок получается в результате смешения красного, зеленого и синего цветов, интенсивность каждого из которых задается 8-битным числом. Получающийся итоговый цвет обладает целочисленным значением яркости, находящемся в диапазоне от 0 до 255 условных единиц. Выходит следующая ситуация: в реальности мы видим картину с 800 градациями яркости, а монитор в состоянии отобразить лишь 256. Видеокарта по умолчанию также использует RGB-палитру, и при расчетах ей приходится оперировать все теми же 256 значениями яркости. Отсюда вывод: правильно рассчитать сцену, в которой одновременно находятся очень яркие и очень темные объекты, не представляется возможным. В любом случае будут наблюдаться серьезные искажения в цветопередаче.
Изменить мониторы мы пока не в состоянии, но зато можем отказаться от классической RGB-модели при расчете цветов. Вместо этого яркость задается значениями, линейно пропорциональными реальным величинам. Именно эта идея легла в основу технологии High Dynamic Range Rendering(HDRR), позволяющей строить сцену с использованием расширенного динамического диапазона цветов — HDR. С ее помощью в недрах видеоадаптера создается кадр со значениями цветов, теоретически соответствующих тем, что мы воспринимаем своим зрением. Однако мониторы по-прежнему работают в 24-битном режиме RGB. По этой причине видеокарта вынуждена преобразовывать HDR-изображение в привычный для дисплеев вид. Процесс этот именуется tone mapping (тональная компрессия).
На выходе мы получаем кадр с низким цветовым диапазоном. Однако выглядеть он будет намного реалистичнее, чем его аналог, рассчитанный классическим способом. Использование HDR позволяет обойти при расчетах многие искусственные ограничения. Кроме того, некоторые алгоритмы тональной компрессии позволяют имитировать адаптацию человеческого зрения при резкой смене окружения. Например, в ряде игр при перемещении из темного помещения на яркий солнечный свет появляется эффект слепоты: все объекты кажутся очень яркими, но спустя несколько секунд нормальная цветовая картина восстанавливается.
В современных играх при использовании HDR каждая цветовая составляющая кодируется 16-битным (FP16) или 32-битным (FP32) числом в формате с плавающей запятой. FP32 пока практически не используется, так как возможностей 16-битной кодировки хватает с лихвой. Переход к 32 битам на канал приводит к существенному падению производительности, но ощутимого улучшения картинки не происходит.
Построение сцены с использованием широкого динамического диапазона — ресурсоемкий процесс. Графические чипы современных видеокарт приспособлены к HDR. Поэтому они не особо страдают от необходимости оперировать числами с плавающей запятой. А вот с памятью все не так просто. Объем хранимых и передаваемых данных при использовании FP16 удваивается, так что на видеокартах с медленной и не очень вместительной памятью потери скорости получаются весьма серьезные.
Полноценной поддержкой HDRR обладают все видеокарты, начиная с моделей серий GeForce 6000 и Radeon X1000. Правда, графические адаптеры GeForce шестой и седьмой серии не способны одновременно использовать HDR и сглаживание изображения.
Современные видеокарты — это устройства с колоссальной вычислительной мощью. Судите сами: производительность флагманских видеоадаптеров вот-вот должна перевалить за отметку в один TFLOPS, то есть триллион операций с плавающей запятой в секунду. А шейдерные процессоры как нельзя лучше подходят для расчетов, поддающихся распараллеливанию. Вполне логично, что видеокарты все чаще пытаются использовать не только для построения трехмерных сцен, но и для ряда других вещей.
Один из примеров альтернативного использования — проект Folding@Home, созданный с целью изучения аномалий в процессе сворачивания белков и связанных с этим заболеваний. Подобные исследования связаны с огромным количеством вычислений. Поэтому авторы создали систему, с помощью которой любой пользователь может помочь проекту. Для этого надо скачать и рассчитать на своем компьютере определенную часть данных. При этом для расчетов рекомендуется использовать видеокарту, ведь графическое ядро справляется с задачей в десятки раз быстрее центрального процессора. В данный момент программное обеспечение Folding@Home не поддерживает видеокарты GeForce или Radeon, но вскоре ситуация должна измениться.
Вот мы и познакомились с основными достижениями современной компьютерной графики. Все перечисленные 3D-технологии еще очень молоды, самым взрослым из них не более двадцати лет. А это значит, что на наш с вами век выпадет еще много интересного. В ближайшем будущем грядет активное совершенствование игровых движков, внедрение и поддержка новых алгоритмов обработки изображения, да и реалистичная физика виртуального мира уже не за горами. Ждать осталось совсем недолго.