Вход в систему

Логин:
Пароль:
Вход Зарегистрироваться Вспомнить   пароль

Новейшие статьи

Самопал
Все статьи
Популярные за месяц
Kingdoms of Amalur: Reckoning
PCPS3X360
Комментариев: 23
The Binding of Isaac
PC
Комментариев: 17
Battlefield 3
PCPS3X360
Комментариев: 106
Мороз по коже. Тестирование процессорного кулера Cooler Master «Дед Мороз»
PC
Комментариев: 22
Carrier Command: Gaea Mission
PC
Комментариев: 9
Ace Combat: Assault Horizon
PS3X360
Комментариев: 38
BlizzCon 2011. День второй
PC
Комментариев: 40
BlizzCon 2011. День первый
PC
Комментариев: 43
Might and Magic: Heroes 6
PC
Комментариев: 143
Rage
PCX360PS3
Комментариев: 146
Rage
PCX360PS3
Комментариев: 146
Might and Magic: Heroes 6
PC
Комментариев: 143
Battlefield 3
PCPS3X360
Комментариев: 106
Hard Reset
PC
Комментариев: 71
Red Orchestra 2: Heroes of Stalingrad
PC
Комментариев: 67
«ИгроМир 2011». Дни второй и третий
PC
Комментариев: 47
«ИгроМир 2011». День первый
PC
Комментариев: 44
BlizzCon 2011. День первый
PC
Комментариев: 43
BlizzCon 2011. День второй
PC
Комментариев: 40
Ace Combat: Assault Horizon
PS3X360
Комментариев: 38


ЛКИ
№10/2011

www.lki.ru

Мир фантастики
№11/2011

www.mirf.ru

Mobi.ru
экспертный сайт о цифровой технике

www.Mobi.ru

Информация на данной странице предоставлена нашим информационным партнером Игромания.ру

Энциклопедия третьего измерения, часть 6. Перипетии современных 3D-технологий

Автор: | Дата: 01.10.2004
    Сказ о таинствах устройства современных графических ускорителей остался позади. Мы разобрали все этапы изготовления трехмерной картинки — от полигонального каркаса до готового изображения на экране монитора. Однако в современных играх помимо стандартной, полигональной технологии представления трехмерной графики используются и другие, альтернативные. У каждой из таких технологий — своя область применения, свои достоинства и недостатки. Естественно, мы не можем обойти их вниманием. Ведь используй современные игры исключительно полигоны да текстуры, трехмерные миры не
Рис. 1. Развевающиеся
волосы этой девушки созданы
с помощью NURBS
поверхностей.
были бы такими яркими, насыщенными и динамичными. Ну что ж, давайте познакомимся с новыми героями: NURBS, вокселями, трассировкой лучей и шейдерами.

    Где не ступала нога Безье...
   
Какими бы безумно-заоблачными не были мощности акселераторов, все равно они смогут обработать только ограниченное число полигонов в секунду. Самые современные графические ускорители без проблем создают фотореалистичные машины, оружие, космические корабли. Даже искушенный в трехмерных технологиях человек может перепутать фотографию и результат работы какого-нибудь GeForce FX. Для подобных объектов разбивка на полигоны — естественный и
легкий процесс. В самом деле, даже самый навороченный суперкар собирают на заводе из деталей, каждую деталь производят по чертежам или электронным моделям, а значит, она уже была представлена в искусственной, цифровой форме. При достаточном количестве полигонов любая деталь даже с очень сложным профилем будет смотреться естественно.
Рис. 2. А вот так NURBS
создаются в программах
трехмерного моделирования.
    Совсем другое дело — творения матушки природы. Вряд ли можно создать абсолютно точный чертеж какой-нибудь розы, потому что живая ткань обладает тысячами разных свойств и никогда не остается абсолютно неподвижной. Деление объектов живого мира на полигоны — это своего рода надругательство над их красотой и естеством. Ну нет в природе идеально прямых линий и плоскостей! Нет, никогда не было и наверняка не будет. Природой правят различной формы и сложности кривые. Так почему бы не положить в основу альтернативной технологии трехмерной графики эти самые кривые? Такая система идеально подошла бы для моделирования растений, деревьев, животных и даже человека. Не останутся в стороне и объекты, для которых важна динамическая пластика, например развевающиеся плащи, плещущиеся на ветру полотнища флагов и даже каскады пышных волос Лары Тумрайдеровны Крофт.
    Один из видов таких кривых — хорошо известные любому дизайнеру кривые Безье. Однако нам больше всего интересны не сами кривые, а их совокупности, которые вместе задают криволинейную поверхность. Такие поверхности сокращенно называются NURBS (от Non-Uniform Rational B-Spline — неравномерный рациональный B-сплайн). Каждая такая поверхность задается сложным математическим уравнением. Графическая библиотека решает это уравнение относительно заданной области и получает набор точек в трехмерном пространстве, которые затем проецируются на экран.
Рис. 3. Это одна и та же кривая
езье, просто положения
опорных линий разные.
    Можно подумать, что бедные разработчики компьютерных игр для того, чтобы смоделировать простейший флаг, с головой зарываются в убористые математические выкладки. Вовсе нет. Им достаточно задать опорные точки, их первоначальное положение и границы будущей поверхности, а 3D API сам рассчитает все остальное.
    Об опорных точках стоит рассказать поподробнее, так как это самая важная часть технологии. Программист или моделер может поставить на поверхность столько опорных точек, сколько захочет. Если он потом изменит положение одной из этих точек, все остальные точки поверхности будут рассчитаны так, чтобы в поверхности не образовалось разрывов. Именно поэтому простая поверхность с всего парой десятков опорных точек может стать красивым платьем принцессы с множеством живописных складок, которое меняет свою форму в такт ходьбе.
    К сожалению, NURBS пока никак не обрабатываются графическими акселераторами, и все тяготы по их обсчету ложатся на плечи центрального процессора. Именно поэтому NURBS в компьютерных играх используются эпизодически. Однако с каждым годом число игр, в которых тем или иным образом применяются сплайновые поверхности, растет как на дрожжах. Глядишь, в очередной версии графических чипов от nVidia или ATI появится-таки аппаратная поддержка этой замечательной технологии.

   
Тайна волшебного луча
   
Представьте, что вам нужно вывести на экран красивую трехмерную сцену с множеством источников освещения, полупрозрачными объектами, зеркалами и затемненными местами. Получается та еще задачка, решить которую конвейер обычной графической библиотеки сможет только за очень большое число ходов.
Как представишь себе: сцену тесселировать, невидимые плоскости отсечь, треугольники трансформировать, текстурировать, осветить, затенить, потом все это сгладить да на экран вывести — руки опускаются. А нельзя ли это все сделать одним махом, как-нибудь по-быстрому? Да еще и качество картинки, и реалистичность освещения повысить на два порядка? И чтобы все это замечательно смотрелось в динамике? Лет пять назад вам категорично сказали бы: нельзя. Тогда методы рендера, основанные на Z-буфере, правили бал, так как они были, по сути, единственными, с которыми могли справиться компьютеры того времени. Сейчас компьютеры поднабрались силенок, и ответ специалиста будет другим: “Вообще-то можно, но...”. Давайте посмотрим, как это можно сделать и в чем заключается пресловутое “но”.
    Технология, о которой пойдет речь, называется Ray Tracing — обратная трассировка луча. Она с самого начала предназначалась для создания фотореалистичного изображения со сложной моделью освещения. Ray Tracing используется в мощных пакетах создания трехмерной графики — 3D Studio MAX, Maya и LightWave при окончательной визуализации. Она засветилась и в “Властелинах колец”, и в “Звездных войнах”, и в “Шреке”, и во многих других анимационных фильмах и эпизодах со спецэффектами. Однако до недавнего времени никому не пришло бы в голову применять Ray Tracing в реальном времени — уж больно он ресурсоемок.
    Суть метода в следующем. Из каждой точки экрана в трехмерный мир выпускается луч до пересечения с ближайшим объектом сцены. Далее — из точки пересечения выпускаются лучи ко всем источникам света. Если луч от какого-нибудь источника света до точки пересечения проходит свободно, значит
эта точка объекта была освещена и она отрисовывается на экране. В противном случае она лежит в тени (или освещена другим источником света). Так луч себя ведет, если он угодил в непрозрачный объект. Если материал объекта обладает какими-то экзотическими свойствами, поведение луча усложняется. Например, если луч попал в зеркальную поверхность, выпускается отраженный луч, который “строит” отраженное изображения в этой точке. Если объект был прозрачным, луч проходит сквозь него, а если полупрозрачным — преломляется или даже разделяется на два луча — отраженный и преломленный. Этот метод позволяет рассчитать даже вторичное освещение и вообще все хитросплетения света и тени, которые возможны в реальном мире. Поэтому картинки, созданные с помощью этого метода, поражают своей реалистичностью.
Рис. 4. Эти шедевры смотрятся так, как будто их отрендерили в каком-нибудь 3DS MAX.
На самом деле это результаты работы движка, основанного на технологии Ray Tracing.
    Увы, у Ray Tracing есть один огромный недостаток — он безумно ресурсоемок. Как и NURBS, трассировка обратного луча не рассчитывается акселератором. Даже самые современные процессоры могут рассчитывать в реальном времени картинку только в очень маленьком разрешении — не больше 640х480. Как альтернатива — мир должен состоять из простых и однозначно рассчитываемых примитивов, например из сфер. Несмотря на это, за обратной трассировкой лучей — будущее. Современные методы визуализации трехмерной картинки рано или поздно упрутся в потолок реалистичности. Но к тому времени процессоры станут достаточно мощными, чтобы применять Ray Tracing даже в больших разрешениях. У этой технологии есть еще один плюс: алгоритм построения обратного луча легко распараллелить на много процессоров. А это значит, что его легко реализовать на многопроцессорных домашних компьютерах недалекого будущего.

   
Приключения Пикселя в 3D
   
Как известно, любая двумерная картинка, которая выводится на экран монитора, состоит из пикселей. Само слово pixel происходит от picture element — элемент изображения. Такое представление довольно естественно, ведь экран монитора также состоит из дискретных элементов, каждый из которых может
Рис. 5. Небольшая иллюстрация
воксельной технологии.
принимать тот или иной цвет. А почему бы этот принцип не перенести без изменений в 3D? Сколько проблем сразу уйдет. Ведь любой объект в реальном мире состоит из атомов, молекул. Но моделировать каждую молекулу — занятие неблагодарное. А вот если взять структурные единицы побольше да составить из них трехмерные картинки, то вывести их на экран монитора будет не так сложно. Этот принцип лежит в основе так называемой воксельной графики.
    Воксель — это, по сути, трехмерный пиксель (слово voxel образовано из VOlumized piXEL, то есть “объемный пиксель”). Как и пиксель, он имеет свой цвет. Иногда воксель называют квантом объема. Из полигональной графики воксель позаимствовал свойства материала — он может быть полупрозрачным и даже зеркальным. Любой объект в 3D, как из кубиков, составляется из вокселей. При этом воксели, как правило, образуют только внешнюю поверхность объектов, внутренности не заполняются. Да и зачем обсчитывать то, что мы и так не видим? Так как каждый воксель передает свой цвет, необходимость в текстурах отпадает. Объекты из вокселей очень просто сделать разрушаемыми — ведь перемещение каждого элемента объекта при, скажем, взрыве рассчитывается по простым и очевидным законам. Воксельные объекты очень просто анимировать — достаточно задать последовательность трехмерных кадров.
    Очевидно, что качество конечной картинки зависит от размера
и формы вокселей. Чем они меньше — тем лучше. В идеале, даже в сложных криволинейных поверхностях они вообще не должны быть заметны. Форма вокселей подбирается из соображений производительности. Лучше всего выглядят воксели-сферы. Но их отрисовка довольно требовательна к ресурсам. В первых играх, которые использовали воксельную технологию, они были просто кубиками или даже плоскостями, повернутыми к наблюдателю. Из-за этого порой была заметна зернистость изображения и даже просветы между кубиками.
Рис. 6. Пример воксельного
ландшафта.
    В целом, воксельное представление трехмерного мира куда более естественно, чем полигональное. Картинка, полученная с использованием этой технологии, будет четкой и красивой. Это в теории. А теперь спустимся с небес и перейдем к неумолимой практике. У вокселей есть два существенных недостатка. Первый заключается в том, что для хранения даже небольшой сцены высокого качества уходит огромное количество памяти и дискового пространства. Допустим, наш мир — это всего лишь кубик 1024х768х1000. Это не очень большая сцена, но достаточно детальная, чтобы выглядеть фотореалистично. Она будет занимать “всего-то” чуть больше 750 мегабайт. Впечатляет? Конечно, есть хитрости, которые позволяют уменьшить эту цифру в десятки раз. Например, можно хранить не матрицу вокселей, а их список. Это проще, так как в объектах очень много пустот. Данные о вокселях можно хранить в сжатом виде. И все равно — качественное представление трехмерного мира потребует больших ресурсов памяти. Вторая ложка — все те же акселераторы. Ну никак они не предназначены для новаторских технологий! Хотя здесь ситуация получше, чем с NURBS и Ray Tracing. Если воксели представлять геометрическими примитивами (да теми же кубиками), акселератор возьмется-таки их ускорять. Но вот толку от этого будет существенно меньше, чем, если бы аксель был специально предназначен для обработки вокселей.
    Игры, целиком сделанные по воксельной технологии, можно пересчитать по пальцам одной руки. Сама известная из них — легендарный Outcast. Outcast 2 будет полностью полигональным (если вообще будет, информации о нем нет уже довольно давно). Тем не менее воксели применялись и применяются во многих играх как вспомогательные элементы. Излюбленная тематика игроделов — воксельные ландшафты. Они очень легко отрисовываются и без проблем поддаются терраморфингу. Их можно избороздить во все стороны гусеницами, испещрить взрывами и изрыть экскаваторами, а они все это честно будут изображать без особых потуг со стороны акселератора. Особенно полюбились воксели нашей отечественной команде игроделов — K-D Lab. Если говорить о других западных проектах, то, например в Shadow Warrior, воксели использовались для отрисовки оружия, а в C&C: Tiberium Sun — для всех юнитов.
    Воксельная технология весьма интересна. Вряд ли игры, целиком созданные на воксельных движках, появятся в ближайшем будущем. Зато в качестве аперитива к полигональной графике она зарекомендовала себя неплохо.

    Братья Шейдеры
   
Вот мы и добрались до передовой современного игродельческого фронта. Наверное, вам уже грустно перечитывать в который раз, что еще одна замечательная технология игнорируется разработчиками акселераторов. На этот раз все совсем не так. Мы лицезреем как раз тот редкий случай, когда
Рис. 7. Один из первых
официальных примеров
шейдеров от nVidia. Сейчас он
смотрится обыденно, но в день
своего релиза произвел
настоящий фурор среди
игровой общественности.
разработчики 3D API и железячники-инженеры были солидарны в своих начинаниях. Шейдеры ворвались в нашу жизнь неожиданно, нежданно-негаданно, сначала в виде анонса вкусностей в очередной версии DirectX, а потом и от ведущих производителей видеокарт. Что же это за зверь такой, шейдер?
    Шейдер — это функция или микропрограмма, которая определенным образом модифицирует какой-то элементарный участок трехмерной сцены перед рендером. Еще несколько лет назад шейдерные функции были доступны только на мощных графических станциях и не в реальном времени. Шейдеры позволяют создавать совершенно потрясающие спецэффекты, которые до недавних пор мы могли увидеть только в кино. А о том, чтобы применить шейдерную программу в компьютерной игре, и мысли не было — ни один процессор не смог бы переварить ее с приемлемым количеством FPS. Но времена меняются, и разработчики решили встроить аппаратную поддержку шейдеров в акселераторы. Отныне они рассчитываются не процессором, а специальным блоком видеопроцессора. Впервые аппаратная поддержка шейдеров появилась в GeForce 3 в виде подсистемы NVIDIA nfiniteFX engine. На сегодняшний день существуют два типа шейдеров.
    Вершинные шейдеры (Vertex Shaders) оперируют параметрами вершин объектов, такими как координаты самой вершины, координаты текстуры, цвет и параметры освещения. Акселератор применяет подпрограмму-шейдер к каждой вершине объекта перед рендером и изменяет один или несколько параметров, в
Рис. 8. Пиксельные шейдеры
во всей своей красе.
зависимости от самой вершины или по какому-то хитрому алгоритму. К примеру, изменяя координаты вершин, мы запросто получим красивейшие волны, тонкие морщинки на лицах и разнообразные рельефные эффекты объектов. И все это в динамике! Персонаж-человек смеется, а на его коже появляются маленькие складочки и ямочки, на которые при обычном подходе ушел бы не один десяток тысяч полигонов. И все это без заметного падения производительности! Изменяя координаты текстур и параметры освещения, мы можем создать фантастические эффекты освещения и затенения, вплотную подходящие к тому, что может дать “честный” Ray Tracing. Хотите комнату, залитую динамическим светом тысяч свечей? Как скажете. Хотите объемный туман, медленно сползающий в лощину? Нет проблем.
    Пиксельные шейдеры (Pixel Shader) — еще более интересная технология. Она позволяет разработчикам игр применять к виртуальному миру попиксельные эффекты и динамически изменять свойства материалов объектов. Например, в одной из демок от nVidia логотип красуется на (внимание!) анимированной шероховатой отражающей поверхности!
Рис. 9. Вода — один из самых
первых игровых объектов,
который практически во всех
современных играх подвергся
шейдерной обработке.
Подобные кульбиты были практически нереальны для акселераторов без аппаратной поддержки пиксельных шейдеров. Но самое вкусное применение этой технологии — динамическое попиксельное освещение. Наконец то, о чем так долго твердили большевики, стало реальностью. Отныне никаких карт освещения и заковыристых ухищрений для псевдосвета и псевдотеней: все рассчитывает в реальном времени абсолютно честно. Пиксельные шейдеры позволяют разработчику контролировать закраску, освещение и цвет каждого пикселя сцены. Кафель должен быть бело-зеркальным и гладким, ведь так? А гранит — шероховатым, с вкраплениями, верно? Какого бы дикого разрешения не была текстура, она не сможет передать все нюансы рельефной поверхности. В этом смысле пиксельные шейдеры — своего рода альтернатива текстурам в их теперешнем виде.
    Несомненно, шейдеры — это шаг вперед, причем очень размашистый. Еще немного, и разработчики полностью освоят нововведения DirectX 9.0 и шейдеры версии 2.0, и мы сможем лицезреть
небольшую революцию в трехмерной графике. Однако программирование шейдеров — не такое простое дело. Низкоуровневый язык пиксельных и вершинных шейдеров, на первый взгляд, сильно напоминает ассемблер. И на нем не слишком удобно программировать сложные эффекты. Поэтому компания nVidia разжилась специальным языком программирования высокого уровня — Cg, который очень похож на старый добрый с новыми командами. В спецификации Cg сказано, что это язык управления акселератором в целом, однако наиболее интересны именно его шейдерные возможности. Он нисколько не отрицает уже существующие 3D API, такие как Direct3D и OpenGL, а скорее является надстройкой для них. В последних версиях этих графических библиотек есть специальные команды для скармливания скомпилированного Cg-кода акселератору. К слову, стандарт этот совершенно открытый, и любой желающий может скачать с сайта nVidia все необходимое, чтобы попробовать себя в режиссуре великолепных шейдерных эффектов новой эпохи.

   
* * *
   
Вот и закончилось очередное путешествие в мир 3D-технологий. За плечами — шесть подробных статей о принципах построения и работы виртуальных миров. Настоящая энциклопедия начинающего (да и не только начинающего) моделера. Но мы не привыкли останавливаться на достигнутом. Впереди еще множество интереснейших тем.
Двери тут