Мы с Вами начинаем изучать новую тему: видеоплаты. Что
это такое? Это компонент персонального компьютера, ответственный за вывод
изображения на экран - скажете Вы, и безусловно будете правы. Но лишь отчасти.
Сегодня видеоадаптер (или видеоплата, видеокарта) - больше чем просто
устройство вывода на экран, современные возможности видеоплат гораздо богаче,
нежели еще несколько лет назад.
Мы рассмотрим с Вами, из каких физических частей состоит сегодня видеоплата, и какие функции эти части исполняют. А затем мы рассмотрим, что же современная видеоплата умеет делать того, о чем еще несколько лет назад и не мечтали, рассмотрим современные модели плат.
Итак, давайте разберемся из каких физических
компонентов состоит видеоплата.
Во первых, какого типа сигналы обрабатываются в
видеоплате: аналоговые или цифровые? Вы наверняка понимаете, что любая
информация в компьютере обрабатывается в цифровом виде, и видеоплата - не
исключение. С другой стороны: монитор устройство сугубо аналоговое, он оперирует
тремя каналами цвета (красный, зеленый, синий: RGB) и яркостью. Т.е. сигналы
обрабатываются в цифровом виде, а выводятся на монитор в аналоговом,
следовательно на видеоплате должен присутствовать цифроаналоговый
преобразователь - ЦАП (или DAC - Digital to Analog Converter).
Видеоплата оперирует некоторыми объемами данных.
Насколько эти объемы велики? Давайте прикинем. Пусть на экране у Вам типичные
800х600 точек, т.е. 480 000 точек. Сколько байт нужно для отображения каждой
точки? Это зависит от количества цветов, которыми Вы хотите пользоваться. Если
Вас устроит, чтобы каждая точка могла иметь всего два цвета, положим черный и
белый, то вам соответственно необходимо на точку один бит информации. Тогда,
положим ноль соответствует черному цвету, единица - белому. Но достаточно ли
Вам двух цветов на экране. Разумеется, нет! А чем больше цветов, тем больше бит
необходимо хранить для каждой точки. Положим, Вы дадите 1 байт (т.е. 8 бит) на
информацию о цвете каждой точки. Сколько тогда будет РАЗНЫХ цветов возможно на
экране? Столько же, сколько РАЗНЫХ значений может принимать 8-битное число,
т.е. 256. Если Вам нужно более, чем 256 цветов, то одного байта на информацию о
цвете точки мало. Минимальным количеством цветов, приемлемым для обычной работы
за компьютером сегодня считается 65 536 цветов, для передачи информации о
которых нужно 2 байта (16 бит) на каждую точку на экране. Такой цвет принято называть
16-битным. Если нужно больше цветов, то применяют 24-битный цвет (3 байта),
количество цветов на экране соответственно 2 в степени 24 = примерно 16 млн.
Иногда применяют и 32-битный цвет - 4 байта на точку. Теперь мы можем
посчитать, какое количество информации в один момент времени храниться в
видеоплате. Пусть на экране 480 000 точек (разрешение экрана 800х600), НА
КАЖДУЮ ИЗ НИХ нужно какое то количество бит для передачи информации о цвете
(хотя бы 2 байта), следовательно необходимый объем памяти, для хранения
информации о том, что отображено на экране - примерно 1 Мбайт! (немало) в
режиме 800х600х16 бит. А если разрешение экрана 1600х1200 точек и вы хотите
32-битный цвет, то информация об одном кадре будет занимать в памяти около 7.5
Мбайт. Но это не все. Изображение на мониторе не статическое. Оно изменяется, и
частота этого изменения может достигать 100 и более раз в секунду (об этом мы
еще позднее подробнее поговорим). Тогда видеоплата будет оперировать немалыми
объемами данных.
Все это наводит на мысли о том, что на видеокарте
установлена своя собственная видеопамять, предназначенная для хранения
обрабатываемой и выводимой информации, и чем больше объем этой памяти, тем
большее разрешение и глубину цвета можно отобразить на мониторе. Например, Ваша
видеоплата оборудована 2 Мбайт памяти. Тогда, какую глубину цвета она покажет в
каких разрешениях? Считаем: в 800х600 на экране 480 000 точек. Если на каждую
по 16 бит, то всего нужно чуть менее 1 Мбайт памяти, т.е. 800х600х16 видеоплата
с двумя Мбайт памяти поддерживает. Если цвет 32-битный, то нужно чуть менее 2
Мбайт памяти, т.е. и 800х600х32 поддержит такая видеоплата. А если разрешение
1024х768 точек? Тогда на экране 786 432 точек. Если на каждую 2 байта, то
понадобиться примерно 1.5 Мбайт видеопамяти, А если использовать 32-битный
цвет, то всего нужно 3 Мбайт памяти. Т.е., видеоплата с 2 Мбайт видеопамяти не
поддерживает 32-битный цвет при разрешении 1024х768 из-за недостатка объема
видеопамяти.
Мы пока что говорили о том, где хранится информация
для вывода на экран, где происходит преобразование в аналоговый сигнал, который
передается непосредственно на монитор, но еще ничего не говорили о том, кто
обрабатывает соответствующую графическую информацию. На видеоплате расположен
чип, выполняющий функции видеопроцессора: он производит все необходимые
вычисления, он обрабатывает все цифровые данные, связанные с выводом информации
на экран. Естественно предположить, что от производительности видеопроцессора
(в дальнейшем мы будем говорить: видеочипа) во многом зависит
производительность видеоплаты. Кроме того производительность видеоплаты зависит
и от производительности видеопамяти, (по аналогии с оперативной): сколь бы ни
был быстр процессор, если ему медленно поставляют данные, его эффективная
производительность падает.
Наконец, на видеоплате присутствует видео BIOS:
постоянная память, в которую записаны экранные шрифты, служебные таблицы и т.п.
ПЗУ не используется видеоконтроллером напрямую - к нему обращается только
центральный процессор, и в результате выполнения им программ из ПЗУ происходят
обращения к видеоконтроллеру и видеопамяти. ПЗУ необходимо только для
первоначального запуска адаптера и работы в режиме MS DOS; операционные системы
с графическим интерфейсом - Windows или OS/2 - не используют ПЗУ для управления
адаптером - они работают через драйвера.
Кроме того на видеоплате обычно размещаются один или
несколько разъемов для внутреннего соединения; один из них носит название
Feature Connector и служит для предоставления внешним устройствам доступа к
видеопамяти и изображению. К этому разъему может подключаться телеприемник,
аппаратный декодер MPEG, устройство ввода изображения и т.п. Hа некоторых
платах предусмотрены отдельные разъемы для подобных устройств.
Давайте обсудим описанные нами компоненты
видеоадаптера. Разумеется, наибольший интерес вызывает сам видеопроцессор, так
как от его производительности в первую очередь зависит производительность видео
подсистемы компьютера, а так же видеопамять. Давайте начнем с видеопроцессора.
Давайте рассмотрим следующий пример. Пусть у нас есть
два абстрактных видеопроцессора, выполняющих одинаковую задачу: построение
прямоугольника.
Первый видеопроцессор умеет только минимум того, что
он должен уметь - а именно по команде центрального процессора построить на
экране точку и дать ей определенный цвет. Тогда построение прямоугольника
сведется к тому, что процессор должен передать видеопроцессору координаты всех
точек, которые составляют сам прямоугольник, видеопроцессор
"отобразит" эти точки, а затем рассчитать и передать видеопроцессору
координаты всех точек внутри прямоугольника, для того чтобы видеопроцессор закрасил
каждую из них заданным цветом.
Предположим, что второй видеопроцессор
"умнее": он знает, что такое прямоугольник. Тогда процессор передаст
в видеокарту только координаты вершин прямоугольника - только две координаты, а
сам видеопроцессор построит прямоугольник. Затем процессор скомандует
прямоугольник закрасить, и видеочип сам определит, какие точки должны быть
закрашены и изменит цвет всех внутренних точек прямоугольника. Во втором
случае, разумеется, производительность системы выше: во первых уменьшается
объем передаваемых от процессора к видеопроцессору данных, во вторых обработка
этих данных видеопроцессором будет происходить быстрее.
Видеочип, который умеет не только "рисовать"
точки определенного цвета на экране, но и умеет самостоятельно работать с
некоторыми примитивами, например прямоугольниками, отрезками, окружностями,
умеет самостоятельно выполнять заливку цветом, умеет масштабировать изображение
на экране и многое другое, называется акселератором или ускорителем.
Различают ускорители двумерной и трехмерной графики.
Под ускорителем двумерной графики понимают видеочип, который может аппаратно
ускорять обработку плоских примитивов, предназначенных для отображения плоских
изображений, например, графического интерфейса Windows etc. Ускоритель
трехмерной графики должен иметь возможности построения в двумерной плоскости
экрана проекций некоторых трехмерных объектов, создавая таким образом иллюзию
трехмерного изображения. Об акселерации, при чем в основном о трехмерной
акселерации, мы поговорим крайне подробно в следующих разделах.
Как мы уже упоминали, в видеопамяти размещается та
информация, которая будет выведена на дисплей, это так называемый кадровый
буфер. Кроме этого, когда видеочип работает над построением трехмерной сцены, в
локальной видеопамяти располагается значительно больше информации. Именно
поэтому на сегодняшних видеоплатах устанавливают 16-64Мб видеопамяти, в то
время как для хранения кадрового буфера даже в разрешении 1600х1200х32бит нужно
немногим менее 8 Мбайт видеопамяти. О том, что хранят в видеопамяти при
обработке трехмерных сцен, мы поговорим с Вами, когда будем рассматривать
трехмерную графику, пока же отметим лишь, что объем видеопамяти, более 8 Мбайт
не нужен пользователю, если он не пользуется трехмерной графикой (т.е., не
играет на компьютере).
Какие типы видеопамяти используют в современных
видеоплатах? В качестве видеопамяти нередко использовали те же технологии, что
и в оперативной памяти. Использовали память типа FPM и EDO, затем применяли
SDRAM (и применяют сейчас), в настоящее время все больше применяют DDR SDRAM.
По сути, сегодня SDRAM и DDR SDRAM - единственные применяемые типы памяти.
Однако еще во времена господства памяти типа EDO, возникали проблемы с
производительностью видеопамяти, и были разработаны специальные типы памяти,
которые были оптимизированы для обращений не центрального процессора, а
видеопроцессора. Это такие типы памяти, как MDRAM, VRAM, WRAM.
VRAM (Video RAM - видео-ОЗУ) - так называемая
двухпоpтовая DRAM с поддеpжкой одновpеменного доступа со стоpоны
видеопpоцессоpа и центpального пpоцессоpа компьютеpа. Позволяет совмещать во
вpемени вывод изобpажения на экpан и его обpаботку в видеопамяти, что сокpащает
задеpжки и увеличивает скоpость pаботы.
WRAM (Window RAM - оконное ОЗУ) - EDO VRAM, в котором
порт (окно), через который обращается видеоконтроллер, сделан меньшим, чем порт
для центрального процессора.
MDRAM (Multibank DRAM - многобанковое ОЗУ) - вариант
DRAM, организованный в виде множества независимых банков объемом по 32 КБ
каждый, работающих в конвейерном режиме.
Каждый из этих типов памяти был предназначен ускорить
обмен видеопроцессор - видеопамять различными способами и применение такого
типа памяти на видеоплате тех времен было признаком высокого качества платы и
заслуживало всяческого уважения. С другой стороны с выходом SDRAM эти типы
памяти отошли на второй план и сейчас совершенно не применяются.
Производительность видеопамяти, как мы уже говорили,
весьма важная характеристика платы, от нее зависит, как быстро видеопроцессор
будет получать данные для обработки. Большинство современных видеоплат сегодня
имеют настолько быстрые видеопроцессоры, что применение с ними медленной
видеопамяти SDRAM (!), а не DDR SDRAM может не позволить видеочипу раскрыть все
свои скоростные возможности. С другой стороны, все это имеет значение, только
при построении трехмерных сцен, к принципам построения которых мы с вами скоро
перейдем.
Теперь давайте рассмотрим, какие типы видеоадаптеров
применялись в персональных компьютерах, какие они поддерживали разрешения
экрана и глубину цвета.
Самым первым видеоадаптером первых PC был видеоадаптер
стандарта MDA (Monochrome Display Adapter - монохpомный адаптеp дисплея).
Работает только в текстовом режиме с разрешением 80x25 знаков (720x350 точек,
каждый символ - матрица 9x14 точек), поддерживает пять атрибутов текста:
обычный, яркий, инверсный, подчеркнутый и мигающий. Интерфейс с монитором -
цифровой: сигналы синхронизации, основной видеосигнал, дополнительный сигнал
яркости. В наши дни совершенно не применим :).
Адаптер HGC (Hercules Graphics Card - графическая
карта Hercules) - расширение MDA с графическим режимом 720x348, разработанное
фирмой Hercules. Это первый видеоадаптер для PC, поддерживающий графический
режим. Однако, появившиеся впоследствии графические режимы были несовместимы с
HGC, игры написанные в графических режимах последующих видеоадаптеров, не
работали а адаптере HGC. Однако это была первая попытка, и ее можно считать
вполне достойной (для своего времени :)). Интерфейс с монитором - цифровой, как
и у MDA. В наши дни совершенно не применим :).
CGA (Color Graphics Adapter - цветной графический адаптер)
- адаптер с графическими возможностями. Работает либо в текстовом режиме с
разрешениями 40x25 и 80x25 (матрица символа - 8x8), либо в графическом с
разрешениями 320x200 или 640x200. В текстовых режимах доступно 256 атрибутов
символа - 16 цветов символа и 16 цветов фона (либо 8 цветов фона и атрибут
мигания), в графических режимах доступно четыре палитры по четыре цвета каждая
в режиме 320x200, режим 640x200 - монохромный. Т.е. возможности передачи цвета
в графике - только в режиме 320x200, и при этом, несмотря на то, что адаптер
поддерживал 16 цветов, одновременно на экране могли быть цвета только из одной
палитры, следовательно одновременно адаптер отображал только 4 цвета. Интерфейс
с монитором - цифровой: сигналы синхронизации, основной видеосигнал (три канала
- красный, зеленый, синий), дополнительный сигнал яркости. В наши дни
совершенно не применим :).
EGA (Enhanced Graphics Adapter - улучшенный
графический адаптер) - дальнейшее развитие CGA, примененное в первых 286.
Добавлено разрешение 640x350, что в текстовых режимах дает формат 80x25 при
матрице символа 8x14 и 80x43 - при матрице 8x8. Количество одновременно
отображаемых цветов - по 16, палитра расширена до 64 цветов (по два разряда
яркости на каждый цвет). Совместим с MDA и CGA. Интерфейс с монитором -
цифровой. В наши дни совершенно не применим :).
MCGA (Multicolor Graphics Adapter - многоцветный
графический адаптер) - введен фирмой IBM в моделях своих компьютеров, не стал
общим стандартом. Добавлено разрешение 640x400 (текст), что дает формат 80x25
при матрице символа 8x16 и 80x50 - при матрице 8x8. Количество воспроизводимых
цветов увеличено до 262144 (по 64 уровня на каждый из основных цветов). Помимо
палитры, введено понятие таблицы цветов, через которую выполняется
преобразование 64-цветного пространства цветов EGA в пространство цветов MCGA.
Введен также видеорежим 320x200x256, в котором используется представление
экрана непрерывной областью памяти объемом 64000 байт, где каждый байт
описывает цвет соответствующей ему точки экрана. (как у современных адаптеров).
Совместим с CGA по всем режимам и с EGA - по текстовым, за исключением размера
матрицы символа. Интерфейс с монитором - аналогово-цифpовой: цифровые сигналы
синхронизации, аналоговые сигналы основных цветов. Поддерживает подключение
монохромного монитора и его автоматическое опознание - при этом в видео-BIOS
включается режим суммирования цветов по так называемой шкале серого (grayscale)
для получения полутонового чеpно-белого изображения. Суммирование выполняется
только при выводе через BIOS - при непосредственной записи в видеопамять на
монитор попадает только сигнал зеленого цвета (если он не имеет встроенного
цветосмесителя). В наши дни совершенно не применим :).
VGA (Video Graphics Array - множество, или массив,
визуальной графики) - расширение MCGA, совместимое с EGA, введен фирмой IBM в
своих компьюетрах. Фактически стал общим стандартом видеоадаптера с конца 80-х
годов. В режиме 640x480 используется так называемая квадратная точка
(соотношение количества точек по горизонтали и вертикали совпадает со
стандартным соотношением сторон экрана - 4:3). Совместим с MDA, CGA и EGA в
смысле поддерживаемых режимов, но не в смысле подключения монитора: интерфейс с
монитором идентичен MCGA.
IBM 8514/a - специализированный адаптер для работы с
высокими разрешениями (640x480x256 и 1024x768x256), с элементами графического
ускорителя. Не. поддерживает видеорежимы VGA, не стал стандартом, был весьма
интересным решением в узкоспециализированных областях применнения. Интерфейс с
монитором аналогичен VGA/MCGA.
IBM XGA - следующий специализированный адаптер IBM.
Снова не совместим с VGA и не стал стандартом. Применялся только в системах,
изготовленных IBM. Расширено цветовое пространство (режим 640x480x64k),
добавлен текстовый режим 132x25 (1056x400). Интерфейс с монитором аналогичен
VGA/MCGA.
SVGA (Super VGA - "свеpх"-VGA) - расширение
VGA с добавлением более высоких разрешений и дополнительного сервиса.
видеорежимы добавляются из ряда 800x600, 1024x768, 1152x864, 1280x1024,
1600x1200 - все с соотношением 4:3. Цветовое пространство расширено до 65536
(High Color) или 16.7 млн. (True Color). Также добавляются расширенные
текстовые режимы формата 132x25, 132x43, 132x50. Фактический стандарт
видеоадаптера примерно с 1992 г. Сегодня применяются только видеоадаптеры
стандарта SVGA, выход нового стандарта не предвидится :).
Как следует из названия, 3D графика - графика,
показывающая объем и перспективу. С другой стороны, разумеется, соответствующая
картинка отображается на плоском мониторе, следовательно, графический чип,
строящий трехмерные изображения в некотором виртуальном трехмерном мире, затем
должен спроектировать трехмерное изображение на плоскость и вывести в кадровый
буфер для отображения картинки на мониторе. Однако, просто нарисовать
трехмерные объекты на мониторе не достаточно - для того, чтобы игра с
использованием трехмерной графики была красивой, необходимо учесть еще много
факторов: свет и тени, атмосферные эффекты (туман, например) и многое другое.
Сформулировать такую задачу просто - решить ее: вот проблема не из легких!
Давайте сперва рассмотрим немного историю развития
трехмерной графики на персональном компьютере от самых первых "трехмерных
:)" игр и до наших дней. Затем мы поговорим с Вами о том, как строится
трехмерное изображение на компьютере, а уже после поговорим собственно о
современных видеоплатах и о том, какие возможности в этих платах реализованы.
Итак, сначала немного истории. Самые первые игры для
персональных компьютеров условно можно было разделить на два типа - плоские и
векторные. К первому относились незабвенные "Digger",
"Arcanoid", "Тетрис". Все они предоставляли игроку поле для
действия, размер которого обычно соответствовал размеру графического экрана, и
все происходило в двух измерениях. Изображения движущихся объектов
"перемещались" по экрану. Технология этого довольно проста.
Запоминаем небольшой участок экрана, затем на этом участке рисуем объект. Как
только требуется передвинуть объект - восстанавливаем старую картинку,
запоминаем новый участок, рисуем наш объект на нем.
Другие же игры, например авиасимулятор
"F-19" гордо назывались "трехмерными", и в них
виртуальность представляла собой конструкцию из линий и многоугольников,
координаты которой обсчитывались с изменением игровой ситуации, и затем вся она
проецировалась на плоскость, совпадавшую с плоскостью экрана.
Два этих типа игр были просты в написании, а главное -
были по силам тогдашним процессорам и видеокартам.
С появлением 386 процессоров программы начали
использовать "защищенный" режим, обеспечивающий простой доступ к
объемам памяти, большим чем пресловутый 640 килобайт. В связи с этим игры
получили возможность создавать более сложные виртуальные миры.
Немного опередила развитие компьютеров фирма Id Software,
которая выпустила сначала "Catacomb Abyss", а затем и
"Wolfenstein 3D" - игры, которые считаются основоположниками жанра
3D-action. Игры эти шли еще на 286 процессорах, и являются ярким примером
нового способа изображения виртуальности - ТЕКСТУРИРОВАНИЕ.
Во-первых, при этом способе, стены коридора, по
которым бегает главный герой - это не просто одноцветные прямоугольники, а
прямоугольные растровые картинки (то есть, состоящие из точек), например,
рельеф кирпичной стены, или чей-нибудь портрет. Во-вторых, изображения врагов,
которых игрок видел "глазами" персонажа, также были растровыми.
Эффект присутствия в игре создавало масштабирование - при приближении к стене
ее изображение увеличивалось, и соответствующим образом масштабировался рисунок
ее текстуры. Но в этом же содержится и большой минус, который можно пояснить
так: предположим, мы стоим лицом к стене на таком расстоянии от нее, на котором
одна точка текстуры равняется одной точке экрана. Так как обычно для текстур
использовались массивы 64х64 точки, в данном случае текстура на экране будет
квадратом 64х64. Если уменьшать это расстояние, "подходить" к стене,
точки текстуры должны "увеличиваться" - то есть, текстура должна
занимать уже больший квадрат, прорисовывая одну и ту же точку несколько раз.
Если уменьшить расстояние в два раза - каждая точка превратится в квадрат 2х2
пикселя, чтобы заполнить на экране квадрат 128х128. Ну а если подойти к стене
вплотную, на экране мы увидим несколько больших разноцветных квадратов. Из-за
этого и при удалении от стены или от любого монстра тот превращался в несколько
маленьких квадратиков, что выглядело не очень красиво.
Впоследствии разные фирмы-разработчики, которые
занимались написанием 3D-игр, пытались решить эту проблему по-разному -
использованием текстур 128х128, например. Но это требовало больших объемов
памяти, больших затрат процессорного времени, и не решало проблемы, возникавшие
при сильном приближении или удалении объектов - проблема была в самой
технологии обсчета текстур.
Со временем появлялись новые типы процессоров. 486 уже
предъявляли повышенные требования к видеокартам, и те также начали развиваться
в сторону увеличения быстродействия.
Появлялись новые типы игр - полутрехмерный
"DOOM", полностью трехмерный "Descent", появилось понятие
"z-buffer".
Это метод удаления невидимых поверхностей при
изображении сложных трехмерных сцен. Работает примерно так: есть два массива, в
одном из которых хранится изображение, выводимое на экран (буфер кадра), в
другом - расстояние до объектов от плоскости экрана (буфер глубины). Каждый
предмет в сцене разлагается в растр (представляется набором точек), и для
каждой точки считается расстояние до нее от экрана. И в буфер кадра заносятся,
естественно, те точки, расстояние от которых до экрана минимально. После этого
буфер кадра выводится на экран, и цикл повторяется. Метод прост в реализации, и
потому используется почти во всех трехмерных играх.
При всем при этом, компьютеры все же не успевали за
растущими потребностями реальности трехмерных игр. Что самое обидное - игровые
телеприставки типа SEGA намного обгоняли PC по быстродействию, поскольку
изначально были ориентированы на производство игр.
В один прекрасный для любителей IBM PC день, фирма
3Dfx Interactive, которая успешно делала видеочипы для игровых автоматов,
решила расширить свой рынок, и перейти на PC. Это у нее получилось - да так
хорошо, что только через полгода после выхода первого 3D-ускорителя, на
выставке E3 этого года, некоторые фирмы смогли показать проекты своих
ускорителей, которые только приближались по быстродействию к карте от 3Dfx.
Настал век аппаратной поддержки игр. В чем преимущество аппаратного
акселератора, т.е. видеочипа, который сам способен обрабатывать трехмерные
объекты? Если все операции по обработке трехмерного мира до выхода аппаратных
акселераторов делал процессор, то теперь большинство этих функций можно
переложить на специализированный процессор, который, безусловно, лучше и
быстрее будет справляться с задачами обработки трехмерного видео. Но выигрыш в
скорости - только одна сторона медали. Есть и другая - КАЧЕСТВО. Дело в том,
что специализированный чип акселератора умеет применять множество новых
технологий и эффектов, нацеленных не только на ускорение расчета трехмерной
сцены, но и на повышение качества получающейся на экране картинки. Применяемые
технологии, например, позволили снять основную описанную выше проблему
текстурирования (превращение текстур в несколько цветных квадратов при
приближении наблюдателя к ним) а также позволяли многое другое.
Теперь мы рассмотрим основные принципы построения
трехмерной сцены так, как это делают современные видеоакселераторы.
Сцена в играх строится из объектов, например звездолета,
замка, шоссе. Все объекты тут рукотворные, в отличие от того, что снимает
кинокамера. Важно также, что все объекты, даже представляющие собой объемные
тела, представляются только поверхностями, их ограничивающими (и которые могут
иметь различную степень прозрачности). Например, аквариум представляется дном и
гранями. Каждый объект состоит, таким образом, из набора поверхностей.
Точное задание поверхности компактно, но технически
непригодно для построения сцен. Поэтому в 3D-графике применяют приближенное
представление гладкой поверхности множеством мелких плоских полигональных (то
есть многоугольных) плиток, обработка которых элементарна. Такая аппроксимация
(приближение) поверхности многогранником называется тесселяцией (tesselation -
мозаика) этой поверхности. В качестве плиток обычно используются треугольники.
Чем больше плиток в тесселяции, тем реалистичнее
выглядит объект и незаметнее шероховатости на стыках плиток. Общее число плиток
в сценах современных игр исчисляется десятками тысяч. Увеличение числа плиток
является основным путем достижения фотореалистической графики, к чему вплотную
приблизилась потребительская 3D-графика. Вместе с тем возрастает и объем
вычислений, требуя более производительных видеоплат.
Тесселяция большинства объектов производится всего
один раз, до начала игры. Но некоторые объекты тесселируются динамически, при
создании кадра. Тесселяция требует плавающей арифметики и выполняется
процессором (под управлением приложения). Объекты могут задаваться и в уже
протесселированном виде.
Тесселированные объекты задаются в некоторой
канонической системе координат (С К), где их координаты постоянны. Перемещение
объекта по сцене производится его отображением из канонической СК в СК сцены.
В построении каждого кадра участвуют процессор и
3D-акселератор. При этом последовательно проводят следующие шаги:
* расчет сцены;
* обработку полигонов;
* рендеринг.
Далее мы опишем эти шаги и попутно введем ряд важных
понятий.
При расчете каждой сцены (geometry setup) производятся
следующие действия:
1. Размещение объектов (transformation). Каждый
объект, попадающий в кадр, отображается из своей канонической СК в СК сцены.
Заметим, что СК сцены не статическая, а связана с игроком и перемещается вместе
с ним.
2. Расчет освещенности (lighting). Производится для
каждой плитки, исходя из расположения и интенсивности источников света, а также
теней, отбрасываемых другими плитками. Обычно расчет производится только для
вершин полигона, а освещенность всей плитки получается интерполяцией.
3. Отсечение (clipping) полигонов, выходящих за кадр.
4. Привязка текстур к полигонам - задается, какая
текстура будет наложена на каждый полигон и относительное положение полигона
относительно текстуры. Требуется только для динамической замены текстуры. Для
статических объектов наподобие монстра, которые заданы в тесселированном виде,
привязка уже выполнена.
Давайте определим, что же такое текстура. Текстура
(map, texture - ткань, рисунок) - квадратные рисунки, играющие роль обоев.
Накладываются на полигоны для придания поверхностям реалистичности. Вы вероятно
знаете, что элемент изображения на экране называется пиксел (Picture Element).
Текстура тоже состоит из элементов, так как это - растровое изображение,
элемент текстуры называется текселом (по аналогии с пикселом).
Расчет сцены иногда сокращенно называют TL по имени
основных шагов (Transformation and Lighting). Заметим, что сцена рассчитывается
полностью, прежде чем будет передана для дальнейшей обработки.
Вся работа по расчету сцены производится в арифметике
с плавающей точкой, а сама сцена находится в основной памяти.
Вплоть до самого последнего времени расчет сцены
выполнялся центральным процессором. Но в некоторых чипах последних поколений
расчет выполняет графический сопроцессор (GPU)
Обработкой полигонов (Polygon setup, иногда Triangle
setup) занимается выделенный блок Polygon setup engine (движок обработки
полигонов) 3D акселератора графического чипсета. На блок из основной памяти по
шине AGP посылаются полигон за полигоном. Блок обрабатывает полигон и сразу
отсылает его на блок рендеринга, работая как конвейер.
Производительность блока обработки полигонов
называется Triangle throughput и представляет собой пиковую скорость обработки
треугольников в секунду. Реальная скорость обработки треугольников может быть
ниже, если, например, процессор не успевает рассчитывать и передавать
необходимую видеоплате информацию. Т.е., медленный процессор замедляет работу 3D
ускорителя.
Скорость обработки современных чипсетов составляет 15
млн. треугольников в секунду и более.
Обработка каждого треугольника включает:
1. Прием координат вершин треугольника и их атрибутов:
освещенности, координат в текстуре (это называется текстурными координатами) и
др.
2. Коррекцию перспективы треугольника. То есть фигура
масштабируется в зависимости от ее удаленности.
3. Проектирование треугольника на плоскость XY экрана
4. Вычисление пикселов, входящих в проекцию
треугольника (см. рис.).
5. Расчет для этих пикселов атрибутов. Расчет
производится интерполяцией значений, задаваемых обычно на вершинах
треугольника.
7. Посылку обработанного треугольника следующему блоку
(рендеринг).
Рендеринг (render - представлять) - преобразование
рассчитанной сцены (после фазы обработки полигонов) в виде пикселов в буфер
кадров (для последующего вывода на экран).
Рендеринг производится выделенным блоком Fill engine
(движок заполнения) 3D акселератора графического чипа, который обрабатывает
"на лету" поток треугольников от предыдущего блока.
Производится попиксельное заполнение треугольника. Для
каждого пиксела вначале вычисляется, является ли он видимым (обычно посредством
z-буфера). Если пиксел невидим, то выводить его в буфер, очевидно, не нужно.
Далее производятся следующие действия:
1 Вычисляется накладываемый тексел (иногда весьма
изощренно).
2 Производится наложение тексела с учетом освещенности
пиксела.
3 Опционально на пиксел накладываются эффекты,
увеличивающие реалистичность (туман, карта освещенности, карта рельефа, и
т.д.).
4. Производится запись пиксела в буфер кадров.
После заполнения буфера кадра весь кадр может быть
опционально подвергнут постобработке. Примером постобработки является
сглаживание, улучшающее изображение, или наложение дополнительного изображения
на часть кадра для создания эффекта зеркального отражения у части кадра.
Пиковую производительность блока заполнения пикселов
называют Fill rate (скорость заполнения, прорисовки, растеризации), и
измеряется она в количестве пикселов в секунду. Реальная скорость прорисовки
много меньше, и тем меньше, чем больше текселов накладывается на один пиксел,
поэтому рассчитывается для наиболее простого режима текстурирования.
Скорость заполнения у современных чипсетов составляет
400 млн. пикселов в секунду и более.
Заметим, что в ЗD-трафике, обязательны минимум 2
буфера кадров (БК), в отличие от 2D)-графики (это называете двойной
буферизацией, double buffering). Дело в том, что обычно в процессе заполнения
каждый пиксел многократно переписывается (например, при постобработке) пока не
получится окончательный вид кадра. Поэтому па экран выводится законченный буфер
кадров, а во втором готовится следующий кадр.
Для большей скорости графики (более гладкого
воспроизведения) применяются также 3 и более кадровых буфера, что является
характеристикой чипсета.
Существующей тенденцией является увеличение размера
используемых текстур: чем больше текстура, тем более реалистична поверхность.
Максимальный размер текстуры является параметром 3D-чипа. В настоящий момент
этот параметр составляет 1024х1024 и 2048х2048. Такие большие текстуры
используют современные игры (Unreal, Quake3). Все современные 3D-чипы
поддерживают возможность работы с большими текстурами.
Как будет ясно в дальнейшем, наложение лишь одного
тексела (ближайшего) на пиксел приводит к слишком грубым и даже неестественным
результатам. Поэтому накладывают тексел, являющийся результатом интерполяции
нескольких текселов. В 3D-графике вместо термина интерполяция часто применяют
термин фильтрация. Он становится понятным, если считать, что фильтруются
искажения изображения.
Поясним необходимость интерполяции
на простом примере. При текстурировании типичной является ситуация, когда
текселы и пикселы не совпадают. На рисунке изображен треугольник в системе
координат текстуры. Для простоты пикселы и текселы имеют форму квадрата. Из
рисунка видно, что каждый пиксел накрывается не одним, а тремя, а чаще четырьмя
текселами. Если вычислять цвет по одному текселу, то это приводит к так
называемой блочности - большим блокам одинаково закрашенных пикселов, которых
не должно быть.
Существуют различные способы интерполяции,
отличающиеся числом вовлеченных в нее текселов. Чем больше текселов, тем лучше
изображение, но и больше трудоемкость. Простейший из таких методов - билинейная
интерполяция (Bi-Linear Filtering), при которой цвет рассчитывается как среднее
четырех соседних текселов (вычисляется попарными операциями, что и дало
название).
В настоящее время применяют более совершенные методы
фильтрации, рассматриваемые в дальнейшем.
Очевидно, что если смотреть на текстуру вблизи, то
должны быть отчетливо видны все детали, например прожилки на мраморе. Если
увеличивать расстояние до текстуры, то детали должны исчезать, а рисунок
становиться размытым. Таким образом, для реалистичности картинки нужна
коррекция текстурной поверхности в зависимости от приближения или удаления от
нее игрока. Очевидно, что одна только билинейная фильтрация не позволяет это
сделать.
Проблему решает метод фильтрации, который называется
мипмэппинг (MIP mapping). MIP - аббревиатура с латыни (что нечасто встретишь)
Multum in Parvum - много в одном. Это означает, что вместо одного экземпляра
текстуры хранятся несколько экземпляров, отличающихся разрешением. Экземплярам
приписываются уровни (Level of Detail - LOD) 0,1, 2 и т.д. в порядке убывания
детализации. Каждый уровень представляет собой квадрат с вдвое меньшей
стороной, чем на предыдущем уровне (например, 1024х1024, 512х512,..., 32х32). В
зависимости от удаленности от того объекта, на который натягивается текстура,
выбирается подходящий экземпляр (который потом немного масштабируется, чтобы
лучше соответствовать размеру полигона), дальше применяется билинейная
фильтрация.
Все современные 3D-чипы поддерживают наиболее точную
разновидность мипмэппинга - попиксельный мипмэппинг, когда LOD рассчитывается
для каждого пиксела полигона (более грубым является пополигонный мипмэппинг,
смысл которого, наверное, вполне ясен). Кроме того, что существует совсем
грубый автомипмэппинг, где используется одна детальная текстура, а остальные
уровни формируются "на лету" масштабированием. Этот метод
поддерживают не все чипы, однако, в силу морального устаревания этот параметр
несущественен.
Мипмэппинг хорошо работает, когда полигон имеет малую z-протяженность (почти параллелен плоскости наблюдения). Однако, например, полигоны уходящей вглубь стены имеют большую z-протяженность. При использовании мипмэппинга ближние участки полигона будут более детально текстурированы, дальние - менее детально. На стыке же этих (чисто логических) участков возникнет явная полосатость (mip-banding, мипбэндинг) (см. рисунок), которой не должно быть.
Проблему решает трилинейная фильтрация. Здесь так же,
как и в мипмэппинге, используется LOD-набор текстур, но если в мипмэппинге
используется текстура только одного уровня детализации, то здесь - двух
уровней, которые берут в "вилку" данный пиксел. На пиксел
последовательно накладываются соответствующие текселы этих двух уровней.
Все современные 3D-чипы поддерживают трилинейную
фильтрацию. Однако не все чипы умеют выполнять такую фильтрацию за такт, что и
является параметром скорости.
В близких объектах в один пиксел может попадать
несколько десятков текселов. Теперь вспомним, что все перечисленные ранее
методы основаны на билинейной фильтрации, где учитываются всего 4 тексела.
Проблему решает анизотропная фильтрация (anisotropic filtering), где
учитываются 16-32 текселов. Термин анизотропность (неоднородность по
направлениям), указывает на то, что число учитываемых текселов оказывается
разным в зависимости от наклона полигона (в предыдущих методах - фиксированное,
то есть фильтрация изотропная). Примером преимущества анизотропной фильтрации
является плакат с надписью, расположенный под углом к плоскости экрана. При
анизотропной интерполяции надпись на плакате будет разборчива, а при изотропной
- размыта.
Таким образом, анизотропная интерполяция - наиболее
точная, но требующая большой пропускной способности при доступе к памяти (с
текстурами). Анизотропная фильтрация поддерживается пока далеко не всеми
чипсетами.
Непосредственная растеризация любых непрерывных кривых на экране приводит к их зазубренности (лестничный эффект, см. рисунок). Причем прямые линии ведут себя ничем не лучше. Все это отражается при рендеринге пикселов на границе полигонов. Такой класс дефектов изображения, вызванных грубой дискретностью, называется алиасингом (aliasing - неровность, ступенчатость).
Для подавления алиасинга применяются различные виды
антиалиасинга - фильтрации, заключающейся в более точном вычислении цвета
пикселов (прежде всего краевых).
Антиалиасинг бывает:
* краевой (Edge Anti-Aliasing) - применяется к
пикселам на границе полигона;
* полный (Full Anti-Aliasing) - применяется ко всем
пикселам.
Как ни парадоксально это звучит, но краевой
антиалиасинг трудно реализовать в полном объеме (например, невозможно заранее
знать, где пересекутся полигоны). Далее, этот антиалиасинг должно поддерживать
само приложение (и давать возможность включать/выключать его). Поэтому
современные 3D-чипы применяют полный антиалиасинг. Суть заключается в том,
чтобы вычислять каждый пиксел с большим разрешением, а затем записывать его с
заданным разрешением. Аппаратная поддержка антиалиасинга является параметром
качества чипсета. Однако даже современные чипы, обладающие возможностью
реализовать полный антиалиасинг, тратят на это столько ресурсов, что реально
использовать эту возможность можно только в невысоких разрешениях и только у
самых быстрых современных чипов.
Все современные чипсеты поддерживают попиксельное
наложения эффекта тумана. Однако наряду с прямым использованием тумана
(fogging) для придания реалистичности удаленным объектам оказалось совершенно
необходимым использовать его для заднего фона. Дело в том, что размеры пиксела
ставят предел для изображения мелких удаленных объектов во время рендеринга, поэтому
ограничиваются некоторой предельной z-плоскостью, до которой рассчитывается
сцена. Но тогда прилегающий к этой границе слой надо заполнять туманом, иначе
объект, пересекающий эту предельную заднюю плоскость, будет неожиданно
появляться или исчезать, что нередко можно видеть в ряде игр, активно
пользующихся туманом на некоторых старых акселераторах.
Наиболее употребительным является метод табличного
затуманивания (Range based), когда плотность тумана изменяется ступенчато с
расстоянием, что задается таблицей.
Наложение рельефа (Bump mapping, bump - выпуклость) -
придание поверхности рельефности, то есть неровности. Дело в том, что
большинство поверхностей в играх не гладкие. Примерами являются шероховатые
стены пещер и зданий, рельеф на металле, а также мелкая рябь на воде. Все эти
эффекты резко увеличивают реалистичность.
Наложение рельефа производится на любую поверхность и
без увеличения числа полигонов, за счет изменения освещенности, когда одна
часть бугорка рельефа освещена, а другая находится в тени.
Методы наложения рельефа
Уже поддержана аппаратно всеми чипами технология
выдавливания (Embossing Bump Mapping), которая, однако, не дает настоящего
пространственного эффекта. Это делают более совершенные технологии:
* Environment Mapped bump mapping (EMBM, использование
карты среды).
* Dot Produce bump mapping (DTBM, скалярное рельефное
текстурирование, а также NormalMaps).
Их аппаратная поддержка является параметром качества
чипа. Уже существуют приложения, использующие эти методы
Для повышения качества картинки практически на каждый
обрабатываемый пиксел треугольника накладываются несколько текселов. Для
повышения скорости рендеринга все современные 3D-чипы применяют
мультитекстурирование (multi-texturing) - наложение на пиксел более одного
тексела за такт. Синонимом является термин однопроходное мультитекстурирование.
Параметром мультитекстурирования является число текселов, накладываемых на
пиксел. В настоящее время у большинства чипов оно равно 2, но уже есть чипы с 3
и 4 текселами за такт.
Одной из тенденций современной 3D-графики является использование
все больших объемов текстур. Технологии компрессии (сжатия) текстур позволяют
хранить текстуры в сжатом виде на жестком диске, видеопамяти и при пересылке. И
только последней стадии, когда текстура посылается на графический чип для
наложения, она им декомпрессируется, тем самым эти технологии позволяют:
* использовать больше текстур;
* снижать нагрузку на AGP и внутреннюю шины, уменьшая
задержки;
* хранить текстуры в компактном виде.
Для сжатия текстур используются специальные методы,
пригодные для работы в реальном времени и имеющие гарантированный коэффициент
сжатия. Они несколько ухудшают оригинал в отношении градации (различия) цветов
и точности контуров, причем для некоторых текстур значительно (поэтому
разработчик должен сам выбрать те текстуры, которые используются в сжатом
виде). Сегодня сжатие текстур уже поддерживается большим количеством числом
игр, и в будущем использование сжатия представляется неизбежным, если учесть, что одна текстура
2048х2048х32 занимает в исходном виде 16 Мбайт!
Современные 3D-чипы поддерживают TrueColor
(32,24-битный цвет) или только HighColor (16-битный цвет). В случае 3D-графики к
цветовым атрибутам пиксела (RGB) добавляется еще один, являющийся коэффициентом
прозрачности. Это позволяет моделировать такие прозрачные среды, как стекло,
вода или атмосферные эффекты тумана, дымки. Все нули атрибута означают, что
пиксел полностью непрозрачен, все единицы - полностью прозрачен. Название
"А" означает коэффициент прозрачности альфа (называется альфа-каналом
- alpha channel). Все современные 3D-чипы поддерживают RGBA -представление
цвета пиксела (и тексела). Сокращенно цветовые атрибуты записывается как RGBA.
Под атрибут прозрачности отводится такое же количество бит, что и для
составляющих цветов. Например, 1 байт для TrueColor, что соответствует 256
градациям прозрачности.
Наложение прозрачного предмета (пиксела) на
нижележащий называется алъфа-блендингом (blending - смешение).
Перед рендерингом пиксела, принадлежащего конкретному
треугольнику, нужно вычислить, является ли он видимым. Если его закрывает
непрозрачный пиксел, принадлежащий Другому треугольнику, то записывать в буфер
обрабатываемый пиксел, очевидно, не надо. Современные 3D-чипы используют для
указанного вычисления так называемый z-буфер. Это буфер, где хранятся
z-координаты текущего пиксела буфера кадров. Само название происходит от того,
что плоскость экрана принимается за координатную плоскость XY, а ось Z
направляется перпендикулярно от пользователя (в глубь экрана). Перед
рендерингом каждого кадра z-буфер обнуляется. Z-координата каждого текущего
пиксела его сравнивается со значением, хранимым в z-буфере. Если она
оказывается меньше, это значит, что текущий пиксел загораживает записанный, и
наоборот. Такой порядок работы позволяет с учетом прозрачности обновить буфер
кадров и z-буфер. Заметим, что z-буферизация может быть и программной (когда
z-буфер располагается в основной памяти, а вычисления производит процессор),
однако современные 3D-чипы имеют аппаратную реализацию z-буфера (когда он
находится в видеопамяти, а расчет проводит акселератор).
Параметром z-буфера является его разрядность, играющая
роль разрешающей способности. В настоящее время применяются значения 16, 24 и
32 разряда на пиксел. При низкой разрядности 2 предмета могут иметь
неразличимую глубину и неправильно наложиться.
Для ускорения разработки 3D-приложений используются
графические библиотеки. Эти библиотеки могут быть как стандартными
(разработанными признанными лидерами), так и фирменными (используются для
расширения стандартных). Функции библиотеки доступны через соответствующий API
- программный интерфейс. Можно приближенно сказать, что АРI - язык описания
трехмерной графики. Соответственно, каждое 3D-приложение написано с
использованием некоторого API и соответственно будет работать в вашей системе
только в том случае, если Ваш видеочип поддерживает соответствующий API.
В настоящее время чипы поддерживают два стандартных
API:
* Direct3D корпорации Microsoft для ОС Windows 9x,
сокращенно D3D. Это подмножество Microsoft DirectX, который стандартно встроен
в эту ОС, а новые версии доступны с сайта Microsoft.
* OpenGL корпорации Silicon Graphic (SGI). Доступен в ОС Windows NT. В Windows 9x реализован не
полностью. Поэтому SGI разработала для Windows 9x посредник (иногда называемый
порт) ICD (Installable Client Driver), позволяющий использовать OpenGL. Этот
порт поддерживают все современные 3D-чипы. В свою очередь, Microsoft создала
библиотеку MCD (Mini Client Driver), позволяющую задействовать основные
возможности OpenGL в Windows 9x.
Указанные интерфейсы скорее дополняют друг друга, чем
конкурируют. OpenGL является более высокоуровневым, и в нем есть функции,
относящиеся к фазе построения сцены. DirectЗD относится только к рендерингу, но
там реализована быстрая прорисовка текстур. Следует отметить, что в настоящее
время в рамках проекта Fahrenheit обеими корпорациями ведутся работы по
объединению интерфейсов Direct3D и OpenGL.
Еще есть умирающий API - Glide компании 3dfx, который
аппаратно поддерживается только графическими чипами этой компании.
Подробнее об API, применяющихся в современной игровой
3D графике мы поговорим с Вами в следующий раз, когда будем изучать современные
чипы.
Современная видеоплата может быть выполнена как в разъем
PCI (уходящий вариант), так и в AGP. Помимо большой скорости передачи данных по
шине, технология AGP позволяет также организовывать AGP-память - часть основной
памяти для потребности 3D-гpaфики, причем 3D-чип может обращаться к ней
напрямую (минуя процессор).
Напомню, что в настоящее время чипсетами
поддерживаются скоростные режимы AGP2x и 4х. Однако, несмотря на внушительную
(вдвое) разницу пиковой пропускной способности, особой пользы от применения
AGP4x до сих пор нет. Платы, которые могут работать в режиме 4х выигрывают от
этого эффективно в лучшем случае несколько процентов.
Современные графические 3D-карты имеют довольно
значительную видеопамять, которая называется локальной. В ней, во-первых,
размещаются буферы кадров. Во-вторых, в ней желательно разместить z-буфер,
текстуры. Несмотря на то, что AGP позволяет использовать под текстуры основную
память, для большей скорости их желательно помещать в локальную, так как:
* пропускная способность локальной памяти в 3-6 раз
выше, чем у AGP (достигая 3 Гбит/с);
* шина основной памяти обслуживает и другие запросы.
Параметром графического контроллера является
максимальный объем видеопамяти, с которой он может работать (обычно это 32-64
Мбайт). Производитель обычно выпускает целую линейку карт, различающихся
объемом видеопамяти и рассчитанных на различные сегменты рынка. Наиболее
популярные сейчас объемы 16 и 32 Мбайт (и есть тенденция перехода к 64 Мбайт).
Но, тем не менее, нужно помнить - несмотря на то, что объем видеопамяти - очень
важный параметр, оценивать видеоплату ТОЛЬКО по объему ее видеопамяти сродни
оценки автомобиля по комфортабельности салона, не говоря при этом, какой у Вас
автомобиль. Безусловно, есть связь между комфортабельностью салона и маркой
машины :), самую плохую машину не станут слишком "наворачивать", как
и на видеоплату с плохим чипом не станут ставить много видеопамяти, но тем не
менее, в первую очередь следует интересоваться, какой видеочип используется на
видеоплате, а затем уже сколько видеопамяти установлено.
Как и любой микропроцессор, графический чип имеет
следующие параметры:
Внутренняя частота.
В настоящее время составляет 120-200 МГц. Как и
центральный процессор, видеочип можно разгонять.
Технология изготовления.
Большинство чипов сделано по технологии 0,25 мкм, но
уже начали появляться чипы с технологией 0,18 мкм. Уменьшение техпроцесса, как
мы знаем, позволяет увеличить частоту и уменьшить тепловыделение.
Шина видеопамяти.
Чип связан с локальной видеопамятью внутренней шиной.
Ее ширина является важным скоростным параметром и, разумеется, совпадает с
шириной интерфейса чипа и памяти. В настоящее время у большинства чипов
составляет 128 бит, у дешевых изделий - 64 бита, у последних изделий - 256 бит.
Этот параметр часто включается в название чипа (подробнее - позже). Кроме того,
видеопамять характеризуется типом и частотой. Как мы уже говорили, сегодня
применяют только SDRAM и DDRSDRAM, частота видеопамяти обычно не меньше частоты
чипа и составляет в настоящее время 125-220 МГц. Видеопамять, как и оперативную
память системы, также можно разгонять.