Технология 3D

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

Черная магия VooDoo
Вернемся в первые дни существования персональных компьютеров, когда большинство игрушек были двумерными. В момент появления достаточно продвинутых в то время трехмерных игр типа Duke Nukem 3D и Quake, никто и не думал, что они положат начало новым игровым технологиям.
Вскоре после этого, в памятном 1995-м, колдуны 3dfx Interactive привнесли в нашу жизнь потрясающую компьютерную графику, доселе невиданную на персоналках. 3dfx околдовала всех игроманов. Независимо от того, играли ли вы на PC, приставке или сотовом телефоне, ваша игровая жизнь начала меняться с этого момента.

Да будут игры!
Технология 3dfx стала своего рода Меккой, совершить паломничество в которую мечтал каждый игрок. Почти все крупные производители поддержали 3dfx и начали продажу видеокарт на ее чипах. Вспомним хотя бы еще независимую Diamond Multimedia с ее легендарной картой Monster 3D, а также Canopus и STB. Эти компании помогли взрастить магию VooDoo.
Вместе с этим производители начали создавать игры с поддержкой 3dfx и выглядели эти игры в то время просто потрясающе. Четкая графика, полностью интерактивное окружение, полигональная структура, билинейная фильтрация, мип-текстурирование (mipmapping) — все эти технологии позволяли создавать чудо. 3D-графика стала близка и знакома сердцу каждого игрока.

Истинное 3D
Хотя старые игры, типа Doom 2, и назывались трехмерными (или 3D), настоящей трехмерности в них не было. В этих играх спрайты накладывались на скелет, далее осуществлялась проекция на плоскость экрана и создавалось изображение, и игра выглядела как трехмерная. Но с момента выхода Quake все изменилось.
Игры стали использовать трехмерную систему координат x, y и z. Другие компании, кроме 3dfx, быстро осознали перспективы нового рынка и стали продвигать свои решения. Опытные игроки, типа ATi, Matrox и S3, начали производство карт с поддержкой трехмерности, но ни одна из них не добилась такого успеха, как продукты 3dfx. Молодая компания оставила всех далеко позади в раздумьях, в каком направлении пойдет индустрия.

Пришествие nVidia
Подобно внезапному шквалу, компания nVidia решила захватить лидерство и снять чары 3dfx. nVidia боролась долго и решительно, и, в конце концов, одержала победу. 3dfx осталась в тени.
С приходом в индустрию 3D, nVidia производила чипы, догоняющие по возможностям аналоги от 3dfx. Но с момента выхода графического процессора Riva 128 (на самом деле, первым был NV1, но он не получил широкого признания), линейка чипов nVidia становилась все мощнее с каждым новым поколением. В отличие от 3dfx с ее вечно запаздывающими продуктами, nVidia всегда держала срок и сейчас уже она является разработчиком номер один на рынке 3D.

Рождение GeForce2
В каждом своем новом продукте, nVidia реализовывала передовые решения, которые были на устах каждого уважающего себя разработчика. Впрочем, оно и понятно: инновационные решения требовались для того, чтобы остаться на плаву.
Серия GeForce2 сильно отличается от GeForce введением новой технологии NSR (nVidia Shading Rasterizer, растеризатор шейдеров nVidia). NSR позволяет разработчикам игр добавлять в свои продукты новые детали без значительного снижения производительности.
С этого момента, почти каждая 3D игра должна опираться на эти новые технологии и принципы. Характерным примером можно считать id Software и игру Quake 3, которая реализует передовые решения. Поиграв в Quake 3 и насладившись удивительной графикой, вы наверняка станете замечать много недостающих черт в любой другой игрушке. Получается, что в любой игре вам будет чего-то не хватать.

Нам нужны детали!
Как известно, 3D-игра основана на полигонах и текстурах, и эти текстуры “натягиваются” (mapped) на полигоны. И все вроде бы прекрасно выглядит, пока вы не начнете обращать внимание на всякие детали.
Поэтому, простого наложения текстур на полигоны сейчас уже недостаточно. Играм требуется большая детализация. Поверхности должны выглядеть естественно: кирпичная стена должна быть неровной, а у апельсина должны быть заметны поры и ямочки.
Проблема вызрела давно, но никто из производителей особо не торопился ее решать. Matrox стал первым, кто успешно реализовал метод увеличения визуальных деталей на поверхностях. Технология была названа Environment Mapped Bump Mapping (EMBM, поддержка рельефного текстурирования с использованием карт окружающей среды). Использование EMBM привносит заметные детали в игры, потребляя в то же время незначительные вычислительные ресурсы. Хотя EMBM был хорош, он все же имел некоторые недостатки. И опять на сцену вышла nVidia.

Пиксельное затенение
С изобретением GeForce2 и NSR, nVidia придумала лучший способ для повышения детализации в игре нежели EMBM. Так как каждая игра, работающая в графике, так или иначе использует пиксели, nVidia решила для внесения дополнительных деталей использовать именно отдельные пиксели.
Что же такое попиксельное затенение (per-pixel shading)? Это способ применения специальных визуальных эффектов к… пикселю. Таким образом, ощущение реальной материи рождается через отдельные пиксели, для большей аккуратности и интенсивности. Попиксельное затенение призвано изменить представление людей о компьютерной графике. Оно уже достаточно давно используется в кинематографии для создания более реалистичных и близких к жизни компьютерных графических объектов. До сих пор эта технология не применялась на компьютерах из-за значительных вычислительных требований. Конечно, ее можно реализовать через 3D Studio, но ведь это несколько отличается от реального времени? Может ли быть этот эффект применен ко всему кадру в высоком разрешении в 1/60 часть секунды? Ответом было “нет”. До сих пор.
Попиксельное затенение помогает моделировать некоторые природные особенности и такие сложные поверхности, как мех, ткань, стекло, камень и другие материалы с высокой детализацией.
Раньше различные эффекты применялась ко всему треугольному полигону и иногда ко всей текстуре с помощью интерполяции (interpolation). При этом для расчета брались вершины треугольника и с помощью них интерполировался требуемый район. В результате, создавалось впечатление, как будто изображение размыто (approximation). Самое главное преимущество интерполяции: она быстрая и ее легко применять. Ну а главный недостаток: при больших треугольниках, получаемое изображение содержит артефакты, ухудшающие качество восприятия.
С помощью попиксельного затенения, для расчета эффектов берутся отдельные пиксели. Так как треугольник состоит из многих пикселей, получающееся изображение очень хорошо подчеркивает мелкие детали. Представьте, что треугольник занимает 100 пикселей. Предположим, у нас есть палитра из десяти эффектов. Каждый пиксель может принимать любые из десяти возможных эффектов. В таком случая для треугольника получается 10010 комбинаций различных эффектов. Если бы использовалась интерполяция, то треугольник мог участвовать не более чем в 10 эффектах, причем каждый эффект распространялся бы на весь треугольник.

Программируемые пиксельные шейдеры (pixel shaders)
Представьте, что бы было, если бы разработчик игры смог бы управлять процедурой затенения? Если бы разработчик смог бы манипулировать различными группами пикселей на одной текстуре? Если бы разработчик смог бы сам запрограммировать пиксельный шейдер наиболее приемлемым для себя способом? Вот о всем об этом мы как раз и будем говорить далее: о бесконечных вариантах для творчества, порожденных программируемыми пиксельными шейдерами.
GeForce2 может реализовывать Dot3 (Dot Product) и другие современные эффекты наложения карт среды (bump mapping) и эффекты затенения на каждый пиксель.
Хотя разработчики могут создавать потрясающие эффекты за один или несколько проходов, у них не было возможности циклических операций. Так как процесс не мог быть повторно применен к одному и тому же пикселю, эффекты, требуемые зависимого наложения текстур, были невозможны. Несмотря на это существенное ограничение, фиксированный конвейер NSR уже мог создавать очень правдоподобные и реалистичные сцены методом наложения карт среды Dot3. Что позволило играм значительно улучшить детализацию без усложнения геометрии объекта.
Объяснение: GeForce3 обрабатывает 4 текстуры за один проход. Логично, что GeForce3 должна обрабатывать их независимо, для реализации “бесконечного” количества эффектов, рекламируемых nVidia. Кроме независимого “жонглирования” текстурами, чип должен применять эффекты к каждой текстуре независимо, используя шейдеры DirectX8.
С помощью нового движка, возможна реализация таких текстурных эффектов, как блеск, неровности и динамическое изменение. Разработчики могут сами программировать InfiniteFX-движок (программируемые пиксельные и вершинные шейдеры) для реализации бесконечного количества комбинаций.
После завершения операций над текстурами, можно получить дополнительные варианты комбинаций путем смешения (blends) до 8 текстур. Все эти операции поддерживаются пиксельными шейдерами DirectX 8.

Программирование вершин (vertex programming)
Одними из главных инноваций в GeForce3 явились программируемые вершинные шейдеры (programmable vertex shader).
В традиционных графических конвейерах, каждый этап имеет свои заранее известные функции, и эти функции систематически выполняются. Разработчик не может изменить выполняемые функции на каком-нибудь этапе. В связи с этим ограничиваются возможности экспериментирования. Поэтому специальные эффекты через графический процессор реализовать сложнее. Все, что в нем не определено, должно быть выполнено процессором системы, отнимая драгоценные циклы. nVidia смогла преодолеть это ограничение благодаря добавлению возможности динамически менять конвейер.
Таким образом, разработчик получает инструмент управления конвейером. Он может динамически вставить кусок кода на ассемблере прямо в конвейер, изменить различные настройки и затем продолжить процесс. Эта черта дает уникальные возможности программистам. Представьте себе что для каждой игры система сама бы выбирала наиболее подходящую графическую карту. Программирование вершинных шейдеров — почти то же самое.

Характерные черты и преимущества вершинного программирования
Ниже перечислены некоторые характерные черты программируемых вершинных шейдеров:
— полное управление аппаратным T&L;
— аппаратное ускорение сложных вершинных операций;
— попиксельное наложение карт среды может опираться на вершинные данные (pre-vertex set up);
— морфинг объектов (character morphing) и теневая проекция (shadow volume projection);
— настраиваемое вершинное освещение (vertex lighting);
— настраиваемое обтягивание скелета (skinning) и смешение текстур (blending);
— настраиваемая генерация координат текстур;
— настраиваемые матричные операции с текстурами (texture matrix operations);
— настраиваемое освещение в стиле мультфильма (cartoon-style lightning);
— программируемое вычисление вершин (vertex computations).
Так как вычисление вершин производится графическим чипом, то освобождаются ресурсы центрального процессора. Это позволяет больше ресурсов уделять физической модели мира и имитации объектов.
Итак, вершинное программирование позволяет разработчику создавать впечатляющие сложные эффекты в реальном времени, причем с аппаратным ускорением и без ограничения в количестве существующих функций.
Можно привести пример вершинного программирования. У вас есть три вершины, формирующие треугольный полигон. Передаем вершины в вершинный манипулятор (vertex manipulator). В нем каждая вершина может быть изменена любым образом, причем количество таких изменений не ограничено. Здесь уже все зависит от воображения программиста. У получившихся вершин могут измениться любые параметры: координаты, цвет и прозрачность. Самое интересное в этом процессе: программист может выбирать, какую вершину он желает изменить. Это могут быть все, одна или вообще ни одной. То есть, он может решить что только вершина N№1 и N№2 должны быть изменены и переданы дальше. Над следующими тремя вершинами он может поступить совсем другим образом. Конечно, можно изменять каждую следующую вершину в одном и том же цикле, как уж пожелает программист.
Таким образом, разработчик получает возможность реализовывать неограниченное количество спецэффектов над объектами. Эффекты могут применяться как над целым объектом, так и над его частями, для подчеркивания деталей. Мы видим что возможности на самом деле ничем не ограничены, о чем и говорит название “InfiniteFX” (Infinite — бесконечный).

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

Обтягивание текстурами с использованием палитры (paletted skinning)
С помощью вершинного программирования, в играх могут использоваться очень реалистично двигающиеся герои. Их суставы будут на самом деле связывать части тела, а одежда будет сминаться при надевании доспехов. Представьте, что герой совершает движения руками, его одежда натягивается на локтях, а на плечах образуются складки. И все это в реальном времени!
Кроме правдоподобных движений, герои смогут очень достоверно передавать эмоции. Например, при улыбке героя мы сможем наблюдать ямочки и морщинки, являющиеся следствием усилий мускулов. Все это может быть реализовано с использованием кадровой анимации (keyframe animation).

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

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

Геометрический морфинг (Geometry Morphing)
Используя основные идеи процедурной деформации (procedural deformation), игра может демонстрировать реалистичные, “живые” эффекты. Когда человек смеется, на его лице происходит множество изменений. Некоторые мускулы расширяются в каком-то направлении, другие сокращаются, и все это происходит одновременно. Вся эти “живые” движения могут быть реализованы в реальном режиме времени опять же с использованием кадровой анимации (keyframe animation). Программист указывает точки начала и конца и заставляет вершинный движок интерполировать каждый промежуточный кадр. В результате мы получаем четкую и реалистичную анимацию.

Непостоянная трансформация (irregular transform)
Один из некоторых менее значительных эффектов — это эффект линзы или “рыбьего глаза”. nVidia также реализовала несколько эффектов, впервые анонсированных в Voodoo5, например, размазывание движущихся объектов (Motion Blur). Также разработчики игр могут произвольно применять различные варианты освещенности. До сих пор, такие эффекты были невозможны без значительных вычислительных затрат. Характерным примером является двустороннее освещение. Раньше, если вы имели плоскую поверхность и желали осветить ее с двух сторон различным образом, вам бы пришлось удвоить количество треугольников, снижая скорость. Но сейчас вершинные шейдеры позволяют управлять освещением с обеих сторон без задействования двойной модели.

Ускорение поверхностей высокого порядка (high-order surfaces)
Поверхности высокого порядка можно представить как поверхности, основанные на кривых линиях. Если вы знакомы с планиметрией из школы, то примером линейной формулы может быть y=m*x+b или прямая линия. Множество прямых линий можно использовать для создания иллюзии кривой линии, но необходимо просто огромное число прямых поверхностей для создания одной кривой поверхности. nVidia улучшила ускорение поверхностей высокого порядка в GeForce3. Примером формулы высокого порядка может быть y=mx2+b, где x возводится в степень. Конечно, показатель степени не обязательно всегда равняется двум, но для реальных поверхностей такой степени вполне достаточно.
В этом году вы увидите большое количество игр с кривыми поверхностями. Это должно сильно улучшить вид героев и окружающей среды. Ведь на самом деле, практически невозможно создать реалистичную “живую” модель используя только прямые линии.

И к чему же мы пришли?
Видели ли вы видеоролик Doom3 на GeForce3? Если нет, то не поленитесь и скачайте его (http://www.fileplanet.com/index.asp?section=645&file=56348). В игре вы быстро заметите все преимущества попиксельного затенения и программируемых пиксельных и вершинных шейдеров.

Заключение
Несколько вещей так и не были затронуты в этой статье, и вы их наверняка прочитаете в материалах по GeForce3, которые уже начали появляться.
Главная цель этой статьи — объяснить вам преимущества пиксельного и вершинного затенения (pixel shading/vertex shading). Эти две технологии являются основой движка nVidia nfiniteFX. Так как обе технологии опираются на возможность программирования, движок может реализовывать практически бесконечное число вариантов. Разработчики игр могут меньше концентрировать свое внимание на особенностях программных движков и реализовывать более подробную физическую модель мира.
Комбинация этих двух технологий может создавать реалистичные детали на поверхностях, основанные как на прямых линиях, так и на кривых. Мы получим увеличение детализации без увеличения числа полигонов. Что, впрочем, не отменяет постепенно растущую потребность в большом числе полигонов. Но технология движется вперед, мы получаем все больше и больше деталей, больше эффектов и больше реализма.

Словарик
mipmapping (мипмаппинг) — множественное отображение (последовательность текстур одного и того же изображения с уменьшающимся разрешением по мере удаления отображаемого объекта от наблюдателя)

Environment Mapped Bump Mapping (EMBM) — поддержка аппаратного ускорения рельефного текстурирования с использованием карт окружающей среды

Pixel Shading — пиксельное затенение, способ применения специальных эффектов к отдельному пикселю.

Pixel Shader — пиксельный шейдер, способ программирования попиксельного затенения.

Vertex Shader — вершинный шейдер, способ программирования вершинных эффектов.


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