|
Где не ступала нога Безье...
Какими бы безумно-заоблачными не были мощности акселераторов, все равно они смогут обработать только ограниченное число полигонов в секунду. Самые современные графические ускорители без проблем создают фотореалистичные машины, оружие, космические корабли. Даже искушенный в трехмерных технологиях человек может перепутать фотографию и результат работы какого-нибудь GeForce FX. Для подобных объектов разбивка на полигоны — естественный и легкий процесс. В самом деле, даже самый навороченный суперкар собирают на заводе из деталей, каждую деталь производят по чертежам или электронным моделям, а значит, она уже была представлена в искусственной, цифровой форме. При достаточном количестве полигонов любая деталь даже с очень сложным профилем будет смотреться естественно.
|
Один из видов таких кривых — хорошо известные любому дизайнеру кривые Безье. Однако нам больше всего интересны не сами кривые, а их совокупности, которые вместе задают криволинейную поверхность. Такие поверхности сокращенно называются NURBS (от Non-Uniform Rational B-Spline — неравномерный рациональный B-сплайн). Каждая такая поверхность задается сложным математическим уравнением. Графическая библиотека решает это уравнение относительно заданной области и получает набор точек в трехмерном пространстве, которые затем проецируются на экран.
|
Об опорных точках стоит рассказать поподробнее, так как это самая важная часть технологии. Программист или моделер может поставить на поверхность столько опорных точек, сколько захочет. Если он потом изменит положение одной из этих точек, все остальные точки поверхности будут рассчитаны так, чтобы в поверхности не образовалось разрывов. Именно поэтому простая поверхность с всего парой десятков опорных точек может стать красивым платьем принцессы с множеством живописных складок, которое меняет свою форму в такт ходьбе.
К сожалению, NURBS пока никак не обрабатываются графическими акселераторами, и все тяготы по их обсчету ложатся на плечи центрального процессора. Именно поэтому NURBS в компьютерных играх используются эпизодически. Однако с каждым годом число игр, в которых тем или иным образом применяются сплайновые поверхности, растет как на дрожжах. Глядишь, в очередной версии графических чипов от nVidia или ATI появится-таки аппаратная поддержка этой замечательной технологии.
Тайна волшебного луча
Представьте, что вам нужно вывести на экран красивую трехмерную сцену с множеством источников освещения, полупрозрачными объектами, зеркалами и затемненными местами. Получается та еще задачка, решить которую конвейер обычной графической библиотеки сможет только за очень большое число ходов. Как представишь себе: сцену тесселировать, невидимые плоскости отсечь, треугольники трансформировать, текстурировать, осветить, затенить, потом все это сгладить да на экран вывести — руки опускаются. А нельзя ли это все сделать одним махом, как-нибудь по-быстрому? Да еще и качество картинки, и реалистичность освещения повысить на два порядка? И чтобы все это замечательно смотрелось в динамике? Лет пять назад вам категорично сказали бы: нельзя. Тогда методы рендера, основанные на Z-буфере, правили бал, так как они были, по сути, единственными, с которыми могли справиться компьютеры того времени. Сейчас компьютеры поднабрались силенок, и ответ специалиста будет другим: “Вообще-то можно, но...”. Давайте посмотрим, как это можно сделать и в чем заключается пресловутое “но”.
Технология, о которой пойдет речь, называется Ray Tracing — обратная трассировка луча. Она с самого начала предназначалась для создания фотореалистичного изображения со сложной моделью освещения. Ray Tracing используется в мощных пакетах создания трехмерной графики — 3D Studio MAX, Maya и LightWave при окончательной визуализации. Она засветилась и в “Властелинах колец”, и в “Звездных войнах”, и в “Шреке”, и во многих других анимационных фильмах и эпизодах со спецэффектами. Однако до недавнего времени никому не пришло бы в голову применять Ray Tracing в реальном времени — уж больно он ресурсоемок.
Суть метода в следующем. Из каждой точки экрана в трехмерный мир выпускается луч до пересечения с ближайшим объектом сцены. Далее — из точки пересечения выпускаются лучи ко всем источникам света. Если луч от какого-нибудь источника света до точки пересечения проходит свободно, значит эта точка объекта была освещена и она отрисовывается на экране. В противном случае она лежит в тени (или освещена другим источником света). Так луч себя ведет, если он угодил в непрозрачный объект. Если материал объекта обладает какими-то экзотическими свойствами, поведение луча усложняется. Например, если луч попал в зеркальную поверхность, выпускается отраженный луч, который “строит” отраженное изображения в этой точке. Если объект был прозрачным, луч проходит сквозь него, а если полупрозрачным — преломляется или даже разделяется на два луча — отраженный и преломленный. Этот метод позволяет рассчитать даже вторичное освещение и вообще все хитросплетения света и тени, которые возможны в реальном мире. Поэтому картинки, созданные с помощью этого метода, поражают своей реалистичностью.
|
Приключения Пикселя в 3D
Как известно, любая двумерная картинка, которая выводится на экран монитора, состоит из пикселей. Само слово pixel происходит от picture element — элемент изображения. Такое представление довольно естественно, ведь экран монитора также состоит из дискретных элементов, каждый из которых может
|
Воксель — это, по сути, трехмерный пиксель (слово voxel образовано из VOlumized piXEL, то есть “объемный пиксель”). Как и пиксель, он имеет свой цвет. Иногда воксель называют квантом объема. Из полигональной графики воксель позаимствовал свойства материала — он может быть полупрозрачным и даже зеркальным. Любой объект в 3D, как из кубиков, составляется из вокселей. При этом воксели, как правило, образуют только внешнюю поверхность объектов, внутренности не заполняются. Да и зачем обсчитывать то, что мы и так не видим? Так как каждый воксель передает свой цвет, необходимость в текстурах отпадает. Объекты из вокселей очень просто сделать разрушаемыми — ведь перемещение каждого элемента объекта при, скажем, взрыве рассчитывается по простым и очевидным законам. Воксельные объекты очень просто анимировать — достаточно задать последовательность трехмерных кадров.
Очевидно, что качество конечной картинки зависит от размера и формы вокселей. Чем они меньше — тем лучше. В идеале, даже в сложных криволинейных поверхностях они вообще не должны быть заметны. Форма вокселей подбирается из соображений производительности. Лучше всего выглядят воксели-сферы. Но их отрисовка довольно требовательна к ресурсам. В первых играх, которые использовали воксельную технологию, они были просто кубиками или даже плоскостями, повернутыми к наблюдателю. Из-за этого порой была заметна зернистость изображения и даже просветы между кубиками.
|
Игры, целиком сделанные по воксельной технологии, можно пересчитать по пальцам одной руки. Сама известная из них — легендарный Outcast. Outcast 2 будет полностью полигональным (если вообще будет, информации о нем нет уже довольно давно). Тем не менее воксели применялись и применяются во многих играх как вспомогательные элементы. Излюбленная тематика игроделов — воксельные ландшафты. Они очень легко отрисовываются и без проблем поддаются терраморфингу. Их можно избороздить во все стороны гусеницами, испещрить взрывами и изрыть экскаваторами, а они все это честно будут изображать без особых потуг со стороны акселератора. Особенно полюбились воксели нашей отечественной команде игроделов — K-D Lab. Если говорить о других западных проектах, то, например в Shadow Warrior, воксели использовались для отрисовки оружия, а в C&C: Tiberium Sun — для всех юнитов.
Воксельная технология весьма интересна. Вряд ли игры, целиком созданные на воксельных движках, появятся в ближайшем будущем. Зато в качестве аперитива к полигональной графике она зарекомендовала себя неплохо.
Братья Шейдеры
Вот мы и добрались до передовой современного игродельческого фронта. Наверное, вам уже грустно перечитывать в который раз, что еще одна замечательная технология игнорируется разработчиками акселераторов. На этот раз все совсем не так. Мы лицезреем как раз тот редкий случай, когда
|
Шейдер — это функция или микропрограмма, которая определенным образом модифицирует какой-то элементарный участок трехмерной сцены перед рендером. Еще несколько лет назад шейдерные функции были доступны только на мощных графических станциях и не в реальном времени. Шейдеры позволяют создавать совершенно потрясающие спецэффекты, которые до недавних пор мы могли увидеть только в кино. А о том, чтобы применить шейдерную программу в компьютерной игре, и мысли не было — ни один процессор не смог бы переварить ее с приемлемым количеством FPS. Но времена меняются, и разработчики решили встроить аппаратную поддержку шейдеров в акселераторы. Отныне они рассчитываются не процессором, а специальным блоком видеопроцессора. Впервые аппаратная поддержка шейдеров появилась в GeForce 3 в виде подсистемы NVIDIA nfiniteFX engine. На сегодняшний день существуют два типа шейдеров.
Вершинные шейдеры (Vertex Shaders) оперируют параметрами вершин объектов, такими как координаты самой вершины, координаты текстуры, цвет и параметры освещения. Акселератор применяет подпрограмму-шейдер к каждой вершине объекта перед рендером и изменяет один или несколько параметров, в
|
Пиксельные шейдеры (Pixel Shader) — еще более интересная технология. Она позволяет разработчикам игр применять к виртуальному миру попиксельные эффекты и динамически изменять свойства материалов объектов. Например, в одной из демок от nVidia логотип красуется на (внимание!) анимированной шероховатой отражающей поверхности!
|
Несомненно, шейдеры — это шаг вперед, причем очень размашистый. Еще немного, и разработчики полностью освоят нововведения DirectX 9.0 и шейдеры версии 2.0, и мы сможем лицезреть небольшую революцию в трехмерной графике. Однако программирование шейдеров — не такое простое дело. Низкоуровневый язык пиксельных и вершинных шейдеров, на первый взгляд, сильно напоминает ассемблер. И на нем не слишком удобно программировать сложные эффекты. Поэтому компания nVidia разжилась специальным языком программирования высокого уровня — Cg, который очень похож на старый добрый Cи с новыми командами. В спецификации Cg сказано, что это язык управления акселератором в целом, однако наиболее интересны именно его шейдерные возможности. Он нисколько не отрицает уже существующие 3D API, такие как Direct3D и OpenGL, а скорее является надстройкой для них. В последних версиях этих графических библиотек есть специальные команды для скармливания скомпилированного Cg-кода акселератору. К слову, стандарт этот совершенно открытый, и любой желающий может скачать с сайта nVidia все необходимое, чтобы попробовать себя в режиссуре великолепных шейдерных эффектов новой эпохи.
* * *
Вот и закончилось очередное путешествие в мир 3D-технологий. За плечами — шесть подробных статей о принципах построения и работы виртуальных миров. Настоящая энциклопедия начинающего (да и не только начинающего) моделера. Но мы не привыкли останавливаться на достигнутом. Впереди еще множество интереснейших тем.