Часть вторая. Графические конвейеры GeForce 256 и GeForce 2
В предыдущей статье "Часть 1. Обобщенный графический конвейер", опубликованной в "КВ" №39, рассмотрены наиболее типичные задачи, возникающие при отображении интерактивной трехмерной графики. Данная, вторая, часть посвящена рассмотрению особенностей аппаратной реализации графического конвейера на примере видеокарт GeForce 256 и GeForce 2 GTA.
GeForce 256 (NV 10)
До появления GeForce 256 видеокарты рассчитывали только два последних этапа графического конвейера (см. "КВ" №39) - triangle setup & clipping и rasterizing. Само появление линейки видеокарт GeForce обязано родившейся в стенах nVidia идее аппаратного ускорения этапов трансформации и освещения, "ноги" которой (идеи, а не nVidia:-) "растут" из опыта разработки сложных каркасных моделей в профессиональных пакетах CAD. Это я к тому, что GeForce - сугубо "игровая" карта. В nVidia "просто" решили сделать общедоступными, массовыми, те технологии, которые присутствовали раньше только в дорогих профессиональных рабочих станциях. За что им большое спасибо.
Почему же расчет трансформаций на видеокарте ускоряет отображение? Здесь нужно вспомнить, что трансформации - это узкоспециализированные операции матричного умножения. В силу этого можно создать вычислительное устройство, которое будет уметь только перемножать матрицы, но зато очень быстро. В результате аппаратные трансформации в GeForce 256 рассчитывают полигоны, как минимум, в 2-4 раза быстрее, чем любой процессор из существовавших на момент ее выхода. Процессор мог обсчитать, максимум, 1-2 миллионов полигонов, а новая видеокарта в идеале - до 15 миллионов.
Что это означает для конечных пользователей, то бишь, для нас с вами? Во-первых, гораздо более высокую детализацию полигонных моделей в играх и возможность разрабатывать сложные детализированные объекты без потери интерактивности в пакетах трехмерного моделирования. Во-вторых, трансформации не ограничиваются только преобразованиями, связанными с перемещением наблюдателя или объекта как целого. Если мы уже умеем перемножать все вершины на одну и ту же матрицу, то почему не пойти дальше и не перемножать на несколько матриц не все, а часть вершин объекта? В результате получаем анимацию, рассчитываемую только видеокартой в режиме реального времени! И это не фантастика, а абсолютная реальность, известная как vertex blending. Ходят слухи, что Кармак использует этот механизм для анимации в DOOM 3.
Блок трансформаций также поддерживает четыре дополнительных плоскости отсечения к шести основным.
Что касается аппаратных расчетов освещения, то здесь ситуация не столь радужная. Да, GeForce 256 поддерживает на аппаратном уровне расчет освещенности от нескольких источников света. Но, как уже говорилось, зашитый в видеокарту алгоритм рассчитывает только рассеянную и отраженную компоненты освещения. Кроме того, GeForce 256 не умеет правильно интерполировать освещенность на уровень пикселов - нормали вершин теряются после этапа расчета их освещенности, а интерполяция без построения нормалей для пикселов приводит к тому, что мы увидим "граненую" поверхность, с резкими изломами освещенности на ребрах полигонов. То есть, в лучшем случае - модель освещенности по Гуро, корректная модель гладкой освещенности по Фонгу только аппаратными средствами GeForce 256 хотя и достижима, но не заложена разработчиками как стандартная. Блок освещения поддерживает аппаратный расчет до восьми источников света.
В GeForce 256 можно одновременно накладывать две текстуры. Реализована аппаратная генерация трех типов текстурных координат - по координатам вершин, по лучу отражения взгляда в вершинах и по нормалям вершин. Генерация текстурных координат по координатам вершин используется для создания проективных текстурных координат (пример - свет от фонарика, закрепленного на голове игрового персонажа). Текстурные координаты по нормалям вершин позволяют рассчитывать и использовать текстуру глобального освещения, а текстуры по лучу отражения - текстуру отражения окружающей среды (cube environment mapping). То есть, сначала просчитываются шесть текстур отражения (например, с помощью камеры), затем эти шесть текстур накладываются на шесть граней куба. Куб помещается в сцену так, чтобы отражающие объекты находились внутри него. Принцип расчетов прост - от наблюдателя посылается луч в каждую вершину объекта, с помощью нормали рассчитывается отраженный луч по закону "угол падения равен углу отражения", отраженный прослеживается до пересечения с гранью куба. Такое пересечение даст участок текстуры, который и будет сопоставлен вершине. Как уже говорилось, интерполяция текстурных координат на уровень пикселов может быть выполнена точно. В результате можно иметь в сцене объект с поверхностью, динамически и в реальном времени отражающей окружение.
Аналогично работает алгоритм для текстуры освещенности, только вместо луча используется направление нормали.
Что касается пиксельной растеризации и интерполяции, т.е. SETUP & CLIPPING - RASTERIZING, то скорость его работы в GeForce 256 составляет 480 миллионов пикселов в секунду, а графический конвейер позволяет одновременно смешивать данные для четырех пикселов, т.е. содержит четыре пиксельных блока, работающих независимо. В каждом пиксельном блоке имеется по одному текстурному блоку. Как уже говорилось, GF256 может одновременно накладывать две текстуры. В этом случае необходимо спаривание текстурных блоков, и скорость обработки пикселов падает вдвое - до 240 млн. пикселов в секунду.
nVidia разработала и зарегистрировала специальное расширение пиксельных шейдеров NV_REGISTER_COMBINERS, регламентирующих внутренние регистры пиксельных данных блоков растеризации и команды для работы с ними, предоставляя возможность программирования алгоритмов смешивания атрибутов пикселов на своеобразном "ассемблере". Данное расширение позволяет, в частности, выполнить интерполяцию нормалей для каждого пиксела и тем самым построить попиксельную карту нормалей. Эта возможность имеет два очень важных следствия. Первое - расчет сглаженной освещенности по Фонгу. Второе - можно накладывать текстуру рельефа (bump) на пиксельную карту нормалей, "модулируя" изменение направления этих нормалей. Расчет освещенности пиксела с измененными таким образом нормалями приводит к тому, что поверхность объекта обретает "рельеф", соответствующий наложенной bump-текстуре. Кого интересуют детали, рекомендую почитать www.reactor.ru:8101/review-geforceshaders/review-geforceshaders.shtml.
Аналогичный метод расчета попиксельной освещенности и наложения текстуры рельефа получил название метода попиксельного скалярного произведения (per-pixel dot product) и был встроен nVidia в свои видеокарты следующего поколения - GeForce 2 как nVidia Shading Rasterizer (NSR).
Реальная производительность GF256 существенно снижается при использовании нескольких аппаратных возможностей одновременно, например, при использовании расчетов трансформаций и освещения с 4 источниками света реальная скорость обсчета сцены может падать до 2-3 миллионов треугольников в секунду. Так что заявленная скорость в 15 миллионов треугольников если и достижима, то только при работе с полигонными моделями в каркасном отображении (в этом случае из всех параметров вершин остаются только координаты и цвет, освещения и текстурирования нет вообще), и наибольшую выгоду от GeForce 256 получили как раз CAD-инженеры, а не игроки.
GeForce 2 GTS/Pro/Ultra (NV 15)
Следующим эволюционным этапом стала видеокарта GeForce 2 GTS (GigaTexel Shading). Основных качественных отличий от предшественника у нее три: повышенная частота графического процессора и памяти, два текстурных блока на каждый из четырех пиксельных конвейеров, NSR.
Повышение частоты процессора и памяти (200/200 МГц для GTS) привело к увеличению производительности графического конвейера почти на 70% по отношению к GeForce 256: количество обрабатываемых треугольников теперь составляет 25 миллионов в секунду, а скорость обработки пикселов - 800 миллионов в секунду. Причем эта скорость не падает при одновременном наложении двух текстур - за счет того, что каждый из четырех пиксельных конвейеров имеет по два текстурных блока.
Об NSR (nVidia Shading Rasterizer) мы уже говорили выше. Этот технологический механизм позволяет разработчикам приложений программировать различные собственные способы смешивания пиксельных данных. Программирование пиксельных шейдеров было поддержано и в API DirectX 8.0 от Microsoft. Помимо регламентации данных и команд программирования, NSR содержит семь предопределенных операций над пиксельными данными, выполняемых за один проход: Base Texture (наложение текстуры), Per-Pixel Bump Mapping (рельефное текстурирование двух типов - Emboss и Dot Product3), Ambient Light (основной цвет объекта), Per-Pixel Diffuse Lighting (рассеянный свет), Per-Pixel Specular Lighting (отраженный свет), Colored Fog (цветной туман), Alpha Transparency (прозрачность с использованием альфа-канала).
Среди прочих возможностей GeForce 2 упоминания заслуживают: 32-битный Z-буфер, увеличивающий обрабатываемую видеокартой глубину сцены; сжатие текстур и данных Z-буфера, экономящие память и полосу пропускания; эффекты Motion Blur и Depth of Field, трилинейную и анизотропную фильтрации; максимальный размер текстуры до 2048x2048 пикселов в 32-битном цвете. Я специально не говорю о других очень интересных возможностях GF 2, в частности, о поддержке видео и DVD, поскольку предметом данной статьи является отображение трехмерной графики.
Главное значение появления GeForce 2 GTS заключается в том, что именно начиная с этой видеокарты у разработчиков приложений появилась официально поддержанная реальная возможность программирования аппаратных расчетов отображения 3D. Таким образом, GeForce 256 и GeForce 2 GTS вкупе, благодаря расширению возможностей аппаратных расчетов отображения трехмерной графики (T&L) и введению вершинных и программируемых пиксельных конвейеров, заложили основы RISC-архитектуры будущих поколений видеокарт. Введение программируемых вершинных конвейеров в чипсетах NV 20 (GeForce 3 и 4) и NV 30 окончательно устраняет принципиальное отличие интерактивного 3d и кино, делая качество и сложность последнего вполне достижимым для первого.
Рассмотрение этих очень интересных возможностей - прежде всего программируемых вершинных и пиксельных шейдеров, а также их влияние на качество и скорость отображения станет предметом рассмотрения следующей статьи.
А в завершении обзора GF256 и GF2 приведу некоторые результаты тестирования их производительности в пакетах трехмерного моделирования Alias Wavefront Maya 4.5 и 3d studio max 5. Идея тестирования заключается в вычислении производительности видеокарты по отображению каркасных моделей в видовых окнах упомянутых программ, поскольку, с одной стороны, такой режим работы интенсивно используется на начальном этапе создания трехмерной сцены, с другой - трансформации (повороты, перемещения и масштабирование) каркасных моделей идеально подходят для тестирования аппаратного блока T&L видеокарты.
Тестовая система: процессор PIII-600ЕВ с частотой 600 МГц, 640 Мб оперативной памяти PC-133, видеокарта GeForce 2 Pro c 64 Мб памяти типа DDR, операционная система - Win2K SP2. В качестве тестового в обоих программах использовался один и тот же 3d-объект, состоящий приблизительно из 600 тысяч полигонов.
Результаты тестов несколько обескураживают. Так, в 3d studio max производительность трансформаций составила около 400 тысяч полигонов в секунду в режиме отображения wireframe (каркас, т. е. только вершины и соединяющие их грани), что почти в 50 раз меньше заявленной производительности видеокарты (напомню, что она составляет 25 миллионов полигонов в секунду). В Maya дело обстоит несколько лучше - тесты показали производительность работы в видовых окнах в режиме wireframe на уровне 3 миллионов полигонов в секунду, хотя и это тоже не бог весть что, в сравнении с упомянутыми 25 миллионами. В режиме smoth and highlite (т. е. в режиме отображения сглаженной освещенной поверхности) производительность в видовых окнах падала более чем в два раза.
Чем вызвана такая ситуация - точно ответить сложно. Возможно, разработчики графических пакетов отнюдь не спешат (не рискуют?) воспользоваться имеющимися аппаратными возможностями. В последнем утверждении можно было бы сомневаться, если бы не было rtre (см. новости графики "КВ" №39) - рендер-плагина для 3d studio max с производительностью в 30 миллионов полигонов в секунду.
Возможно, дело обстоит лучше в случае использования более современных видеокарт GeForce 3 и 4, поскольку их можно программировать. Провести их тестирование пока не удалось ввиду отсутствия у меня образцов этих видеокарт.
Игорь СИВАКОВ,
igsiv@tut.by
Горячие темы