Какие элементы используются для создания трехмерных изображений
Перейти к содержимому

Какие элементы используются для создания трехмерных изображений

  • автор:

12.2 Технологии построения трёхмерного изображения

Для понимания принципа работы графического процессора рассмотрим вначале основные понятия, используемые при построении качественного трёхмерного изображения: вершина, полигон и текстура.

Объект в трёхмерном пространстве описывается набором полигонов, углы которых задаются точками, называемыми вершинами (vertex). Каждая вершина имеет три координаты по соответствующим трём осям: горизонтальной (X), вертикальной (Y) и глубины (Z). Соединяя вершины между собой можно аппроксимировать любую трёхмерную поверхность набором полигонов (многоугольников), простейшими из которых являются треугольники. При формировании изображения полигоны закрашиваются. Для этого часто прибегают к текстурам. Текстура – это двухмерное изображение, которое может “натягиваться” на трёхмерные объекты посредством закрашивания каждого полигона объекта с учётом расположения полигонов между собой.

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

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

Аппаратная реализация Z-буферизации значительно увеличивает производительность графического процессора. Главная характеристика Z-буфера – его разрешающая способность. Она критична для высококачественного отображения сцен с большой глубиной. Чем выше разрешающая способность, тем выше дискретность Z-координат и точнее выполняется рендеринг удаленных объектов. Если при рендеринге разрешающей способности не хватает, может случиться, что два перекрывающихся объекта получат одну и ту же координату Z, что вызовет искажение изображения. Как правило, видеокарты имеют 32-разрядный Z-буфер.

Кроме буфера глубины, позволяющего отсекать невидимые поверхности, для создания реалистичных трехмерных изображений необходимо учитывать, что объекты могут быть полупрозрачными. Эффект полупрозрачности создается путем объединения цвета исходного пикселя с пикселем, уже находящимся в буфере. В результате цвет точки является комбинацией цветов переднего и заднего планов. Для учета прозрачности объектов используется, так называемый, альфа-коэффициент прозрачности, который имеет значение от 0 до 1 для каждого цветового пикселя.

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

Для двойной буферизации требуется наличие двух областей, зарезервированных в буфере кадров. Метод Double Buffering использует два буфера кадров для получения изображения: один для отображения картинки, другой – для рендеринга. В то время как отображается содержимое одного буфера, в другом происходит рендеринг. Когда очередной кадр обработан, буферы переключаются (меняются местами). Без применения двойной буферизации изображение не будет иметь требуемой плавности, то есть будет прерывистым.

Технологии создания трехмерного изображения

Как я предполагаю, вы читаете эту статью на экране монитора, имеющего два измерения: высоту и ширину. Но когда вы смотрите мультик типа «Игрушечной истории 2» (Toy Story II) или играете в Томб Рейдер (Tomb Raider), экран вам кажется трехмерным. И что больше всего зачаровывает, вы можете наблюдать на экране реальный сегодняшний мир, мир в котором мы будем жить завтра, или мир, существующий только в воображении создателей компьютерной игрушки. И все эти миры появляются на одном и том же экране, который вы, возможно, минуту назад использовали для печати отчета о текущей котировке акций.

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

Что делает картинку трехмерной?

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

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

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

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

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

Что такое трехмерная графика?

  1. Создание виртуального 3D мира.
  2. Выбор части мира, которая будет демонстрироваться на экране.
  3. Задание представления для каждого пикселя на экране для максимальной реалистичности изображения.

Создание виртуального 3D мира

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

Какую часть виртуального мира показать на экране?

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

Программисты, создающие компьютерные игры, затрачивают огромные усилия на описание 3D мира, чтобы вы могли восхищаться этим миром и не встречать в нем ничего, что бы разубедило вас в его реальности. Вы же не хотите увидеть, как два твердых объекта проходят друг сквозь друга? Это сразу бы напомнило вам об иллюзорности виртуального мира.

И третий шаг включает в себя, по крайней мере, столько же компьютерных вычислений, как и первые два шага вместе взятые, если не больше. Причем этот шаг должен выполняться в реальном времени в играх и видеороликах. Мы более подробно рассмотрим его далее.

Как заставить это выглядеть настоящим?

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

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

Создание формы

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

 Каркас руки, изготовленный из малого количества полигонов - всего 862

На иллюстрации показан каркас руки, изготовленный из малого количества полигонов — всего 862

 Здесь замыкающие объект линии выглядят более естественными и закругленными. Но это требует большего количества полигонов: уже 3444

Здесь замыкающие объект линии выглядят более
естественными и закругленными. Но это требует большего
количества полигонов: уже 3444.

Поверхностные текстуры (surface textures)

  • Цвет: Какого поверхность цвета? Однородно ли она окрашена?
  • Текстура: Ровная ли поверхность или на ней есть вмятины, бугры, рихтовка или что-то подобное?
  • Отражающая способность: Отражает ли поверхность свет? Четкие ли отражения или они размазаны?

Один из способов придания «реальности» объекту и состоит в подборе комбинации этих трех составляющих в различных частях изображения. Посмотрите вокруг себя: ваша компьютерная клавиатура имеет отличающийся цвет/текстуру/отражающую способность от вашего стола, который в свою очередь отличается цветом/текстурой/отражающей способностью от вашей руки. Для того чтобы цвет изображения был похож на настоящий, важно чтобы компьютер мог выбирать цвет пикселя из палитры в миллионы различных цветов. Разнообразие текстур зависит как от математической модели поверхности (от кожи лягушки до желеобразного материала) так и от карт текстур (texture maps), которые накладываются на поверхности. Также необходимо заложить в объекты те качества, которые нельзя увидеть: мягкость и твердость, теплоту и холод с помощью различных комбинаций цвета, текстуры и отражающей способности. Если ошибиться хотя бы в одном из этих параметров, ощущение реальности мгновенно рассеется.

 Добавление поверхности к каркасу начинает изменять изображение от чего-то математического до картинки, в которой мы без труда обнаруживаем руку

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

Освещение

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

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

 Подсветка изображения не только добавляет глубину объекту через затенение, но и

Подсветка изображения не только добавляет глубину
объекту через затенение, но и «привязывает»
объект к земле посредством тени.

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

Перспектива

Слово перспектива кажется техническим термином, но на самом деле оно описывает простейший эффект, который все мы наблюдаем. Если вы встанете на обочину длинной прямой дороги и посмотрите вдаль, то вам покажется что правая и левая полоса дороги сходятся в точку на горизонте. Если по обочине посажены деревья, то чем дальше деревья находятся от наблюдателя, тем они меньше. Вы заметите, что деревья сходятся в ту же точку на горизонте, что и дорога. Если все объекты на экране будут сходиться в одну точку, то это и будет называться перспективой. Бывают, конечно, и другие варианты, но в основном в трехмерной графике используется перспектива одной точки, описанная выше.

 Пример перспективы: точка исчезновения

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

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

В настоящем мире, наши глаза не могут видеть объекты закрытые другими, поэтому у нас нет проблем в определении видимых объектов. Но эти проблемы постоянно возникают перед компьютером, и он вынужден непосредственно их решать. При создании каждого объекта, его Z-значение сравнивается со значением других объектов, занимающих те же области по координатам X и Y. Объект с самым маленьким Z-значением будет полностью прорисовываться, другие же объекты с большими значениями будут прорисованы лишь частично. Таким образом, мы не видим фоновых объектов, выступающих через персонажей. Так как Z-буфер задействуется перед полной прорисовкой объектов, скрытые за персонажа части сцены не будут прорисовываться вообще. Это ускоряет графическую производительность.

Глубина резкости

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

Вторая причина использования этого эффекта заключается в привлечении вашего внимания к нужным предметам или актерам. Например, для усиления вашего внимания к герою фильма, режиссер будет использовать эффект малой глубины резкости (shallow depth of field), когда только один актер будет находиться в фокусе. С другой стороны, сцены, которые должны потрясти вас величием природы, используют эффект большой глубины резкости (deep depth of field) чтобы дать как можно больше предметов в фокусе.

 Глубина резкости в перспективе

Сглаживание (anti-aliasing)

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

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

 Прорисовка серых пикселей вокруг линий несколько их размывает. Эффект помогает убрать лесенки и делает объект более реалистичным

Прорисовка «серых» пикселей вокруг линий
несколько их размывает. Эффект помогает убрать
«лесенки» и делает объект более реалистичным.

Пример из настоящего

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

 Фотография тротуара около нашего офиса

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

 Фотография с шариком номер раз

Кадр A

 Фотография с шариком номер два

Кадр B

Можете ли вы указать кадр с настоящим мячиком? Ответ приведен в конце статьи.

Создавая трехмерное движение

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

Сколько кадров в секунду?

Когда вы просматриваете фильм в ближайшем кинотеатре, на самом деле вы видите последовательность изображений, называемых кадрами, меняющихся с частотой 24 кадра в секунду. Так как сетчатка глаза удерживает изображение чуть дольше 1/24 доли секунды, глаза большинства людей смешивают последовательность кадров в один, непрерывный видеопоток.

Если посмотреть на этот процесс с другой стороны, каждый кадр является фотографией из фильма, снятой с экспозицией 1/24 секунды. Такая экспозиция намного превышает экспозицию обычной фотографии, при которой движущиеся объекты кажутся «застывшими в полете». В результате, если вы посмотрите на кадр фильма, показывающего гонки, вы увидите, что некоторые машины кажутся смазанными (blurred), так как они двигались в то время как затвор камеры был открыт. Это размазывание быстродвижущихся объектов мы и видим в реальной жизни. Поэтому изображение на экране выглядит реальным.

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

Создавая «размазывание»

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

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

Постоянное движение сложно реализовать на компьютере

Все что мы до сих пор обсуждали, только усложняет процесс вывода 3D изображения на экран. Достаточно сложно высчитать и создать первоначальный объект, не менее сложно прорисовать его, создав все требуемые для изображения пиксели. Треугольники и полигоны каркаса, текстура поверхности, лучи света из различных источников, отражения от множества поверхностей, все это должно быть просчитано и соединено воедино, перед тем как программа скажет компьютеру, какие пиксели требуется нарисовать на экране. Вы можете подумать, что сложная вычислительная работа заканчивается при начале прорисовки изображения, но необходимо и здесь добавить кое-какие вычисления.

Сегодня, разрешение 1024×768 считается минимальным «высоким разрешением». Это означает что 786.432 элемента изображения, или пикселя, должны быть прорисованы на экране. Если каждый элемент использует 32-битную цветовую палитру, то 25.165.824 бита должны быть обработаны для прорисовки одного изображения. Движение с частотой 60 кадров в секунду требует, чтобы компьютер обрабатывал 1.509.949.440 бит информации в секунду для прорисовки изображений. И это все без учета работы компьютера по наполнению игры содержанием, цветами, формами, освещением и всем тем, что необходимо, чтобы изображение выглядело так, как требуется. Когда вы представите себе весь масштаб вычислений, которые требуется произвести для прорисовки изображения, то вы поймете, почему графические карты перетягивают на себя все больше и больше вычислительных задач от центрального процессора. Центральному процессору нужна такая помощь.

Трансформация и процессоры: работайте негры, солнце еще высоко

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

  • X = 758 — высота мира, на который мы смотрим.
  • Y = 1024 — ширина мира, на который мы смотрим.
  • Z = 2 — глубина (от переднего края до заднего) мира, на который мы смотрим.
  • Sx — высота нашего окна в этот мир
  • Sy — ширина нашего окна в этот мир
  • Sz — значение глубины, которое определяет, какие объекты видны, а какие — закрыты другими объектами.
  • D = 0,75 — расстояние между нашими глазами и окном в этот воображаемый мир.

Вначале, мы посчитаем размер окон в этот мир.

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

Итак, точка (X, Y, Z, 1.0) в трехмерном воображаемом мире изменит свои координаты на (X’, Y’, Z’, W’), что и демонстрируют следующие вычисления.

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

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

Чем же помогают графические карты?

С ранних дней персональных компьютеров, на большинстве графических плат были установлены конверторы (translators), переводящие созданное компьютером изображение в электрические импульсы, которые требовались монитору. Все это прекрасно работало, но всю обработку изображения выполнял центральный процессор компьютера, параллельно с обработкой звука, управления (в играх) и прерываний системы. Те же самые вещи компьютер должен выполнять и в современных 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 предусматривает выполнение полноэкранного сглаживания, поддерживая при этом быструю частоту смены кадров.

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

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

О 3D-графике простыми словами

Привет меня зовут baldurk. Я уже несколько лет работаю программистом графики, поэтому хоть я и не в коем случае не являюсь экспертом, кажется, я уже многое понимаю во всём том, что касается работы с графикой.

Идея этой серии постов уже давно витала где-то на периферии моего сознания, и снова всплыла после прочтения интересной статьи с разбором последней Deus Ex.

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

Есть много составляющих, необходимых для создания даже простой 3D-игры, не говоря уж о таком проекте, как Watch Dogs.

У меня есть только общее представление о том, что нужно рассмотреть в этой статье, но это будет зависеть от того, какие темы вызовут интерес. Тем не менее, основная идея заключается в том, чтобы создать общее описание того, что происходит внутри современной игры, не отпугнув при этом никого из читателей — я буду предполагать, что у вас нет знаний математики и программирования. Если вы знаете разницу между ЦП и графической картой, и отличаете оперативную память от жёсткого диска, то этого будет вполне достаточно, а остальное я объясню.

Эта статья будет развиваться в соответствии с её видеопрохождением Chip & Ironicus’s Let’s Play of Watch Dogs, чтобы немного структурировать изложение. Игра хорошо известна своей графикой (причём мнения о ней могут быть полностью противоположными), и в ней есть множество аспектов, которые можно рассмотреть на отдельных примерах. Возможно, я расскажу и о других играх.

Начну я с объяснения основ, которые почти одинаковы для каждой игры, но также я рассмотрю и некоторые техники и визуальные эффекты Watch Dogs.

Я буду использовать инструмент под названием RenderDoc, который я написал в свободное время. Он применяется для отладки проблем с графикой — инструмент позволяет разложить на часть кадр графики, и благодаря этому мы увидим, как он собирается вместе.

В этой анимации показана часть постепенно создаваемого кадра в процессе его отрисовки графической картой.

Большинство людей знает, что компьютерная графика (да и графика любого другого видео) состоит из серии неподвижных кадров, каждый из которых отображается определённую долю секунды. В кино традиционно использовали 24 кадра в секунду (frames per second, FPS), в телевидении частота примерно такая же, около 24-30 кадров. В играх FPS может быть переменчивым, потому что в каждом кадре выполняется множество работы. Падение частоты ниже 30 нежелательно, хотя и случается довольно часто. Обычно верхним пределом для консольных игр является 60 FPS. Разработчики стремятся реализовать частоту 30 или 60, что зависит от целей игры. На PC при наличии дисплея с высокой частотой кадров можно добиться 90, 120 или даже выше. Причина этих конкретных чисел заключается в вертикальной синхронизации (vsync), о которой мы расскажем ниже.

Мысленно мы можем взглянуть на эту задачу с противоположной стороны — вместо того, чтобы смотреть, насколько высока частота FPS, мы смотрим на то, насколько мало время, выделенное на каждый кадр. Если мы хотим, чтобы игра работала с частотой 30 FPS, то на выполнение всей необходимой для кадра работы у нас есть только 33 миллисекунд. При 60 FPS время в два раза меньше — около 17 миллисекунд. Даже для компьютера такой промежуток времени не очень велик, учитывая тот объём работы, который нужно выполнить. Чтобы дать вам представление о величинах, то по приблизительным подсчётам пуля перемещается примерно на 1 метр в миллисекунду.

В основном мы будем говорить о PC, потому что эта платформа открыта, и я не могу рассказывать о консолях без опаски нарушить соглашения о неразглашении (NDA). Всё равно в основном я буду рассказывать о том, что не сильно отличается на консолях, а если что-то всё-таки будет отличаться, то я подчеркну это. Что касается мобильных платформ, то большинство различий между оборудованием PC/консолей и мобильного оборудования не относится к теме моей статьи.

Честно говоря, я поставил сюда эту картинку, чтобы вы понимали, что в статье будет не только текст.

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

Добавлю, что я буду рассматривать 3D-игру с достаточно традиционным рендерингом, наподобие Watch Dogs — многие из базовых принципов применимы и к 2D-играм, но на них демонстрировать концепции немного сложнее. Также поясню (особенно программистам графики), что в первую очередь стремлюсь к пониманию, поэтому, возможно, буду использовать достаточно сомнительные объяснения, если они позволят мне достичь своей цели.

Часть 2. Из чего состоит кадр

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

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

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

Разные примеры промежуточных изображений, используемых при построении кадра Watch Dogs.

В этой статье я не буду рассматривать каждое из изображений, использованных в кадре Watch Dogs, а расскажу только об основных, чтобы вы могли чему-то научиться. Это область, в которой постоянно происходят исследования графики и возникают новые техники. Инновации возникают и на более мелких уровнях, но когда маркетинг говорит вам о какой-то новой графической функции, то обычно имеется в виду именно подобные усовершенствования.

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

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

3D-модель целиком состоит из взаимосвязанных треугольников, образующих форму объекта. Каждый треугольник имеет три точки, называемые вершинами, и поскольку треугольники связаны друг с другом, вершины могут быть общими для нескольких треугольников. Позже мы вернёмся к этому, потому что вершины и треугольники достаточно важны. Также стоит помнить, что некоторые объекты, например, персонажей или деревья перед отрисовкой необходимо анимировать. Модель создаётся в стандартной статической форме, а анимации применяются в каждом кадре. К этому мы тоже вернёмся.

Это 3D-модель головы Эйдена Пирса после анимирования. Треугольники видны, потому что они отрисованы плоскими, а не сглажены, как это бывает обычно.

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

Эта аналогия более уместна, чем можно подумать, потому что эти текстуры обычно создаются «разворачиванием» 3D-модели в плоскую заготовку, как это делается с бумажной моделью, после чего поверх неё рисуется текстура. Такое разворачивание часто выполняется автоматически, но в случае особо сложных объектов может производиться вручную.

Это текстура, соответствующая показанной выше модели головы Эйдена Пирса. Тут есть части для зубов и языка. Заметьте, что область над его лбом не текстурирована, потому что постоянно закрыта Легендарной Бейсболкой Эйдена Пирса™.

Примечание

Очень часто говорят о различных «скинах» моделей, особенно в случае настраиваемых персонажей. Сегодня то, что называют «скином», обычно относится к небольшим изменениям в модели — новый ремень или другая шляпа — но изначально этот термин возник, потому что использовалась одна и та же модель, но менялась текстура (или «скин» — буквально переводится как «кожа») для создания персонажа, выглядящего иначе. Даже сегодня с помощью таких текстур можно создать большую вариативность NPC или объектов, что экономит время и деньги — не нужно создавать множество уникальных 3D-моделей. Разная одежда, которую может надевать Эйден — это чаще всего просто различные текстуры одной и той же модели.

Вот краткий фрагмент поворота головы 3D-модели. Наложена только текстура, и ничего более.

В рассматриваемом нами кадре есть примерно 1700 объектов, отрисовываемых в части основного рендеринга. Некоторые из них будут одинаковыми моделями — такие объекты, как цветы в горшках и мусорные баки на самом деле никогда не создаются по отдельности, это одна модель или несколько моделей, размещаемых в разных местах. Однако примерное количество отрисовываемых для завершения кадра объектов близко к 4700 — это даёт нам представление о том, сколько дополнительной работы необходимо выполнить кроме отрисовки всех этих моделей.

Давайте взглянем ещё на один пример объекта — бейсболку, которую носит Эйден.

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

Примечание

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

Чтобы показать, что может пойти не так при разработке, и продемонстрировать, как можно повеселиться при программировании графики, мы можем провести небольшой эксперимент. Так как большинство текстур имеет стандартный квадратный размер, а способ заворачивания и разворачивания текстур на модели тоже одинаков, то почему бы немного с ними не поиграть? Что случится, если мы применим текстуру головы Эйдена к модели бейсболки?

Уже не очень похоже на Легендарную Бейсболку Эйдена Пирса.

Там, где на текстуре бейсболки был логотип, на текстуре головы расположены ухо и зубы. Там, где был козырёк, на текстуре головы только волосы. Наложение выполнено абсолютно так же, но использована другая текстура. Разумеется, этот пример будет в игре ошибкой, но подумайте о том, что можно сделать, если анимировать текстуру или заставить её мерцать — в играх подобные вещи используются для различных эффектов, которые теперь вы сможете замечать. В частности, игра Saint’s Row 4 использует подобное для спецэффектов «симуляции».

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

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

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

Часть 3. Что рисовать не нужно

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

Над отрисовкой кадра совместно трудятся центральный процессор и графическая карта. В ЦП выполняется вся остальная часть игры, поэтому он принимает решение о том, какие объекты должны отрисовываться в текущем кадре, куда смотрит камера, какие анимации воспроизводятся. Графическая карта — это «рабочая лошадка», которая выполняет всю сложнейшую работу, связанную с отрисовкой пикселей, именно поэтому она является отдельным специализированным устройством.

Оказывается, и у ЦП, и у графической карты есть ограничения на скорость или объём вычислений, но это разные типы ограничений.

В целом ЦП больше интересует собственная часть работы: сколько объектов нам нужно отрисовать всего? Насколько отличаются эти объекты — это 100 одинаковых фонарей, или 100 кустов/растений/деревьев? Анимированы ли эти объекты, движутся ли динамически, и какие из них статичны или неподвижны?

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

В этой анимации мы поворачиваем камеру, показывая пустоту за игроком. Внимательные зрители заметят, что она не совсем пуста.

Сложно выработать в этом случае какие-то практические правила, но в целом можно отрисовать в сцене около 1000 объектов, не заботясь о нехватке места. Однако если нужно отрендерить 5000 объектов, то стоит задуматься о применении трюков. Не забывайте, что в большинстве игр, где игрок может управлять камерой, мы не можем знать, под каким углом он взглянет, поэтому нужно сохранять пространство для манёвра.

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

Даже если вы смотрите на то, что находится перед вами в сцене, это не значит, что необходимо отрисовывать весь город полностью. Если слева или справа есть огромное здание, то всё за ним становится невидимым, поэтому можно это не отрисовывать. Аналогично, некоторые объекты в отдалении становятся очень мелкими, поэтому нам не нужно волноваться об отрисовке крошечных растений и кустарников вдалеке.

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

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

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

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

Так как действие нашего кадра из Watch Dogs происходит в городе, мы можем взглянуть на него сверху, чтобы приблизительно понять, что же именно отрисовывается. На этой статичной картинке особенно заметно, что Watch Dogs выполняет работу поквартально.

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

На изображение наложена примерна область видимости камеры. Ширина этого треугольника зависит от зоны видимости (Field of View) — иногда в играх это настраиваемая опция, иногда постоянное значение.

Вот каркасное отображение сцены, область видимости камеры ограничена белым.

Кто-нибудь из вас уже мог подумать о небольшом трюке, который бы позволил обойти ограничение отрисовки определённого количества объектов — почему бы не сделать объекты очень сложной комбинацией всего в небольшой области, вплоть до отдельных листьев? Тогда отрисовки 1000 объектов будет более, чем достаточно.

Но здесь мы сталкиваемся с совсем другим набором ограничений — графические карты имеют ограниченную производительность, и чем сложнее объект, тем дольше будет происходить его отрисовка. То есть даже один объект, если он достаточно сложен, может снизить частоту кадров игры до 20 FPS. В том числе и поэтому я говорил, что ограничение на количество объектов довольно нечёткое.

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

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

Есть ещё один набор техник под названием «уровни детализации» (level of detail, LOD), который специально создан для решения подобных проблем. Аналогично тому, что мы можем оптимизировать количество объектов, отсекая всё ненужное, мы можем увеличить запас «сложности», устранив лишнее.

Один из приёмов на самом деле хорошо известен — это изменение разрешения текстур. Эта тема обычно пересекается со множеством других, поэтому я постараюсь объяснить её доступно.

Текстуры в играх обычно являются прямоугольниками с размерами, равными степени двойки — 512, 1024, 2048, 4096. На то есть множество причин, но одно из преимуществ этого заключается в том, что можно взять текстуру размером 1024×1024 и запросто создать её уменьшенную версию размером 512×512.

По причинам, о которых я расскажу ниже, всегда необходимо, чтобы у текстуры были всевозможные версии меньшего размера. То есть у текстуры размером 1024×1024 будут уменьшенные версии размером 512×512, 256×256, 128×128, 64×64, 32×32, 16×16, 8×8, 4×4, 2×2 и 1×1. Однако одно из преимуществ этого в том, что если далёкие объекты имеют на экране небольшой размер, то накладывать на них текстуру 1024×1024 — значит зря тратить ресурсы. Мы можем сэкономить, использовав меньшие версии той же текстуры.

Аналогично, даже близкие объекты можно считать не особо значимыми и использовать для них текстуры поменьше.

Примечание

Также можно применить этот процесс упрощения и к используемым в игре моделям, хоть сделать это и гораздо сложнее. Создавая упрощённые версии сложных объектов, можно сделать так, чтобы на большом расстоянии они не отъедали часть ограниченного запаса сложности.

Благодаря упрощённым объектам и обрезанным моделям можно сильно сэкономить и такой подход приходится использовать в любой игре наподобие Watch Dogs. Но в то же время он может быть огромной растратой ресурсов. Необходимо принять очень продуманное и взвешенное решение о том, сколько потребуется упрощённых версий моделей. Если их будет слишком мало, то вам или не удастся слишком много сэкономить, или будет заметны скачки качества при их смене. Если их будет слишком много, то вы впустую займёте память и потратите человеко-часы, необходимые на создание объектов.

Вот как выглядят сложные объекты и персонажи на расстоянии, когда они неотличимы от своих высокодетализированных версий.

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

В предыдущей части я сказал, что расскажу о том, почему очень сложно правильно реализовать отражения и другие подобные вещи. Причина довольно проста — запасы производительности и ресурсов, о которых я постоянно твержу, не меняются в зависимости от того, есть у вас отражения или нет. Если вы хотите создать отражение, которое может снова отобразить всю сцену, то придётся заново выполнять всю ту работу, о которой я говорил. Кроме того, отражения очень сильно зависят от того, под каким углом мы на них смотрим, поэтому для получения точных отражений у каждого отражающего объекта они должны быть своими!

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

Обычно полностью избежать отражающих поверхностей сложно, поэтому в играх используются заранее отрендеренные изображения ближайшего окружения, что даёт «достаточно хороший» результат. Но они не выдерживают пристального изучения, и если внимательно посмотреть на отражения, то вы увидите, что это имитация. Существуют современные техники, помогающие создавать отражения в определённых условиях, и возможно позже я о них расскажу, но такие заранее отрендеренные («пререндеренные») изображения всё равно нужны.

Это пререндеренное изображение называется «кубической картой» (cube map). Оно не совсем точно относительно места, в котором стоит Эйден, но достаточно к нему близко.

Watch Dogs выполняет рендеринг отражений в реальном времени. Я не исследовал этот вопрос подробно, но полагаю, что они всегда рендерятся, когда персонаж находится на улице, и в основном используются для того, чтобы получать его точные отражения на автомобиле, в котором он сидит, чтобы улучшить изображение и придать ему лёгкое ощущение реальности. Так как игрок всегда сосредоточен на своей машине и ближайшем окружении, то факт неправильности отражений на других автомобилях едва заметен.

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

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

Это решение было намеренным и принималось непросто. Запас — величина постоянная, поэтому если оставить место для этих отражений, то нужно принести в жертву что-то ещё.

Вот очень «фишайное» отображение сцены вокруг Эйдена с видом снизу, сделанное для отражений. Сориентироваться можно по двум фонарям и рельсам поезда.

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

Примечание

Наиболее очевидным и самым значимым источником дающего тени освещения является солнце (или луна, если дело происходит ночью). Так как солнце огромно, для него обычно рендерится 3-5 изображений, а не одно, как в случае фар или фонарика.

К сожалению, это один из случаев, когда Watch Dogs не может служить хорошим примером. Расчёт теней в игре довольно сложен и, как мне кажется, специально оптимизирован для случая отбрасывания теней в городе. Поэтому я лучше переключусь на Far Cry 4 и рассмотрю вычисление теней на примере кадра из этой игры.

Вот сцена из Far Cry 4, которую я использую просто для примера.

Вот изображение с информацией о тенях этой сцены — для каждого из них требуется совершенно новый рендеринг сцены.

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

Ещё одно следствие, которое очень легко упустить — необходимость создания изображения затенения для каждого источника освещения. Во многих случаях удаётся упростить источники освещения, объединив их — в Watch Dogs такое происходит с фарами автомобилей.

Когда включены обе фары, то отрисовывается только один источник освещения, но имеющий особую форму, из-за которого он выглядит как два луча. Если у фар есть тени, то это сделать уже не так просто, и будет гораздо заметнее — когда игрок пройдёт перед автомобилем, то свет будет идти откуда-то между двумя фарами. Возможно, тогда придётся разделить фары, но при этом не только появятся дополнительные затраты на вычисление теней, но и придётся отрисовывать новое освещение.

Основное, что я хотел подчеркнуть всем этим — это компромиссы. Мы совершенно точно можем избавиться от всех этих аппроксимаций, но придётся потратить на это наши запасы ресурсов, то есть пожертвовать чем-то другим. Каждый разработчик игр должен решать, над чем ему важно сосредоточиться в игре, и что будет наиболее впечатлять или сильнее всего раздражать игрока.

Часть 4. Двигаем вершины

В этой части я подробнее расскажу о технических деталях анимирования объектов в сцене.

Программисты графики часто говорят о «графическом конвейере» (graphics pipeline). 3D-графика немного напоминает сборочный конвейер с чётко заданным перемещением от одного этапа к другому, однако она не работает одновременно только с одним объектом.

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

Примечание

Я буду пропускать многие подробности, чтобы объяснить интересные и важные принципы. В этой части мы рассмотрим первую часть конвейера, которая называется «вершинным шейдером» (Vertex Shader).

Шейдеры получили широкое распространение около 16 лет назад, после выпуска DirectX 9, в котором появились вершинные и пиксельные шейдеры. Чтобы объяснить, что такое шейдеры, и сравнить их с тем, что было раньше, я расскажу о той работе, которую они выполняют.

Каркасная голова Эйдена снова с нами.

Напомню, что в части 2, мы рассматривали модели, из которых создаётся игровой мир. Эти модели состоят из отдельных точек, называемых вершинами, которые соединены в треугольники. Я сказал, что подробнее расскажу о них позже, и теперь выполняю своё обещание.

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

Давайте рассмотрим простой пример того, чем нам предстоит заниматься — перемещение и расположение объектов в мире. Для начала возьмём простой случай, не персонажа.

При создании объектов в 3D-редакторах наподобие Maya и 3D Studio Max художники всегда строят из в собственном отдельном мире. Эти объекты не создаются сразу в антураже Чикаго, скорее их окружение похоже на «пустую белую комнату» из «Матрицы». Каждый объект располагается в центре абсолютной пустоты.

Вот какой-то светофор, находящийся в игре где-то под рельсами, и он расположен в собственном мире.

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

Здесь мы видим несколько светофоров, уже размещённых в частично построенной финальной сцене.

Как я упоминал выше, единственно, с чем мы можем работать — это вершины. Мы не можем просто сказать графической карте: «Можешь поместить этот светофор под мост? А потом поставить ещё один чуть дальше? Отлично!»

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

Примечание

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

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

Я взял один из вершинных шейдеров, которые используются в Watch Dogs, и немного поэкспериментировал с ним, чтобы показать, что он делает. Это довольно кропотливая работа, но мне удалось найти вершинный используемый для персонажей шейдер и изменить его. Есть другой вершинный шейдер, используемый для кожи, например, для лиц и рук, но вы быстро поймёте принцип.

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

На показанной выше анимации видно, что персонажи как-то странно искажены. Это возвращает нас к принципу «если переместить каждую вершину, то это аналогично перемещению всего объекта». Внесённое в вершинный шейдер изменение работает только для одной вершины за раз, но поскольку все они работают с одинаковым искажением, эффект в результате применяется ко всему объекту.

Можно также внести изменения в часть преобразования, ответственное за «простое перемещение на место», чтобы вместо расположения персонажа в нужном месте она поднимала его над землёй. Это не симулируется с помощью физики, поэтому никак не связано с гравитацией или коллизиями с другими объектами — при желании мы можем заставить всех парить в воздухе.

В этой анимации мы заставили вершинный шейдер постепенно поднимать и опускать объект.

Очевидно, что всё это не слишком конструктивно, однако даёт нам общее представление о том, как работают вершинные шейдеры — если бы теперь мы хотели анимировать листья на деревьях, чтобы они раскачивались, то сделали бы примерно то же самое. Только вместо поднятия и опускания они бы качались в направлении ветра. Затем мы можем менять силу ветра, чтобы деревья раскачивались сильнее или слабее.

Здесь мы видим, что происходит, когда всё увеличивается примерно в семь раз.

Я немного упрощаю, но в основном задачей большинства вершинных шейдеров и является «перемещение объектов на место». Исключение составляют все анимированные объекты — люди, животные, а также такие предметы, как качающиеся верёвки, развевающаяся одежда и т.д.

Анимирование людей связано с идеей применения скелета и «скина». Скелет — это простое описание подвижного персонажа. На этом этапе нас волнуют не анимированные пряжки, шляпы или джинсы — нам важны только важные движения, наиболее соответствующие скелету человека.

Здесь показан простой скелет фигуры человека. Он взят не из Watch Dogs, потому что скелет сложно визуализировать вне пределов 3D-редактора.

Это поза привязки или T-поза, демонстрирующая, как выглядит персонаж без применения анимаций.

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

После создания скелета каждая вершина привязывается к одной или нескольким костям в этой статичной позе, и эта связь называется «скиннингом». Во времена Half-Life 1, когда начала использоваться эта технология, каждая вершина связывалась только с одной костью. В наши дни могут присоединяться даже к четырём костям, при этом каждой кости придаётся вес, от которого зависит степень влияния кости на вершину. Благодаря этому можно получать более плавную анимацию, позволяя костям пересекаться в разных областях без создания резких углов при движении рук или ног.

Это показанный выше скелет с повёрнутой костью бедра. Цвета показывают веса кости бедра относительно вершин модели.

У этой технологии есть свои ограничения, особенно в тех местах, где одежда и кожа сжимаются или растягиваются в шарнирах, например, на локтях и плечах. Это неидеальный, но очень эффективный способ анимирования. Самое серьёзное ограничение — таким образом очень сложно создавать убедительные анимации лиц. Можно создать на лице множество «фальшивых» костей, например для бровей и вокруг рта, но это будет всего лишь грубым приближением мышц и кожи.

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

Если модель не соответствует используемому ею скелету, то анимации будут совершенно неверными.

Если мы сделаем персонажа раза в два шире, то получим эффект, похожий на «объевшегося пончиков Дрейка», но заметно, что ближе к кистям анимации становятся неправильными, потому что именно здесь они дальше всего от своих исходных позиций.

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

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

Из чего состоит 3D модель. Создание 3D моделей

Image1 Image2 Image3 Image4

Любую даже самую сложную фигуру или поверхность можно представить в виде множества простых фигур: такая идеальная фигура, как шар (точнее, сфера), в компьютерной графике в любом случае представляется в виде множества треугольников и четырёхугольников. Чем их будет больше, тем выше степень приближения, то есть, тем более гладкой, тем более сферической будет поверхность. Но опять-таки, это вопрос степени приближения.

I. Из чего состоит трёхмерная модель? — вершины, грани, полигоны, текстуры, карты нормалей

Вообще, если приходится объяснять в подробностях, что из себя представляет трёхмерная модель, неизбежно придётся забираться в геометрические дебри, — без них никак. И как ни объясняй всё «на пальцах», всё-таки обойтись без ключевых терминов, увы, не получится.

1. Вершина (ед. Vertex, мн. Vertices) — грубо говоря, это абстрактная геометрическая точка с координатами X, Y и Z. Вершиной она называется, впрочем, потому, что является крайней точкой либо замкнутого полигона (плоского многоугольника), либо объёмной фигуры.
2. Грань (Edge) — отрезок прямой, соединяющий две вершины. Опять же, в трёхмерной графике это не самостоятельное нечто, а лишь ограничитель для полигонов.
3. Полигон (poly, polygon) — основная функциональная составляющая: плоская многоугольная фигура (обычно трёхмерные редакторы и другие приложения предпочитают оперировать только треугольниками и четырёхугольниками), из множества которых состоит поверхности трёхмерной фигуры.
Любую даже самую сложную фигуру или поверхность можно представить в виде множества простых фигур: такая идеальная фигура, как шар (точнее, сфера), в компьютерной графике в любом случае представляется в виде множества треугольников и четырёхугольников. Чем их будет больше, тем выше степень приближения, то есть, тем более гладкой, тем более сферической будет поверхность. Но опять-таки, это вопрос степени приближения.
4. Текстура — изображение, покрывающее поверхность трёхмерной фигуры, используется для придания трёхмерной фигуре материальной достоверности, так сказать. О текстурах и материалах подробно речь пойдёт в следующей части.
5. Нормаль и карта нормалей — нормалью в принципе называется вектор, перпендикулярный поверхности в каждой данной её точке. Карта нормалей — это определённого рода текстура, цветовая информация которой (то есть, цвет каждого пикселя) считывается как информация о расположении нормали каждой точке того или иного объекта; с помощью карты нормали можно сформировать иллюзию более сложной поверхности, чем она есть на самом деле.

Зачем это нужно? Для экономии полигонов, конечно. Благодаря картам нормалей низкополигональным моделям можно придать вид очень высокополигональных (естественно, с известной долей приближения, но всё-таки). Ранее эта технология не слишком активно применялась по той причине, что карты нормали были крайне сложны в изготовлении — до появления таких пакетов, как MudBoxи ZBrush (и Blender3D), в которых поддерживается технология «скульптурного» моделирования, изготовить правильную карту нормалей было подчас задачей весьма и весьма нетривиальной.

В 2004 году id Software выпустили Doom III, где Normal Mapping использовался повсеместно, и с тех пор эта технология стала уже некоторым образом «общим местом». Особенно в силу того, что «скульптурное» моделирование значительно облегчает жизнь в плане дизайна.

II. Скульптурное моделирование
Собственно, это определение стоит понимать самым буквальным образом, это именно имитация ваяния, точнее, лепки из пластилина или глины. Инструментарий, который предоставляют MudBox, ZBrush и Blender, позволяет производить над моделью массу хитроумных манипуляций, в точности так, как если бы она была из глины или какого-то другого подобного материала. В ZBrush даже цвет по умолчанию очень характерный: глинисто-красный.

Ну, а что с его помощью можно сделать — так вот пожалуйста:

Но это — сотни тысяч, миллионы полигонов. А качественно снятая карта нормалей, как уже сказано выше, позволяет создать иллюзию множества мелких деталей на совсем простой поверхности.
III. Создание 3D модели: придать простому вид сложного
Итак, практически на ваших глазах создадим самое примитивное нечто: кубик. Примитивнее некуда: 8 вершин, 6 граней, 12 рёбер — базовая структура.

Теперь у нас в программе есть режим «лепки». Используем по полной: подвергнем форму кубику ужасным истязаниям:

В результате у нас получилось вот такое странное нечто: высокополигональная, детализированная фигура с очень сложной поверхностью, где счёт вершинам и полигонам переваливает за 45 тысяч. А в чем проблема? — спросит внимательный читатель. А в том, что, когда мы скажем нашему компьютеру: «преврати вот эту штуку в плоскую картинку, чтобы мы другу послали ее или напечатали на принтере» — то компьютер будет очень долго думать над этой задачей.

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

Путём не слишком хитрых (но и не слишком простых) манипуляций получаем пресловутую карту нормалей: в сущности, это не более чем текстура, правда, со своим особым цветовым пространством, где цветовая информация — а именно, комбинация красного (R), зелёного (G) и синего (B) цветов для каждого пикселя — описывает его видимое положение в системе координат X, Y и Z, каждый цвет соответствует одной из осей координат. Вот так выглядит карта нормалей:

Почему именно так? — Потому что для её получения потребовалось сделать UV-развёртку, т.е. осуществить развёртку поверхности трёхмерной фигуры на плоскость (как и зачем это делается смотрите в следующей статье, пока на этом заострять внимание не будем). Накладываем карту нормалей и Voila.

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *