В памятном 1995, колдуны почившей "3dfx Interactive" привнесли в нашу жизнь потрясающую компьютерную графику, доселе невиданную на персоналках. 3dfx околдовала всех игроманов. Независимо от того, играли ли вы на PC, приставке или сотовом телефоне, ваша игровая жизнь начала меняться именно с этого момента.
Вместе с этим производители начали создавать игры с поддержкой 3dfx и выглядели эти игры в то время просто потрясающе. Четкая графика, полностью интерактивное окружение, полигональная структура, билинейная фильтрация, мип-текстурирование (mipmapping), все эти технологии позволяли создавать чудо. 3D графика стала близка и знакома сердцу каждого игрока.
Игры стали использовать трехмерную систему координат x, y и z. Другие игроки рынка видеографики быстро осознали перспективы новых технологий и стали продвигать свои решения. ATi, Matrox и S3, начали производство карт с поддержкой трехмерности, но ни одна из них не добилась такого успеха, как продукты 3dfx. Молодая компания оставила всех далеко позади в раздумьях, в каком направлении пойдет индустрия.
nVidia начала производить чипы, догоняющие по возможностям аналоги от 3dfx. С момента выхода графического процессора Riva 128 (на самом деле, первым был NV1, не получивший широкого признания), линейка чипов nVidia становилась все мощнее с каждым новым поколением. В отличие от 3dfx, с ее вечно запаздывающими продуктами, nVidia всегда выдерживала сроки и сейчас является разработчиком номер один на рынке 3D.
Серия GeForce2 сильно отличается от GeForce введением новой технологии NSR (nVidia Shading Rasterizer, растеризатор шейдеров nVidia). NSR позволяет разработчикам игр добавлять в свои продукты новые детали без значительного снижения производительности.
С этого момента, почти каждая 3D игра должна опираться на эти новые технологии и принципы. Характерным примером можно считать "id Software" и игру "Quake 3", которая реализует передовые решения. Поиграв в Quake 3 и насладившись удивительной графикой, вы наверняка станете замечать много недостающих черт в любой другой игрушке. Получается, что в любой игре вам будет чего-то не хватать.
Вывод: простого наложения текстур на полигоны сейчас уже недостаточно. Играм требуется большая детализация. Поверхности должны выглядеть естественно: кирпичная стена должна быть неровной, а у апельсина должны быть заметны поры и ямочки.
Проблема назрела давно, но никто из производителей особо не торопился ее решать. Matrox решил быть первым, кто успешно реализовал метод увеличения визуальных деталей на поверхностях. Технология была названа "Environment Mapped Bump Mapping" (EMBM, поддержка рельефного текстурирования с использованием карт окружающей среды). Использование EMBM привносит заметные детали в игры, потребляя в то же время незначительные вычислительные ресурсы. Хотя EMBM был хорош, он все же имел некоторые недостатки. И опять на сцену вышла nVidia.
Что же такое попиксельное затенение (per-pixel shading)? Это способ применения специальных визуальных эффектов к... пикселю. Таким образом, ощущение реальной материи рождается через отдельные пиксели, для большей аккуратности и интенсивности. Попиксельное затенение призвано изменить представление людей о компьютерной графике. Оно уже достаточно давно используется в кинематографии для создания более реалистичных и близких к жизни компьютерных графических объектов. Например, в фильме "Игрушечная история" (Toy Story) есть такой персонаж, Бузз (Buzz Light-year). Вспомните отражение на его прозрачном шлеме. Каким же образом получается то, что мы одновременно видим и окружающую обстановку в отражении, и объекты, находящиеся под самим шлемом? Все это реализуется через попиксельное затенение. До сих пор эта технология не применялась на компьютерах из-за значительных вычислительных требований. Конечно, ее можно реализовать через 3D Studio, но ведь это несколько отличается от реального времени? Может ли быть этот эффект применен ко всему кадру в высоком разрешении в 1/60 часть секунды? Ответом было "нет". До сих пор.
Попиксельное затенение помогает моделировать некоторые природные особенности и такие сложные поверхности, как мех, ткань, стекло, камень и другие материалы с высокой детализацией.
Раньше различные эффекты применялась ко всему треугольному полигону и иногда ко всей текстуре с помощью интерполяции (interpolation). При этом для расчета брались вершины треугольника и с помощью них интерполировался требуемый район. В результате, создавалось впечатление, как будто изображение размыто (approximation). Самое главное преимущество интерполяции: она быстрая и ее легко применять. Ну а главный недостаток: при больших треугольниках, получаемое изображение содержит артефакты, ухудшающие качество восприятия.
С помощью попиксельного затенения, для расчета эффектов берутся отдельные пиксели. Так как треугольник состоит из многих пикселей, получающееся изображение очень хорошо подчеркивает мелкие детали. Представьте, что треугольник занимает 100 пикселей. Предположим, у нас есть палитра из десяти эффектов. Каждый пиксель может принимать любые из десяти возможных эффектов. В таком случая для треугольника получается 10 000 комбинаций различных эффектов. Если бы использовалась интерполяция, то треугольник мог участвовать не более чем в 10 эффектах, причем каждый эффект распространялся бы на весь треугольник. Ниже вы можно наглядно сравнить использование интерполяции или попиксельного затенения.
GeForce2 может реализовывать Dot3 (Dot Product) и другие современные эффекты наложения карт среды (bump mapping) и эффекты затенения на каждый пиксель.
Реализация NSR в GeForce2
NSR позволяет смешение (texture-blend operation) только двух текстур за проход
Хотя разработчики и могут создавать потрясающие эффекты за один или несколько проходов, у них не было возможности циклических операций. Так как процесс не мог быть повторно применен к одному и тому же пикселю, эффекты, требуемые зависимого наложения текстур, были невозможны. Несмотря на это существенное ограничение, фиксированный конвейер NSR уже мог создавать очень правдоподобные и реалистичные сцены методом наложения карт среды Dot3. Что позволило играм значительно улучшить детализацию без усложнения геометрии объекта.
Вершинный конвейер затенения в GeForce3
Скорее всего, так выглядит (vertex shading pipeline), который появился в GeForce3.
Пояснение: GeForce3 обрабатывает 4 текстуры за один проход. Логично, что GeForce3 должна обрабатывать их независимо, для реализации "бесконечного" количества эффектов, рекламируемых nVidia. Кроме независимого "жонглирования" текстурами, чип должен применять эффекты к каждой текстуре независимо, используя шейдеры DirectX8.
С помощью нового движка, возможна реализация таких текстурных эффектов, как блеск, неровности и динамическое изменение. Разработчики могут сами программировать nfiniteFX движок (программируемые пиксельные и вершинные шейдеры) для реализации бесконечного количества комбинаций.
После завершения операций над текстурами, можно получить дополнительные варианты комбинаций путем смешения (blends) до 8 текстур. Все эти операции поддерживаются пиксельными шейдерами DirectX 8.
Приведенные скриншоты были получены во время игры на GeForce2 Ultra в реальном времени. По ним вы можете себе представить, как выглядит игра Giants. Вид облаков и неба в этой игре лучший из всех что я видел.
Имейте в виду, что все это реализовано благодаря простейшим функциям NSR. Мы еще даже не увидели всех возможностей нового движка nfiniteFX. Хотя, всему свое время.
В традиционных графических конвейерах, каждый этап имеет свои заранее известные функции, и эти функции систематически выполняются. Разработчик не может изменить выполняемые функции на каком-нибудь этапе. Ниже приведена диаграмма традиционного графического конвейера.
Диаграмма традиционного графического конвейера
На каждом этапе выполняется ряд функций, которые заранее известны и зашиты в графический процессор. В связи с этим ограничиваются возможности экспериментирования. Поэтому специальные эффекты через графический процессор реализовать сложнее. Все что в нем не определено, должно быть выполнено процессором системы, отнимая драгоценные циклы процессора. nVidia смогла преодолеть это ограничение благодаря добавлению возможности динамически менять конвейер.
Диаграмма графического конвейера GeForce3
Таким образом, разработчик получает инструмент управления конвейером. Он может динамически вставить кусок кода на ассемблере прямо в конвейер, изменить различные настройки и затем продолжить процесс. Эта черта дает уникальные возможности программистам. Представьте себе что для каждой игры система сама бы выбирала наиболее подходящую графическую карту. Программирование вершинных шейдеров – почти то же самое.
Ниже перечислены некоторые характерные черты программируемых вершинных шейдеров:
Процесс вершинного программирования
Можно привести пример вершинного программирования. У вас есть три вершины, формирующие треугольный полигон. Передаем вершины в вершинный манипулятор (vertex manipulator). В нем каждая вершина может быть изменена любым образом, причем количество таких изменений не ограничено. Здесь уже все зависит от воображения программиста. У получившихся вершин могут измениться любые параметры: координаты, цвет и прозрачность. Самое интересное в этом процессе: программист может выбирать, какую вершину он желает изменить. Это могут быть все, одна или вообще ни одной. То есть, он может решить что только вершина No1 и No2 должны быть изменены и переданы дальше. Над следующими тремя вершинами он может поступить совсем другим образом. Конечно, можно изменять каждую следующую вершину в одном и том же цикле, как уж пожелает программист.
Таким образом, разработчик получает возможность реализовывать неограниченное количество спецэффектов над объектами. Эффекты могут применяться как над целым объектом, так и над его частями, для подчеркивания деталей. Мы видим что возможности на самом деле ничем не ограничены, о чем и говорит название "nfiniteFX" (Infinite – бесконечный).
"Мембрана" - этот пример вершинного шейдера
изменяет цвет объекта при удалении точек поверхности
от наблюдателя
Кроме правдоподобных движений, герои смогут очень достоверно передавать эмоции. Например, при улыбке героя мы сможем наблюдать ямочки и морщинки, являющиеся следствием усилий мускулов. Все это может быть реализовано с использованием кадровой анимации (keyframe animation).
Сейчас возможно использование вершинных шейдеров в стиле мультфильма (cartoon style)
Плохой пример, но преимущества размазывания движущихся объектов увидеть можно
Попиксельное наложение карт среды
Поверхности высокого порядка можно представить как поверхности, основанные на кривых линиях. Примером линейной формулы может быть y=m*x+b или прямая линия. Множество прямых линий можно использовать для создания иллюзии кривой линии, но необходимо просто огромное число прямых поверхностей для создания одной кривой поверхности. nVidia улучшила ускорение поверхностей высокого порядка в GeForce3. Примером формулы высокого порядка может быть y=mx^2+b, где x возводится в степень. Конечно, показатель степени не обязательно всегда равняется двум, но для реальных поверхностей такой степени вполне достаточно.
В этом году вы увидите большое количество игр с истинными кривыми поверхностями. Это должно сильно улучшить вид героев и окружающей среды. Ведь на самом деле, практически невозможно создать реалистичную "живую" модель используя только прямые линии.
Несколько вещей так и не были затронуты в этой статье, и вы их наверняка прочитаете в будущих материалах по GeForce3.
Главная цель этой статьи – объяснить преимущества пиксельного и вершинного затенения (pixel shading/vertex shading). Эти две технологии являются основой движка nVidia nfiniteFX. Так как обе технологии опираются на возможность программирования, движок может реализовывать практически бесконечное число вариантов. Разработчики игр могут меньше концентрировать свое внимание на особенностях программных движков и реализовывать более подробную физическую модель мира.
Комбинация этих двух технологий может создавать реалистичные детали на поверхностях, основанные как на прямых линиях, так и на кривых. Мы получим увеличение детализации без увеличения числа полигонов. Что, впрочем, не отменяет постепенно растущую потребность в большом числе полигонов. Но технология движется вперед, мы получаем все больше и больше деталей, больше эффектов и больше реализма.
mipmapping (мипмаппинг) - множественное отображение (последовательность текстур одного и того же изображения с уменьшающимся разрешением по мере удаления отображаемого объекта от наблюдателя)
Environment Mapped Bump Mapping (EMBM) — поддержка аппаратного ускорения рельефного текстурирования с использованием карт окружающей среды
Pixel Shading – пиксельное затенение, способ применения специальных эффектов к отдельному пикселю.
Pixel Shader – пиксельный шейдер, способ программирования попиксельного затенения.
Vertex Shader – вершинный шейдер, способ программирования вершинных эффектов.