Вопрос о том, что же является двигателем всей компьютерной индустрии, давно заботит многих пользователей. То ли это фирма Intel, которая, не переставая, выпускает и выпускает новые процессоры. Но кто тогда заставляет их покупать? Может, во всем виноват Microsoft, который непрерывно делает свои окна больше и краше? Да нет, можно ведь довольствоваться старыми версиями программ - тем более спектр их возможностей практически не изменяется. Вывод напрашивается сам собой - во всем виноваты игры. Да, именно игры стремятся все более и более уподобиться реальному миру, создавая его виртуальную копию, хотят все более мощных ресурсов.
Вся история компьютерной графики на PC является тому подтверждением.
Вспомните, в начале были тетрисы, диггеры, арканоиды. Вся графика
заключалась в перерисовке небольших участков экрана, спрайтов, и нормально
работала даже на XT. Но прошли те времена. Взошла звезда симуляторов.
С
выходом таких игр, как F19, Formula 1 и т.п., в которых приходилось уже
перерисовывать весь экран, предварительно заготавливая его в памяти, всем
нам пришлось обзавестись, по крайней мере, 286 процессором. Но прогресс на
этом не остановился. Желание уподобить виртуальный мир в игре реальному
миру усилилось, и появился Wolf 3D.
Это, можно сказать, первая 3D-игра, в которой был смоделирован какой-никакой, но все же реалистичный мир. Для его реализации пришлось использовать верхнюю (более 640 Кб) память и загнать программу в защищенный режим. Для полноценной игры пришлось установить процессор 80386. Но и мир Wolf 3D страдал недостатками. Хотя стены и были не просто одноцветными прямоугольниками, но для их закраски использовались текстуры с небольшим разрешением, поэтому поверхности смотрелись прилично лишь на расстоянии. Конечно, можно было пойти по пути наращивания разрешения текстур, вспомним, например, DOOM. Тогда нам пришлось снова перейти на более новый процессор и увеличить количество памяти. Правда, все равно, хотя изображение и улучшилось, но ему были присущи все те же недостатки. Да и плоские объекты и монстры - кому это интересно.
Тут то и взошла звезда Quake. В этой игре был применен революционный подход - z-буфер, позволивший придать объемность всем объектам. Однако вся игра все равно работала в невысоком разрешении и не отличалась высокой реалистичностью.
Назревало новое аппаратное решение. И решение это оказалось, в общем-то, лежащим на поверхности. Раз пользователи хотят играть в трехмерном виртуальном мире, то процесс его создания (вспомним минуты ожидания, проведенные за 3D Studio перед появлением очередной картинки) надо кардинально ускорить. А раз центральный процессор с этой задачей справляется из рук вон плохо, было принято революционное решение - сделать специализированный пpоцессоp.
Тут то и вылез производитель игровых автоматов 3Dfx, сделавший эту сказку былью с помощью своего графического процессора Voodoo. Человечество сделало еще один шаг в виртуальный мир.
А поскольку операционной системы на PC с текстурными окнами, уплывающими назад, в туман, пока нет, и не предвидится, весь аппарат трехмерной графики можно пока применить только к играм, что успешно делает все цивилизованное человечество.
Для изображения трехмерных объектов на экране монитора требуется
проведение серии процессов (обычно называемых конвейером) с последующей
трансляцией результата в двумерный вид. Первоначально, объект
представляется в виде набора точек, или координат, в трехмерном
пространстве. Трехмерная система координат определяется тремя осями:
горизонтальной, вертикальной и глубины, обычно называемых, соответственно
осями x, y и z. Объектом может быть дом, человек, машина, самолет или
целый 3D мир и координаты определяют положение вершин (узловых точек), из
которых состоит объект, в пространстве. Соединив вершины объекта линиями,
мы получим каркасную модель, называемую так из-за того, что видимыми
являются только края поверхностей трехмерного тела. Каркасная модель
определяет области, составляющие поверхности объекта, которые могут быть
заполнены цветом, текстурами и освещаться лучами света.
Даже при таком упрощенном объяснении конвейера 3D графики становится
ясно, как много требуется вычислений для прорисовки трехмерного объекта на
двумерном экране. Можно представить, насколько увеличивается объем
требуемых вычислений над системой координат, если объект движется.
Большинство игр, а также множество более серьезных приложений следуют довольно стандартной схеме построения трехмерных изображений (далее мы будем называть этот процесс конвейером). Причем, некоторые программы реализуют все стадии этого конвеера, некоторые же перекладывают часть работы на плечи аппаратных устройств, специальных библиотек программ (API), другие программы или, даже, пользователя. Итак, конвейер состоит из следующих стадий:
Теоретически мы подковались, теперь попробуем разобраться, как все обстоит на самом деле. Во-первых, некоторые стадии этого конвейера могут быть переставлены местами, разбиты на части или совмещены. Во-вторых они могут отсутствовать вообще (редко) или могут появится новые (часто). И, в-третьих, результат работы каждой из них может быть послан (в обход других стадий) обратно. Например, картинку, полученную на последней стадии, можно использовать как новую текстуру для 8-ой реализуя таким образом эффект отражающих поверхностей (зеркал). Таких, как мраморный пол в игре Unreal.
Хорошо, теперь у нас есть последовательность действий. Но для производства готового результата надо определится с двумя вещами - кто какие стадии будет выполнять и как он это будет делать. У нас есть три основных кандидата на работу - сама программа (как правило - начальные стадии конвейера), библиотека прикладного программирования (интерфейс, API) и сам ускоритель. Впрочем, программы, не использующие ускоритель, (Doom, Quake в программном режиме и т.д.) все стадии конвейера выполняют самостоятельно. В понятие библиотеки в данном контексте можно (без особого зазрения совести) поместить драйвера данного ускорителя т.к. с точки зрения программы они становятся частью библиотеки. Программ и ускорителей существует великое множество, а вот число общепризнанных библиотек весьма ограничено. Наиболее часто игры используют следующие библиотеки
Еще существует около 10 библиотек низкого уровня, созданных разработчиками различных ускорителей, такие как R-Redline фирмы Rendition, S3D Toolkit фирмы S3 и т.д. Как и следовало ожидать, программы, написанные специально для них, постепенно исчезают.
Хотя большинство современных ускорителей берут на себя лишь две-три последние стадии конвейера, существует важное и быстро прогрессирующие исключение из этого правила: появились первые доступные чипы с поддержкой геометрических преобразований, способные здорово увеличить скорость построения изображения на компьютерах с недостаточной вычислительной мощностью (а она, мощность, недостаточна по определению - иначе не было бы потребности в ускорителях вообще).
Программируемый интерфейс приложений (API) состоит из функций, управляющих 3D конвейером на программном уровне, но при этом может использовать преимущества аппаратной реализации 3D, в случае наличия этой возможности. Если имеется аппаратный ускоритель, API использует его преимущества, если нет, то API работает с оптимальными настройками, рассчитанными на самые обычные системы. Таким образом, благодаря применению API, любое количество программных средств может поддерживаться любым количеством аппаратных 3D ускорителей.
Существование и доступность 3D интерфейсов, поддерживающих множество графических подсистем и приложений, увеличивает потребность в аппаратных ускорителях трехмерной графике, работающих в режиме реального времени. Развлекательные приложения, главный потребитель и заказчик таких ускорителей, но не стоит забывать и о прфессиональных приложениях для обработки 3D графики, работающих под управлением Windows NT, многие из которых переносятся с высокопроизводительных рабочих станций, типа Silicon Graphics, на PC платформу. Интернет приложения сильно выиграют от невероятной маневренности, интуитивности и гибкости, которые обеспечивает применение трехмерного графического интерфейса. Взаимодействие в World Wide Web будет гораздо проще и удобнее, если будет происходить в трехмерном пространстве.
Рынок графических подсистем до появления понятия мультимедиа был относительно прост в развитии. Важной вехой в развитии был стандарт VGA (Video graphics Array), разработанный компанией IBM в 1987 году, благодаря чему производители видеоадаптеров получили возможность использовать более высокое разрешение (640х480) и большую глубину представления цвета на мониторе компьютера. С ростом популярности ОС Windows, появилась острая потребность в аппаратных ускорителях двумерной графики, чтобы разгрузить центральный процессор системы, вынужденный обрабатывать дополнительные события. Отвлечение CPU на обработку графики существенно влияет на общую производительность GUI (Graphical User Interface) - графического интерфеса пользователя, а так как ОС Windows и приложениям для нее требуется как можно больше ресурсов центрального процессора, обработка графики осуществлялась с более низким приоритетом, т.е. делалась очень медленно. Производители добавили в свои продукты функции обработки двумерной графики, такие, как прорисовка окон при открытии и свертовании, аппаратный курсор, постоянно видимый при перемещении указателя, закраска областей на экране при высокой частоте регенерации изображения. Итак, появился процессор, обеспечивающий ускорение VGA (Accelerated VGA - AVGA), также известный, как Windows или GUI ускоритель, который стал обязательным элементом в современных компьютерах.
Внедрение мультимедиа создало новые проблемы, вызванные добавлением таких компонентов, как звук и цифровое видео к набору двумерных графических функций. Сегодня легко заметить, что многие продукты AVGA поддерживают на аппаратном уровне обработку цифрового видео. Следовательно, если на Вашем мониторе видео проигрывается в окне, размером с почтовую марку - пора установить в Вашей машине мультимедиа ускоритель. Малтимедиа ускоритель (multimedia accelerator) обычно имеет встроенные аппаратные функции, позволяющие масштабировать видеоизображение по осям x и y, а также аппаратно преобразовывать цифровой сигнал в аналоговый, для вывода его на монитор в формате RGB. Некоторые малтимедиа акселлераторы могут также иметь встроенные возможности декомпресси цифрового видео.
Разработчики графических подсистем должны исходить из требований, частично диктуемых размерами компьютерного монитора, частично под влиянием GUI, и частмчно под влиянием графического процессора. Первичный стандарт VGA с разрешением 640х480 пикселов был адекватен 14" мониторам, наиболее распространенных в то время. Сегодня наиболее предпочтительны мониторы с размером диагонали трубки 17", благодаря возможности выводить изображения с разрешением 1024х768 и более.
Основной тенденцией при переходе от VGA к мультимедиа ускорителям была возможность размещения как можно больше визуальной информации на мониторе компьютера. Использование 3D графики является логичным развитием этой тенденции. Огроммные объемы визуальной информации могут быть втиснуты в ограниченное пространство экрана монитора, если она представляется в трехмерном виде. Обработка трехмерной графики в режиме реального времени дает возможность пользователю легко оперировать представляемыми данными.
Первое правило компьютерных игр - нет никаких правил. Традиционно,
разработчики игр больше заинтересованы в крутой графике своих программ,
чем следованию рекомендаций технарей. Не взирая на то, что в распоряжении
разработчиков имеется множество трехмерных API, например - Direct3D,
некоторые программисты идут по пути создания собственного 3D игрового
интерфейса или двигателя. Собственные игровые двигатели - один из путей
для разработчиков добиться невероятной реалистичности изображения,
фактически на пределе возможностей графического программирования.
Нет ничего более желанного для разработчика, чем иметь прямой доступ к аппаратным функциям компонентов системы. Несколько известных разработчиков создали свои собственные игровые двигатели, работающие с оптимальным использованием аппаратных ускорителей графики, которые принесли им известность и деньги. Например, двигатели Interplay для Descent II и id Software для Quake, обеспечивают истинную трехмерность действия, используя наполную аппаратные функции 3D, если они доступны.
Пусть нам все-таки удалось убедить Вас попробовать трехмерную графику в действии (если Вы до сих пор не сделали это), и Вы решили сыграть в одну из трехмерных игр, предназначенных для применения 3D-видеокарты.
Допустим, такой игрой оказался симулятор автомобильных гонок, и Ваша машина уже стоит на старте, готовая устремиться к покорению новых рекордов. Идет предстартовый обратный отсчет, и Вы замечаете, что вид из кабины, отображаемый на экране монитора, немного отличается от привычного.
Вы и прежде участвовали в подобных гонках, но впервые изображение поражает Вас исключительным реализмом, заставляя поверить в действительность происходящего. Горизонт, вместе с удаленными объектами, тонет в утренней дымке. Дорога выглядит необычайно ровно, асфальт представляет собой не набор грязно-серых квадратов, а однотонное покрытие с нанесенной дорожной разметкой. Деревья вдоль дороги действительно имеют лиственные кроны, в которых, кажется, можно различить отдельные листья. От всего экрана в целом складывается впечатление как от качественной фотографии с реальной перспективой, а не как от жалкой попытки смоделировать реальность.
Попробуем разобраться, какие же технические решения позволяют 3D-видеокартам передавать виртуальную действительность с такой реалистичностью. Каким образом изобразительным средствам PC удалось достигнуть уровня профессиональных студий, занимающихся трехмерной графикой.
Часть вычислительных операций, связанных с отображением и моделированием трехмерного мира переложено теперь на 3D-акселератор, который является сердцем 3D-видеокарты. Центральный процессор теперь практически не занят вопросами отображения, образ экрана формирует видеокарта. В основе этого процесса лежит реализация на аппаратном уровне ряда эффектов, а также применение несложного математического аппарата. Попробуем разобраться, что же конкретно умеет графический 3D-процессор.
Возвращаясь к нашему примеру с симулятором гонок, задумаемся, каким образом достигается реалистичность отображения поверхностей дороги или зданий, стоящих на обочине. Для этого применяется распространенный метод, называемый текстурирование (texture mapping).
Это самый распространенный эффект для моделирования поверхностей. Например, фасад здания потребовал бы отображения множества граней для моделирования множества кирпичей, окон и дверей. Однако текстура (изображение, накладываемое на всю поверхность сразу) дает больше реализма, но требует меньше вычислительных ресурсов, так как позволяет оперировать со всем фасадом как с единой поверхностью. Перед тем, как поверхности попадают на экран, они текстурируются и затеняются. Все текстуры хранятся в памяти, обычно установленной на видеокарте. Кстати, здесь нельзя не заметить, что применение AGP делает возможным хранение текстур в системной памяти, а ее объем гораздо больше.
Очевидно, что когда поверхности текстурируются, необходим учет перспективы, например, при отображении дороги с разделительной полосой, уходящей за горизонт. Перспективная коррекция необходима для того, чтобы текстурированные объекты выглядели правильно. Она гарантирует, что битмэп правильно наложится на разные части объекта - и те, которые ближе к наблюдателю, и на более далекие.
Коррекция с учетом перспективы очень трудоемкая операция, поэтому нередко можно встретить не совсем верную ее реализацию.
При наложении текстур, в принципе, также можно увидеть швы между двумя ближайшими битмэпами. Или, что бывает чаще, в некоторых играх при изображении дороги или длинных коридоров заметно мерцание во время движения. Для подавления этих трудностей применяется фильтрация (обычно Bi- или tri-линейная).
Билинейная фильтрация - метод устранения искажений изображения. При медленном вращении или движении объекта могут быть заметны перескакивания пикселов с одного места на другое, что и вызывает мерцание. Для снижения этого эффекта при билинейной фильтрации для отображения точки поверхности берется взвешенное среднее четырех смежных текстурных пикселов.
Трилинейная фильтрация несколько сложнее. Для получения каждого пиксела изображения берется взвешенное среднее значение результатов двух уровней билинейной фильтрации. Полученное изображение будет еще более четкое и менее мерцающее.
Текстуры, с помощью которых формируется поверхность объекта, изменяют
свой вид в зависимости от изменения расстояния от объекта до положения
глаз зрителя. При движущемся изображении, например, по мере того, как
объект удаляется от зрителя, текстурный битмэп должен уменьшаться в
размерах вместе с уменьшением размера отображаемого объекта. Для того
чтобы выполнить это преобразование, графический процессор преобразует
битмэпы текстур вплоть до соответствующего размера для покрытия
поверхности объекта, но при этом изображение должно оставаться
естественным, т.е. объект не должен деформироваться непредвиденным
образом.
Но вернемся в наш гоночный автомобиль. Сама дорога уже выглядит
реалистично, но проблемы наблюдаются с ее краями! Вспомните, как выглядит
линия, проведенная на экране не параллельно его краю. Вот и у нашей дороги
появляются "рваные края". И для борьбы с этим недостатком изображения
применяется anti-aliasing.
Рваные края | Ровные края |
---|
Мы подходим к ключевому моменту функционирования всех 3D-алгоритмов. Предположим, что трек, по которому ездит наша гоночная машина, окружен большим количеством разнообразных объектов - строений, деревьев, людей.
Тут перед 3D-процессором встает главная проблема, как определить, какие из объектов находятся в области видимости, и как они освещены. Причем, знать, что видимо в данный момент, недостаточно. Необходимо иметь информацию и о взаимном расположении объектов. Для решения этой задачи применяется метод, называемый z-буферизация. Это самый надежный метод удаления скрытых поверхностей. В так называемом z-буфере хранятся значения глубины всех пикселей (z-координаты). Когда рассчитывается (рендерится) новый пиксел, его глубина сравнивается со значениями, хранимыми в z-буфере, а конкретнее с глубинами уже срендеренных пикселов с теми же координатами x и y. Если новый пиксел имеет значение глубины больше какого-либо значения в z-буфере, новый пиксел не записывается в буфер для отображения, если меньше - то записывается.
Z-буферизация при аппаратной реализации сильно увеличивает производительность. Тем не менее, z-буфер занимает большие объемы памяти: например даже при разрешении 640x480 24-разрядный z-буфер будет занимать около 900 Кб. Эта память должна быть также установлена на 3D-видеокарте.
Разрешающая способность z-буфера - самый главный его атрибут. Она критична для высококачественного отображения сцен с большой глубиной. Чем выше разрешающая способность, тем выше дискретность z-координат и точнее выполняется рендеринг удаленных объектов. Если при рендеринге разрешающей способности не хватает, то может случиться, что два перекрывающихся объекта получат одну и ту же координату z, в результате аппаратура не будет знать какой объект ближе к наблюдателю, что может вызвать искажение изображения. Для избежания этих эффектов профессиональные платы имеют 32-разрядный z-буфер и оборудуются большими объемами памяти.
Кроме вышеперечисленных основ, трехмерные графические платы обычно имеют возможность воспроизведения некоторого количества дополнительных функций. Например, если бы Вы на своем гоночном автомобиле въехали бы в песок, то обзор бы затруднился поднявшейся пылью. Для реализации таких и подобных эффектов применяется fogging (затуманивание). Этот эффект образуется за счет комбинирования смешанных компьютерных цветовых пикселов с цветом тумана (fog) под управлением функции, определяющей глубину затуманивания. С помощью этого же алгоритма далеко отстоящие объекты погружаются в дымку, создавая иллюзию расстояния.
Реальный мир состоит из прозрачных, полупрозрачных и непрозрачных
объектов. Для учета этого обстоятельства, применяется alpha blending -
способ передачи информации о прозрачности полупрозрачных объектов. Эффект
полупрозрачности создается путем объединения цвета исходного пиксела с
пикселом, уже находящимся в буфере.
В результате цвет точки является
комбинацией цветов переднего и заднего плана. Обычно, коэффициент alpha
имеет нормализованное значение от 0 до 1 для каждого цветного пиксела.
Новый пиксел = (alpha)(цвет пиксела А) + (1 - alpha)(цвет пиксела В).
Очевидно, что для создания реалистичной картины происходящего на экране необходимо частое обновление его содержимого. При формировании каждого следующего кадра, 3D-акселератор проходит весь путь подсчета заново, поэтому он должен обладать немалым быстродействием. Но в 3D-графике применяются и другие методы придания плавности движению. Ключевой - Double Buffering.
Представьте себе старый трюк аниматоров, рисовавших на уголках стопки бумаги персонаж мультика, со слегка изменяемым положением на каждом следующем листе. Пролистав всю стопку, отгибая уголок, мы увидим плавное движение нашего героя. Практически такой же принцип работы имеет и Double Buffering в 3D анимации, т.е. следующее положение персонажа уже нарисовано, до того, как текущая страница будет пролистана. Без применения двойной буферизации изображение не будет иметь требуемой плавности, т.е. будет прерывистым. Для двойной буферизации требуется наличие двух областей, зарезервированных в буфере кадров трехмерной графической платы; обе области должны соответствовать размеру изображения, выводимого на экран. Метод использует два буфера для получения изображения: один для отображения картинки, другой для рендеринга. В то время как отображается содержимое одного буфера, в другом происходит рендеринг. Когда очередной кадр обработан, буфера переключаются (меняются местами). Таким образом, играющий все время видит отличную картинку.
В заключение обсуждения алгоритмов, применяемых в 3D-графических акселераторах, попробуем разобраться, каким же образом применение всех эффектов по отдельности позволяет получить целостную картину. 3D-графика реализуется с помощью многоступенчатого механизма, называемого конвейером рендеринга. Применение конвейерной обработки позволяет еще ускорить выполнение расчетов за счет того, что вычисления для следующего объекта могут быть начаты до окончания вычислений предыдущего.
Конвейер рендеринга может быть разделен на 2 стадии: геометрическая
обработка и растеризация.
На первой стадии геометрической обработки выполняется преобразование координат (вращение, перенос и масштабирование всех объектов), отсечение невидимых частей объектов, расчет освещения, определение цвета каждой вершины с учетом всех световых источников и процесс деления изображения на более мелкие формы. Для описания характера поверхности объекта она делится на всевозможные многоугольники. Наиболее часто при отображении графических объектов используется деление на треугольники и четырехугольники, так как они легче всего обсчитываются и ими легко манипулировать. При этом координаты объектов переводятся из вещественного в целочисленное представление для ускорения вычислений.
На второй стадии к изображению применяются все описанные эффекты в следующей последовательности: удаление скрытых поверхностей, наложение с учетом перспективы текстур (используя z-буфер), применение эффектов тумана и полупрозрачности, anti-aliasing. После этого очередная точка считается готовой к помещению в буфер со следующего кадра.
Из всего вышеуказанного можно понять, для каких целей используется память, установленная на плате 3D-акселератора. В ней хранятся текстуры, z-буфер и буфера следующего кадра. При использовании шины PCI, использовать для этих целей обычную оперативную память нельзя, так как быстродействие видеокарты существенно будет ограничено пропускной способностью шины. Именно по этому для развития 3D-графики особенно перспективно продвижение шины AGP, позволяющее соединить 3D-чип с процессором напрямую и тем самым организовать быстрый обмен данными с оперативной памятью. Это решение, к тому же, должно удешевить трехмерные акселераторы за счет того, что на борту платы останется лишь немного памяти собственно для кадрового буфера.
Повсеместное внедрение 3D-графики вызвало увеличение мощности компьютеров без какого-либо существенного увеличения их цены. Пользователи ошеломлены открывающимися возможностями и стремятся попробовать их у себя на компьютерах. Множество новых 3D-карт позволяют пользователям видеть трехмерную графику в реальном времени на своих домашних компьютерах. Эти новые акселераторы позволяют добавлять реализм к изображениям и ускорять вывод графики в обход центрального процессора, опираясь на собственные аппаратные возможности.
Хотя в настоящее время трехмерные возможности используются только в играх, думается, деловые приложения также смогут впоследствии извлечь из них выгоду. Например, средства автоматизированного проектирования уже нуждаются в выводе трехмерных объектов. Теперь создание и проектирование будет возможно и на персональном компьютере благодаря открывающимся возможностям. Трехмерная графика, возможно, сможет также изменить способ взаимодействия человека с компьютером. Использование трехмерных интерфейсов программ должно сделать процесс общения с компьютером еще более простым, чем в настоящее время.