28 марта 2007
Обновлено 17.05.2023

Косметика виртуальных миров. Технологии построения изображения, ч. 1

Косметика виртуальных миров. Технологии построения изображения, ч. 1 - изображение обложка

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

Становление 3D

Насколько сильно влияют визуальные эффекты на отображаемую картинку? Для ответа на этот вопрос достаточно запустить F.E.A.R. на минимальных настройках качества: игра сразу сбрасывает с себя весь визуальный лоск. Даже с качественными текстурами и высоким разрешением о фотореализме не может быть и речи. Для осознания того, каким образом гадкий утенок превращается в прекрасного лебедя, необходимо углубиться в историю развития видеокарт.

Начнем с того, что первые видеокарты вообще не являлись 3D-ускорителями — они служили лишь как ЦАП (цифро-аналоговый преобразователь) и преобразовывали данные, рассчитанные центральным процессором в аналоговый сигнал, доступный для отображения на мониторе. Для игры в тетрис и вывода текста на экран этого хватало, тем более что использовалась 16-цветная палитра (в лучшем случае). Так продолжалось довольно долго, но вскоре появилась проблема: изображения становились все сложнее, нагрузка на CPU росла. Это привело к появлению сначала 2D-, а потом и 3D-ускорителей, которые брали на себя часть функций обработки графики, разгружая тем самым центральный процессор.

Первыми видеокартами, которые строили готовый кадр самостоятельно, стали NVIDIA GeForce 256 и ATI Radeon. Для работы с графикой они использовали API Direct3D 7. Начиная с этого момента, в процессе преобразования данных в графический вид центральный процессор участия уже не принимал.

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

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

Application Programming Interface

Когда речь заходит о графических технологиях, нам часто приходится слышать название DirectX , но при этом мало кто понимает, что это такое.

Меж тем DirectX — это API (Application Programming Interface), то есть интерфейс прикладного программирования, открытые стандарты кода, доступные каждому. На самом деле в него входит целый набор подобных стандартов (например, для музыки, звуков, устройств ввода и т. п.), из которых за графику отвечает только Direct3D , но поскольку все прочие интерфейсы практически не меняются со временем, то понятия DirectX и Direct3D можно считать синонимами.

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

Популярность DirectX крайне велика, и производители GPU, а также разработчики игр выпускают новые продукты, ориентируясь на возможности конкретной версии API. Однако в игры зачастую встраивается несколько путей кода, и у тайтла под DirectX 9 для совместимости наверняка есть путь для работы с более ранними версиями: игра все же запустится на устаревшем железе, но исчезнут некоторые виртуальные эффекты. Впрочем, новые проекты все равно требуют установки новой версии DirectX , даже если видеокарта ее не поддерживает.

Несмотря на все вышесказанное, сегодня у Direct3D все еще остался один конкурент в лице Open Graphics Library (OpenGL) , однако его времена прошли и он практически не используется при создании игр.

Гибкий инструментарий

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

Впрочем, Shader Model 1.0 ( SM 1.0 ) имела весьма ограниченный набор команд, а сами шейдеры имели малую длину. Кроме того, они писались на так называемом Assembly Shader Language, который близок к ассемблеру и, как следствие, очень далек от элегантности и структурированности современных языков программирования. Тем не менее GeForce 3 (первая карта с аппаратной поддержкой шейдеров) стала настоящим прорывом, изменив мир 3D-технологий навсегда. Испытав на деле новые возможности по трансформации вершин и индивидуальной обработке пикселей, разработчики уже не могли повернуть назад. Кстати, уже тогда произошло разделение шейдеров на вершинные (vertex) и пиксельные (pixel), хотя последние были весьма слабы и стали достаточно функциональными лишь в SM 1.4.

Вершинные шейдеры — это выполняемые видеочипами программы, которые производят математические операции по изменению параметров вершин и их освещению. Каждая вершина имеет свой набор параметров: собственные координаты (x, y, z), цвет, нормаль, текстурные координаты и ряд других. Задачей вершинных шейдеров является изменение этих данных в соответствии с заложенными алгоритмами. Входные данные вершинного шейдера — данные об одной вершине геометрической модели. Результат, полученный на выходе, используется для дальнейшего построения сцены.

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

Следующее поколение шейдеров ( SM 2.0 ) наконец обзавелось языком программирования высокого уровня (High-Level Shader Languag), что значительно облегчило жизнь разработчикам. Кроме того, для пиксельных шейдеров появилась возможность производить расчеты для чисел с плавающей точкой, это открыло множество перспектив. Ну и, конечно же, SM 2.0 принесла целый ряд эволюционных изменений, расширив набор команд и увеличив их возможную длину и сложность. Поколение видеокарт с этой шейдерной моделью поддерживает API Direct3D версии до 9.0b включительно. Shader Model 3.0 (использует Direct3D 9.0с ), помимо усложнения шейдеров, привнесла также технологию Flow Control , позволяющую использовать аппаратные ресурсы системы более экономно.

Практическое применение

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

Частным способом деформации является наложение карт смещения (Displacement Mapping), позволяющее уменьшить нагрузку на систему, не теряя при этом в качестве. Технология весьма показательна, так что разберем ее подробнее. Представим себе океанскую волну в виде геометрической фигуры, состоящей из нескольких сотен вершин. Понятно, что, если мы хотим изобразить динамичную сцену с использованием этой волны, мы должны изменять ее форму с частотой 30—40 раз в секунду, при этом обрабатывая каждую ее вершину. Без использования Displacement Mapping все расчеты легли бы на плечи центрального процессора, что крайне негативно сказалось бы на производительности системы и потребовало бы высокой пропускной способности шины памяти.

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

Для повышения детализации используются пиксельные шейдеры. Хорошим подспорьем для Displacement Mapping является Bump Mapping — техника симуляции неровностей на плоской поверхности. Принцип действия практически идентичен: на обработку, кроме координат вершин, посылается черно-белая текстура (карта высот), но она анализируется уже пиксельными шейдерами. Технологию часто называют попиксельным освещением, так как для каждой точки цвет высчитывается индивидуально. При смене освещения меняется и внешний вид поверхности, хотя геометрическая форма объекта не меняется. В итоге значительно снижается сложность геометрии изображения и практически не теряется его качество. Примеры применения технологии: реалистичное дорожное покрытие и прочие неровные поверхности.

Помимо Bump Mapping, в играх активно используется Normal Mapping. Отличие заключается в том, что в данном случае используются карты нормалей, которые позволяют не только указывать их высоту, но и полностью заменять их, благодаря чему можно сымитировать более сложные поверхности. Впрочем, увеличивается и объем текстур: карты строятся в RGB-палитре, где компоненты цвета R, G и B интерпретируются как координаты X, Y и Z. Однако недостаток полигонов сильно заметен, если смотреть на края объектов, — это главный недостаток технологии. Процесс создания карт прост: берутся две модели объекта, одна из которых максимально детализирована, а другая имеет упрощенную геометрию. С помощью специальных утилит модели сравниваются, на основе различий строится карта нормалей. Это один из излюбленных приемов разработчиков, сегодня его можно наблюдать практически в любом высокотехнологичном экшене.

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

Ну и, конечно же, говоря о пиксельных шейдерах, нельзя не упомянуть о High Dynamic Range (HDR). Суть ее заключается в том, что вместо стандартной цветовой модели RGB при расчетах значения интенсивности и цвета описываются реальными физическими величинами. Какова польза? Цвет в RGB-палитре является результирующей от смешения трех цветов (красного, зеленого и синего) с разной интенсивностью (от 0 до 255). Долгое время такая система считалась идеальной, поскольку она поддерживает 16,7 млн цветов. Но не стоит забывать, что диапазон интенсивности цвета так и остался равен 256:1 или 100:1, если измерять в абсолютных радиометрических единицах. Меж тем динамический диапазон зрения человека составляет 100000000000000:1 (14 порядков), что явно больше, чем 100:1. С другой стороны, диапазон, видимый глазом в каждый момент времени, примерно равен 10000:1. Именно из-за этого и происходит адаптация зрения: при смене темного окружения на светлое (и наоборот) некоторое время глаза не видят практически ничего, но постепенно зрение стабилизируется. Совершенно очевидно, что модели описания RGB недостаточно для представления изображений, которые человек способен видеть: 10000 градаций интенсивности невозможно втиснуть в 256 оттенков цвета. До появления HDR проблему решали банально: цвета с высокой или низкой интенсивностью обрезались. В результате отобразить корректно ситуацию, когда в кадре присутствует одновременно очень темные и очень светлые объекты, было невозможно.

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

И все было бы великолепно, если бы не тот факт, что мониторы по-прежнему работают в RGB-режиме. То есть видеокарта создает кадр с потрясающе реалистичными цветами, но вот увидеть его мы не можем. Быть может, это не так уж плохо — если бы монитор использовал реалистичную яркость, то при взгляде на виртуальное солнце мы бы просто ослепли. Так что HDR-кадр все же необходимо привести к RGB-виду, для этого применяется процесс, называемый Tone Mapping, — его алгоритмы сложны, но результат оправдывает затраты. Первой игрой с широким динамическим диапазоном стала Far Cry (после специального патча), однако производительность при этом падала в разы.

Пиксельные шейдеры также позволяют реализовывать всяческие эффекты постобработки вроде Motion Blur (размытие в движении), Bloom/Overbright (делает яркие участки изображения еще более яркими), Depth of Field (снижение резкости заднего плана) и прочих мелких шалостей.

Основные характеристики видеокарт

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

Частота графического процессора (GPU) — количество тактов, выполняемых за секунду. Напрямую влияет на производительность графического процессора. При прочих равных чем она выше, тем больше работы можно выполнить за секунду.

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

Ширина шины памяти — крайне важная для производительности характеристика. Чем шире шина памяти, тем больше информации она может передать за такт. Часто является ограничивающим фактором и не дает нагрузить GPU по максимуму.

Частота памяти — как и ширина шины, влияет на скорость передачи данных. Память 1200 МГц со 128-битной шиной будет работать медленнее, чем память 700 МГц с 256-битной шиной.

Тип памяти — влияет на максимальную частоту, с которой может работать память, но не показывает саму частоту. Например, память DDR2 теоретически способна работать быстрее DDR (но не в 2 раза).

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

Пиксельные процессоры — выполняют пиксельные шейдеры. Очень важный параметр, оказывающий ключевое влияние на производительность. Часто возникают ситуации, когда скорость GPU с частотой 700 МГц и 16 пиксельными процессорами идентична скорости GPU 350 МГц с 32 пиксельными процессорами.

Блоки наложения текстур (TMU) — занимаются выборкой и фильтрацией текстур. Их недостаток оказывает ощутимое влияние на производительность в «тяжелых» графических режимах.

Блоки растровых операций (ROP) — отвечают за запись пиксельных данных в память. На сегодняшний день производительность редко упирается в эти блоки.

День сегодняшний

Прогресс не стоит на месте, и уже сегодня в ход вступают новые стандарты изображения, которые диктует DirectX 10 — одна из главных причин, по которой Windows Vista (новое API будет работать только в ней) непременно обретет популярность. Грядущие изменения весьма значительны, во многом даже революционны, и хотя основной поток игр и доступных видеокарт следует ожидать во втором полугодии, первые отголоски нового стандарта мы можем видеть уже сейчас. Речь идет о видеокартах серии GeForce 8800 , которые в какой-то мере опередили время и обеспечили поддержку нового API задолго до его выхода в свет. Впрочем, одним из преимуществ нового стандарта, а именно унифицированными шейдерными процессорами, мы можем наслаждаться и в DirectX 9.0с. Суть явления проста: разделения на пиксельные и вершинные процессоры более не существует, а каждый из унифицированных процессоров может менять свое назначение. Таким образом, более не возникает ситуаций, когда шейдерные блоки простаивали, в то время как пиксельные были перегружены. Изначально подобная унификация не была обязательным условием для работы Direct3D, но ATI и NVIDIA выбрали именно это направление и к старой концепции уже не вернутся.

Другая особенность нового API — новый тип шейдеров. Называются они геометрическими и предназначены для операций над целыми геометрическими массивами. Такие шейдеры способны записывать данные в память через так называемый потоковый вывод, чтобы их можно было считать и использовать в дальнейшем. Благодаря этому можно изменять объект от кадра к кадру, а не выстраивать его каждый раз с нуля — сцена может полностью просчитываться через данные потокового вывода, а блоки вершинных шейдеров могут некоторое время отдыхать. Нагрузка на видеокарту значительно снижается, а возможность использовать данные потокового вывода позволяет значительно увеличить детализацию: можно создать реалистичное травяное поле, при этом рассчитав геометрию только для десятка травинок. Или стравить на поле боя пару сотен танков, используя всего одну базовую модель. Что особенно приятно, зависимость видеокарты от центрального процессора будет минимальна.

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

* * *

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

Комментарии
Чтобы оставить комментарий,Войдите или Зарегистрируйтесь