Как работает 3D

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

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

20080702_3dgraphics_perspective1.jpg

Что делает картинку трехмерной?
Картинка, кажущаяся трехмерной (3D) , должна иметь три измерения: высоту, ширину и глубину. Двумерная картинка (2D) имеет два измерения: высоту и ширину. Некоторые картинки изначально двумерны. Представьте себе буквы «М» или «Ж», указывающие на туалет. Эти символы должны быть понятны с первого взгляда. Поэтому, чем проще они нарисованы, тем лучше. Конечно, можно заменить эти буквы фигурками людей. Фигурки можно дополнить информацией: какой тип одежды на них надет, какой у них цвет волос, посещают ли они регулярно занятия по шейпингу и т.д. Но вся эта дополнительная информация лишь усложнит получение главной информации: в какую же дверь вам идти? Этим примером можно проиллюстрировать отличие 2D графики от 3D: двумерная графика хороша для выражения чего-либо простого за максимально короткое для понимания время. Трехмерная графика может дать больше информации, но на ее усвоение требуется большее время.
Обратите внимание на треугольники на рис. 1 слева. Каждый из них имеет три линии и три угла. Справа мы уже наблюдаем пирамиду — трехмерную структуру с четырьмя треугольными гранями. Пирамида нарисована с помощью пяти линий и шести углов, что почти в два раза больше чем для одного треугольника.

20080702_31.jpg

Сотни лет художники владели трюками, позволяющими двумерной картине выглядеть как окно в реальный, трехмерный мир. Вы можете создать ту же самую иллюзию и на экране монитора, просто отсканировав фотографию. Объекты кажутся меньше при удалении, близлежащие фигуры выглядят достаточно резкими, а удаленные объекты размыты. Чем больше расстояние от камеры, тем менее насыщенными будут цвета. Однако когда мы говорим про сегодняшнюю 3D-графику, мы подразумеваем не статичные фотографии, а движущиеся объекты. И если перевод двумерной картинки в трехмерный вид сводится к добавлению некоторого количества информации, то перевод статичной 3D-картинки в движущееся изображение требует намного большего.

20080702_32.jpg

Часть проблемы заключается в том, что мы слишком избалованы. Мы требуем максимального реализма от всего, что видим. Если еще в середине 80-х игра типа «Арканоида» потрясала людей своей компьютерной графикой, то сейчас мы сравниваем качество очередной игрушки с DVD-фильмом, требуя большой четкости и детализации. Мы требуем лучшей трехмерной графики от персонального компьютера, а в последнее время — даже от игровых приставок типа Dreamcast или PlayStation II.

20080702_3dgraphics_wirehand1.jpg

Что такое трехмерная графика?
Для большинства из нас компьютеры или современные приставки являются наиболее привычным способом знакомства с трехмерной графикой. Компьютерные игры и видеоролики изготавливаются с помощью созданных компьютером картинок. Обычно процесс создания реалистичной трехмерной сцены разбивается на три важных шага:
1. создание виртуального 3D-мира;
2. выбор части мира, которая будет демонстрироваться на экране;
3. задание представления для каждого пикселя на экране для максимальной реалистичности изображения.
Создание виртуального 3D-мира
Виртуальный 3D-мир — это не просто эскиз такого мира. Чтобы вам лучше в этом разобраться, приведем пример из реальности. Рассмотрим вашу руку и стол под ней. Рука обладает характеристиками, которые определяют способы ее движения и ее вид. Пальцы примыкают к ладони и послушно сгибаются в суставах. Если шлепнуть рукой по столу, то он не брызнет во все стороны, так как стол всегда твердый и цельный. Рука не может пройти сквозь стол.
Всю эту информацию нельзя получить, просто взглянув на рисунок предмета. Но сколько бы фотографий вы ни сделали, на любой из них ваши пальцы будут сгибаться в суставах и примыкать к ладони, стол будет всегда твердым. Так ведут себя вещи в реальном мире, и они всегда будут себя так вести. Объекты же виртуального трехмерного мира не существуют в природе. Все они — искусственные , а все их свойства задаются программой. Разработчики используют специальные инструменты для аккуратного описания 3D-мира, чтобы каждый объект вел себя так, как ему положено.

20080702_3dgraphics_wirehand2.jpg

Какую часть виртуального мира показать на экране?
В любой момент экран демонстрирует только крошечную частичку виртуального трехмерного мира компьютерной игры. Показываемая часть определяется способом задания мира, направлением, в котором вы пожелаете в нем пойти, и точкой, в которую вы будете при этом смотреть. Независимо от того, какой путь вы выберете — вперед или назад, вверх или вниз, вправо или влево — виртуальный 3D-мир вокруг вас определит, что вы увидите из вашей позиции по направлению вашего взгляда. Смысл увиденного вами не должен меняться от сцены к сцене. Если вы смотрите на объект с одной и той же дистанции, то он должен сохранять те же размеры независимо от направления взгляда. Способ движения и вид каждого объекта должны убеждать вас в том, что он имеет постоянную массу, что он всегда твердый или мягкий, жесткий или гибкий и т.д.
Программисты, создающие компьютерные игры, затрачивают огромные усилия на описание 3D-мира, чтобы вы могли восхищаться им и не встречать ничего, что бы разубедило вас в его реальности. Вы же не хотите увидеть, как два твердых объекта проходят друг сквозь друга? Это сразу бы напомнило вам об иллюзорности виртуального мира.
И третий шаг включает в себя, по крайней мере, столько же компьютерных вычислений, как и первые два вместе взятые, если не больше. Причем этот шаг должен выполняться в реальном времени и в играх, и в видеороликах. Далее мы его рассмотрим более подробно.

Как заставить это выглядеть настоящим?
Не важно, насколько большим и насыщенным будет виртуальный 3D-мир. Компьютер может отображать его только одним способом: помещая пиксели на 2D-экран.
Прежде чем изображение станет реалистичным, объекты проходят несколько стадий обработки. Самые важные стадии это создание формы (shape), обтягивание текстурами, освещение, создание перспективы, глубины резкости (depth of field) и сглаживания (anti-aliasing).

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

Поверхностные текстуры (surface textures)
Когда мы встречаем какую-нибудь поверхность в реальном мире, мы можем получить информацию о ней двумя способами — посмотреть на поверхность под разными углами или потрогать ее и определить, мягкая она или твердая. В трехмерной графике мы можем только смотреть на поверхность, получая при этом всю доступную информацию. И эта информация складывается из трех составляющих:
1. Цвет. Какого поверхность цвета? Однородно ли она окрашена?
2. Текстура. Ровная ли поверхность или на ней есть вмятины, бугры, рихтовка или что-то подобное?
3. Отражающая способность. Отражает ли поверхность свет? Четкие ли отражения или они размазаны?
Один из способов придания «реальности» объекту и состоит в подборе комбинации этих трех составляющих в различных частях изображения. Посмотрите вокруг себя: ваша компьютерная клавиатура имеет цвет/текстуру/отражающую способность, отличающуюся от вашего стола, который в свою очередь отличается цветом/текстурой/отражающей способностью от вашей руки. Для того чтобы цвет изображения был похож на настоящий, важно чтобы компьютер мог выбирать цвет пикселя из палитры в миллионы различных цветов. Разнообразие текстур зависит как от математической модели поверхности (от кожи лягушки до желеобразного материала) так и от карт текстур (texture maps), которые накладываются на поверхности. Также необходимо заложить в объекты те качества, которые нельзя увидеть (мягкость и твердость, теплоту и холод) с помощью различных комбинаций цвета, текстуры и отражающей способности. Если ошибиться хотя бы в одном из этих параметров, ощущение реальности мгновенно рассеется.

Освещение
Когда вы входите в темную комнату, вы включаете свет. И при этом не задумываетесь, как же свет, выходя из лампочки, распределяется по всей комнате. Но при разработке 3D-графики необходимо постоянно это учитывать, потому что все поверхности, окружающие каркас, должны быть откуда-нибудь освещены. Один метод, называемый методом бегущего луча (ray-tracing), вычерчивает путь, который воображаемый луч пройдет после выхода из лампы, отражения от зеркальных поверхностей и который, в конце концов, закончится на предмете. Луч осветит его с различной интенсивностью под различными углами. Метод кажется достаточно сложным даже при построении лучей от одной лампы, но в большинстве комнат существует множество источников света: несколько ламп, окон, свечей и т.д.
Освещение играет ключевую роль в двух эффектах, придающих ощущение веса и цельности объектам: затенения (shading) и тени (shadow).
Первый эффект затенения заключается в изменении интенсивности освещения объекта от одной его стороны к другой. Благодаря затенению шар выглядит круглым, высокие скулы выпирают на лице, а одеяло кажется объемным и мягким. Эти различия в интенсивности света совместно с формой усиливают иллюзию того, что объект, кроме высоты и ширины, имеет еще и глубину.
Иллюзия веса создается вторым эффектом: тенью. Твердые тела при освещении отбрасывают тень. Вы можете увидеть тень на солнечных часах или посмотреть на тень дерева на тротуаре. Если в трехмерном мире будут присутствовать тени, то вам будет еще больше казаться, что вы смотрите через окно на настоящий мир, а не на экран с математическими моделями.

Перспектива
Слово «перспектива» кажется техническим термином, но на самом деле оно описывает простейший эффект, который все мы наблюдаем. Если вы встанете на обочину длинной прямой дороги и посмотрите вдаль, то вам покажется что правая и левая полоса дороги сходятся в точку на горизонте. Если по обочине посажены деревья, то чем дальше деревья находятся от наблюдателя, тем они меньше. Вы заметите, что деревья сходятся в ту же точку на горизонте, что и дорога. Если все объекты на экране будут сходиться в одну точку, то это и будет называться перспективой. Бывают, конечно, и другие варианты, но в основном в трехмерной графике используется перспектива одной точки (рис. 4).
На приведенной иллюстрации руки выглядят разделенными, но в большинстве сцен одни объекты находятся впереди и частично блокируют вид на другие объекты. Для таких сцен программное обеспечение должно не только просчитать относительный размер объектов, но и учитывать информацию, какие объекты закрывают другие и насколько сильно. Наиболее часто для этого используется так называемый Z-буфер (Z-Buffer). Свое имя он получил от названия оси Z, или воображаемой линии, идущей за экран через сцену к горизонту. (Две другие оси — это ось X, измеряющая ширину сцены, и ось Y, измеряющая высоту сцены).
Z-буфер присваивает каждому полигону номер в зависимости от того, насколько близко к переднему краю сцены располагается объект, содержащий этот полигон. Обычно меньшие номера присваиваются ближайшим к экрану полигонам, а большие — полигонам, примыкающим к горизонту. Например, 16-битный Z-буфер присвоит ближайшему к экрану объекту номер -32768, а самому удаленному — 32767.
В настоящем мире наши глаза не могут видеть объекты, закрытые другими, поэтому у нас нет проблем в определении видимых объектов. Но эти проблемы постоянно возникают перед компьютером, и он вынужден непосредственно их решать. При создании каждого объекта, его Z-значение сравнивается со значением других объектов, занимающих те же области по координатам X и Y. Объект с самым маленьким Z-значением будет полностью прорисовываться, другие же объекты, с большими значениями, будут прорисованы лишь частично. Таким образом, мы не видим фоновых объектов, проступающих через персонажей. Так как Z-буфер задействуется перед полной прорисовкой объектов, скрытые за персонажем части сцены не будут прорисовываться вообще, что ускоряет графическую производительность.

Глубина резкости
Этот эффект также успешно используется в 3D-графике. Будем использовать тот же пример с деревьями, посаженными по обочине дороги. По мере удаления их от наблюдателя, помимо уменьшения, будет происходить еще один интересный эффект. Если вы посмотрите на ближайшие к вам деревья, то удаленные будут не в фокусе. Особенно это видно при просмотре фотографии или видеоролика. Режиссеры и компьютерные аниматоры используют этот эффект в двух целях. Первая состоит в усилении иллюзии глубины наблюдаемой сцены. Конечно же, компьютер может прорисовывать каждый объект сцены точно в фокусе, независимо от его удаления. Но так как в реальном мире эффект глубины резкости всегда присутствует, то прорисовка всех предметов в фокусе приведет к нарушению иллюзии реальности сцены.
Вторая причина использования этого эффекта заключается в привлечении вашего внимания к нужным предметам или актерам. Например, для усиления внимания зрителя к герою фильма режиссер будет использовать эффект малой глубины резкости, когда только один актер будет находиться в фокусе. С другой стороны, сцены, которые должны потрясать величием природы, используют эффект большой глубины резкости, чтобы дать как можно больше предметов в фокусе.

Сглаживание (anti-aliasing)
Сглаживаение — еще одна технология, призванная обмануть зрение. Цифровые графические системы очень хороши для создания вертикальных или горизонтальных линий. Но когда появляются диагонали и кривые (а они появляются очень часто в реальном мире), компьютер прорисовывает линии с характерными «лесенками» вместо ровных краев. Чтобы убедить ваши глаза в том, что они видят гладкую линию или кривую, компьютер добавляет вокруг линии пиксели с различными оттенками цвета линии. Эти «серые» пиксели создают иллюзию отсутствия «ступенек». Такой процесс добавления пикселей для обмана зрения называется сглаживанием, и он является одной из технологий, отличающих компьютерную 3D-графику от «ручной» графики. Задачи сохранения линий и добавления нужного количества «сглаживающих» цветов являются еще одним сложным делом для компьютера при создании 3D-анимации на вашем дисплее.
Когда все эти уловки, описанные выше, работают вместе, они позволяют создать сцену с потрясающим реализмом. В современных играх и фильмах компьютерные объекты совмещаются с фотографиями окружающей среды, что только усиливает иллюзию. Вы будете потрясены результатом, если станете сравнивать фотографии и компьютерные сцены.

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

Сколько кадров в секунду?
Когда вы смотрите фильм, то на самом деле видите последовательность изображений (кадров), меняющихся с частотой 24 кадра в секунду. Так как сетчатка глаза удерживает изображение чуть дольше 1/24 доли секунды, глаза большинства людей смешивают последовательность кадров в один непрерывный видеопоток.
Если посмотреть на этот процесс с другой стороны, каждый кадр является фотографией из фильма, снятой с экспозицией 1/24 секунды. Такая экспозиция намного превышает экспозицию обычной фотографии, при которой движущиеся объекты кажутся «застывшими в полете». В результате, если вы посмотрите на кадр фильма, показывающего гонки, то увидите, что некоторые машины кажутся смазанными, так как они двигались в то время, как затвор камеры был открыт. Это размазывание быстродвижущихся объектов мы и видим в реальной жизни. Поэтому изображение на экране выглядит реальным.
Однако цифровые трехмерные изображения не являются фотографиями, и движущиеся объекты в кадрах не смазаны. Для придания реалистичности движущимся объектам, программисты специально добавляют этот эффект. Некоторые дизайнеры преодолевают нехватку естественного «смазывания» увеличением числа кадров в игре с 30 до 60 кадров в секунду. При этом каждый кадр детально прорисовывается, а движение показывается через меньшие приращения. Но это очень сильно увеличивает количество кадров, которые должны быть прорисованы для какого-либо движения. Например, представьте себе скачки, которые продолжаются шесть с половиной минут. В фильме потребуется 24 (кадра в секунду) x 60 (секунд) x 6,5 (минут) или 9360 кадров для скачек. Цифровая трехмерная графика должна прорисовывать 60 кадров в секунду, что потребует 60x60x6,5 или 23400 кадров для того же отрезка времени.

Создавая «размазывание»
Эффект смазывания, который программисты добавляют для увеличения реализма движущихся изображений, называется «смазывание движения» (motion blur), или «пространственное сглаживание» (spatial anti-aliasing). Если вы когда-либо включали след мыши в Windows, то можете достаточно грубо представить себе эту технологию. Копии движущегося объекта прорисовываются позади текущего положения. Причем, четкость и интенсивность создаваемых копий уменьшается по мере удаления объекта от них. Длина следа от объекта, скорость «растворения» копий и другие детали могут изменяться в зависимости от скорости движения объекта, расстояния до наблюдателя и фокуса наблюдателя. Как видно, необходимо запрограммировать множество параметров и деталей, прежде чем создать реалистично движущийся объект.
Существуют и другие части изображения, где четкость графики компьютера должна быть принесена в жертву реализму. Это относится как к покоящимся, так и к движущимся изображениям. Хорошим примером являются отражения. Вы наверняка видели картинки хромированных автомобилей и космических кораблей, в точности отражающих все вокруг. В то время как хромированные отражения являются хорошей демонстрацией метода бегущего луча (ray-tracing), мы все же не живем в мире, где все объекты покрыты хромом. Деревянная мебель, мраморные полы и полированный металл — все это отражает окружающие предметы, но, конечно же, не так хорошо как зеркало. Отражения на этих поверхностях должны быть размыты, причем степень «размытия» на каждой поверхности должна быть разная. Тогда среда, окружающая игроков, будет выглядеть реалистичной.

Постоянное движение сложно реализовать на компьютере
Все что мы до сих пор обсуждали, только усложняет процесс вывода 3D-изображения на экран. Достаточно сложно высчитать и создать первоначальный объект, не менее сложно прорисовать его, создав все требуемые для изображения пиксели. Треугольники и полигоны каркаса, текстура поверхности, лучи света из различных источников, отражения от множества поверхностей — все это должно быть просчитано и соединено воедино перед тем как программа скажет компьютеру, какие пиксели требуется нарисовать на экране. Вы можете подумать, что сложная вычислительная работа заканчивается при начале прорисовки изображения, но кое-какие вычисления необходимо добавить и здесь.
Сегодня разрешение 1024×768 считается минимальным «высоким разрешением». Это означает что 786432 элемента изображения, или пикселя, должны быть прорисованы на экране. Если каждый элемент использует 32-битную цветовую палитру, то 25165824 бита должны быть обработаны для прорисовки одного изображения. Движение с частотой 60 кадров в секунду требует, чтобы компьютер обрабатывал 1509949440 бит информации в секунду (или почти 180 мегабайт) для прорисовки изображений. И это все без учета работы компьютера по наполнению игры содержанием, цветами, формами, освещением и всем тем, что необходимо, чтобы изображение выглядело так, как требуется. Когда вы представите себе весь масштаб вычислений, которые требуется произвести для прорисовки изображения, то поймете, почему графические карты перетягивают на себя все больше и больше вычислительных задач от центрального процессора.

Чем же помогают графические карты?
С ранних дней персональных компьютеров большинство графических плат представляли собой конверторы, переводящие созданное компьютером изображение в электрические импульсы, которые требовались монитору. Все это прекрасно работало, но всю обработку изображения выполнял центральный процессор компьютера, параллельно с обработкой звука, управления (в играх) и прерываний системы. Те же самые вещи компьютер должен выполнять и в современных 3D-играх или мультимедийных презентациях. Вам, наверное, уже стало понятно, почему даже самые быстрые процессоры перегружаются работой и не успевают выполнять все задачи в реальном времени. На помощь им приходят графические сопроцессоры или акселераторы. Работа разделяется между центральным процессором и акселератором, в результате производительность системы оказывается на должном уровне.
Как вы видели, первым шагом в построении трехмерного цифрового изображения является создание мира каркасов, состоящего из треугольников и полигонов. Мир каркасов превращается с помощью трансформации из трехмерного математического мира в набор объектов на двумерном экране монитора. Трансформированное изображение покрывается текстурами (производится рендеринг), учитывается освещение от нескольких источников, и, в конце концов, результат отображается на экране. Рядовые ускорители (типа VooDoo3 или TNT2) берут на себя работу по рендерингу (обтягиванию текстурами) после того как каркас был создан и трансформирован в двумерный набор полигонов. Этот шаг очень важен, но передовые ускорители помогает процессору даже на более ранних стадиях.
Характерным примером служит GeForce 256 от nVidia. Кроме процесса рендеринга (как в более ранних ускорителях), GeForce 256 может осуществлять трансформацию каркасов из 3D математического пространства в двумерное пространство, а также и некоторую работу по добавлению освещения. Поскольку и трансформация, и метод «бегущего луча» требуют серьезных математических операций с плавающей точкой, то центральный процессор хорошо разгружается. А так как графический процессор обычно узко специализирован на работу с графикой, то расчеты производятся достаточно быстро.
Новая Voodoo5 от 3dfx берет на себя еще одну часть работы. 3dfx называет эту технологию T-буфер (T-buffer). Технология призвана улучшить процесс рендеринга несколько другим способом, нежели перекладывание части работы на графический процессор. T-буфер служит для улучшения сглаживания с помощью создания четырех копий одного и того же изображения, немного сдвинутых друг от друга. Копии совмещаются, что приводит к легкому размытию краев объектов и устранению «лесенок», присущих компьютерному изображению. Та же самая методика применяется для размывания движущихся изображений (motion-blur), размытых теней и размывания глубины резкости фокуса (depth-of-field focus blurring). Все это позволяет изображениям выглядеть более четко и реалистично, что и требуется дизайнерам. Дизайн Voodoo 5 предусматривает выполнение полноэкранного сглаживания, поддерживая при этом быструю частоту смены кадров.
Компьютерная графика пройдет еще несколько этапов своего развития, прежде чем выйдет на уровень формирования совсем реалистичных изображений. Но сегодняшние достижения не менее значительны по сравнению с периодом текстовых мониторов. В результате миллионы людей могут наслаждаться играми и симуляторами с помощью уже существующей технологии. Уже становится понятным, что подобно Интернету, компьютерная графика станет весомой альтернативой телевидению.

Оригинал: www.howstuffworks.com/3dgraphics.htm


Рекомендуем почитать: