При запуске любого приложения процессор получает и обрабатывает данные в двоичном виде. В былые времена даже результаты своей работы компьютеры выводили на родном для себя языке. Достаточно вспомнить первые программируемые вычислительные машины, работающие с перфокартами.
Появление мониторов значительно облегчило пользователям жизнь. Первые монохромные чудовища стали настоящим прорывом. Однако для взаимодействия с дисплеями компьютерам потребовалось устройство, преобразующее информацию, находящуюся в памяти, в видеосигнал для монитора. Этим устройством стала графическая плата (видеокарта, видеоадаптер). Прошло несколько десятилетий, и примитивный преобразователь сигнала, обретя огромное множество различных возможностей, превратился в мощнейшее вычислительное устройство.
История развития
Первая видеокарта для компьютеров архитектуры IBM PC была представлена миру в 1981 году и получила название MDA (Monochrome Display Adapter). Это чудо инженерной мысли вообще не поддерживало графический режим и работало только с текстовыми данными. Видеоадаптер выводил на дисплей до 25 строк, каждая из которых вмещала 80 символов. При этом тексту можно было назначить один из пяти атрибутов: обычный, подчеркнутый, яркий, мигающий или инверсный. Задавать шрифт было нельзя, цвет букв также не поддавался изменению — эти параметры зависели исключительно от модели монитора.
Следующим этапом в развитии графических плат стало появление IBM CGA (Color Graphics Adapter). Видеоадаптер поддерживал четыре палитры по четыре цвета. Кроме того, он умел работать в графическом режиме, то есть на монитор отныне выводился не только текст, но и пиксельные картинки. При работе с графикой максимальное поддерживаемое разрешение составляло 320х200 точек, а для монохромной палитры это значение возрастало до 640х200. В графическом режиме использовалось не более 4 цветов одновременно. Следом за CGA последовала его усовершенствованная версия — EGA (Enhanced Graphics Adapter). Этот адаптер поддерживал 64-цветную палитру и мог обеспечить одновременно 16 цветов при разрешении 640x350.
Примечательно, что видеокарты, совместимые с описанными выше стандартами, использовали для взаимодействия с монитором цифровой интерфейс. Последующие видеоадаптеры поддерживали более высокие разрешения и большее количество цветов. При этом из-за возросшего количества информации цифровая передача данных уступила место аналоговой.
На смену EGA пришел адаптер VGA (Video Graphics Array), обеспечивающий 16 цветов при разрешении 640х480 или 256 цветов в режиме 320х200. Ну, а в 1987 году настала эпоха SVGA. Примечательно, что термином SVGA обозначались все режимы, превышающие VGA. У производителей попросту не было четкого стандарта, которому бы соответствовала их продукция. Путаница была устранена только через три года, когда организация VESA (Video Enhanced Standards Association) ввела документ, описывающий режимы SVGA. Он несколько раз дополнялся, а в конечной его версии, датированной 1995 годом, описаны основные режимы работы, вплоть до разрешения 1600х1200 пикселей и цветопередачи True Color (16,7 млн цветов).
Важно осознавать то, что все ранние графические карты служили одной лишь цели — они преобразовывали информацию, получаемую от процессора, в доступный для монитора вид. Никаких расчетов эти видеокарты не производили. Цвет пикселей каждого кадра определял центральный процессор — по тем временам это было серьезным испытанием для ЦП. С появлением первых 3D-движков ситуация только ухудшилась — пресловутые игры стали отнимать огромное количество ресурсов. Разумеется, существовали серьезные видеоадаптеры, которые использовались в профессиональном ПО, вроде САПР. Но к компьютерам простых пользователей они имели очень отдаленное отношение.
Все это привело к появлению графических ускорителей — видеокарт, способных обрабатывать некоторые графические функции на аппаратном уровне. К примеру, подобные устройства могли самостоятельно рассчитывать цвета отображаемых пикселей при рисовании линий или курсора, при перетаскивании окон и заливке отдельных участков изображения. Отныне видеокарта занималась не только преобразованием сигнала — она принимала непосредственное участие в процессе построения изображения.
На рубеже 1994-95 годов разработчики стали активно задумываться о том, как ускорить игровые 3D-движки. В результате на сцену вышли так называемые 3D-ускорители. Эти устройства могли работать только в тандеме с видеоадаптером, уже установленным в ПК. При запуске трехмерных приложений 3D-ускорители обрабатывали объемные моделей, преобразуя их в двумерный вид. Результаты отправлялись видеокарте, которая при необходимости дополняла кадр различными объектами (например, интерфейсом) и передавала его на монитор. Со временем видеоадаптеры и 3D-ускорители слились воедино, и вот тогда-то видеокарты наконец обрели свой нынешний вид.
Пиксель (Pixel) — самый маленький графический элемент, точка.
Полигон (Polygone) — пространственный многоугольник, грань. В компьютерной графике чаще всего используется его простейший вариант — треугольник.
Текстура (Texture) — плоское изображение, предназначенное для нанесения на грань.
Тексель (Texel) — мельчайший графический элемент (точка) текстуры.
Фильтрация текстур (Texture Filtering) — метод уменьшения искажений при наложении текстур. Различают билинейную, трилинейную и анизотропную фильтрацию.
Буфер кадра (Frame Buffer) — область видеокарты, специально отведенная под временное хранение данных о пикселях, требуемых для отображения одного кадра (полного изображения) на экране монитора.
В трех измерениях
Итак, по какому принципу работает видеокарта при построении кадра трехмерного приложения? В большинстве случаев любой трехмерный объект в компьютерном моделировании представляет собой совокупность множества треугольников — граней, или «полигонов». Виртуальные деревья, автомобили, зомби и автоматы Калашникова — все это лишь грамотно связанные друг с другом грани с натянутыми на них текстурами. Таким образом, при построении изображения центральный процессор загружает в память видеокарты координаты вершин отображаемого объекта, а также текстуры, которыми нужно будет покрыть каркас получившейся трехмерной модели. Далее в дело вступает непосредственно видеоадаптер.
Весь процесс преобразования вершин и текстур в итоговый кадр именуется графическим конвейером. Обратите внимание, что элементы графического чипа работают в потоковом режиме, то есть если какие-то блоки видеокарты простаивают, то она может приступить к обработке следующего кадра, не дожидаясь, пока предыдущий будет выведен на экран.
Первым делом вершины попадают в вершинный процессор, который занимается их трансформацией и освещением (Transforming & Lighting). В данном случае трансформация — это преобразование координат вершин (вращение, перенос и масштабирование объектов), а освещение — это определение цвета каждой вершины с учетом всех источников света конкретной сцены. Затем следует проецирование — преобразование координат искомого 3D мира в двумерную систему координат экрана. С появлением аппаратной поддержки T&L увеличилась скорость отображения игровой графики, а также возросло ее качество.
Следом наступает стадия растеризации — серии операций, которые проводятся непосредственно с пикселями изображения. Этапы: удаление скрытых поверхностей, к примеру, обратных сторон объектов; Z-буферизация (запись значений глубины) — для каждой точки изображения определяется, насколько далеко она отстоит от плоскости экрана; и, разумеется, текстурирование (закраска).
Процесс закраски происходит следующим образом: видеокарта выбирает для каждого пикселя определенные тексели из текстуры. После усреднения цветов нескольких текселей на выходе получается итоговый цвет пикселя, который записывается в буфер кадра (видеопамять). Именно на этой ступени происходит фильтрация текстур, а также проводятся операции сглаживания. Напомним, что процессы текстурирования, фильтрации и сглаживания были подробно разобраны нами в статье «Ближе к идеалу» из мартовского номера «Лучших компьютерных игр» за 2008 год.
|
|
|
Полигональная модель до и после нанесения текстур.
|
После того, как в буфер кадра будет записан цвет каждого пикселя итогового изображения, оно отправляется на монитор. Вот, собственно, и все! Однако это лишь общие принципы работы графического конвейера. В реальной жизни алгоритм, как правило, содержит дополнительные стадии. Нередко результат работы, полученный на определенном этапе, может быть возвращен на несколько стадий назад — подобный прием используется, к примеру, при прорисовке отражающих поверхностей. Также на различных этапах построения изображения в процесс могут вмешиваться блоки арифметических операций, ответственные за исполнение шейдеров.
На современных видеокартах для вывода информации на дисплей используется сразу несколько типов графических разъемов. Ниже приведены их особенности и отличия.
D-Sub, он же VGA — устаревший аналоговый разъем, изначально предназначенный для вывода информации на ЭЛТ-мониторы. На многих ЖК-дисплеях присутствует VGA-вход, но пользоваться им стоит только в случае крайней необходимости. Связано это с тем, что видеокарте приходится преобразовывать цифровой сигнал в аналоговый, а ЖК-монитор вынужден выполнять обратное преобразование. Естественно, это не лучшим образом сказывается на качестве изображения.
DVI — цифровой разъем, предназначенный для подключения ЖК-дисплеев. Существуют переходники с DVI на VGA, позволяющие подсоединить ЭЛТ-монитор к DVI-выходу видеокарты. Поддерживается алгоритм защиты HDCP.
HDMI — цифровой разъем, способный передавать одновременно видеосигнал и многоканальный звук. Существуют переходники с HDMI на DVI, однако при их использовании теряется возможность передачи звука. На видеокартах серии Radeon HD и некоторых других моделях можно использовать специальный переходник с DVI на HDMI, который не приводит к потере звука. Поддерживается алгоритм защиты HDCP.
DisplayPort — новый цифровой разъем, способный передавать одновременно видеосигнал и многоканальный звук. Существуют переходники с DisplayPort на DVI, VGA и HDMI, правда, в первых двух случаях происходит потеря звукового сигнала. Поддерживаются алгоритмы защиты HDCP и DPCP.
Программный вопрос
Попробуем разобраться, как видеокарта взаимодействует с играми. Ради этого нам вновь придется обратиться к истории. Графические платы стандартов MDA, CGA, EGA и VGA вообще не требовали драйверов — необходимое для работы устройств ПО было зашито в BIOS. Поскольку в рамках одного стандарта все видеокарты обладали одинаковой архитектурой и взаимодействовали с системой схожим образом, то разработчики приложений писали свои творения под определенный стандарт, а не видеокарту. Иначе говоря, все графические адаптеры со стороны программы выглядели одинаково.
Однако, когда настала эпоха SVGA, программисты столкнулись с рядом серьезных проблем. Например, не было четкого описания, как графическая плата должна работать в разрешении 640х480 при 256 цветах — разные видеокарты использовали этот режим по-своему. Разработчикам оставалось лишь адаптировать свои приложения для работы с каждой моделью видеокарты. Естественно, это было неудобно и отнюдь не способствовало прогрессу в сфере графических технологий. Появление стандартов VESA частично исправило ситуацию: режимы работы SVGA получили официальные спецификации, и все новые видеоадаптеры их учитывали.
Тот хаос, что создали первые SVGA-карты, подтолкнул программистов Microsoft к концепции общего интерфейса прикладного программирования — API. Впервые подобные интерфейсы для видеокарт были реализованы в Windows 95. Они стали промежуточным слоем между драйвером графической платы и самими приложениями. Другими словами, API — это программные стандарты, которые надлежит использовать разработчикам ПО, чтобы их приложения работали в определенной программной среде. При разработке игры код пишется под конкретный API, а производитель видеокарты гарантирует, что этот API совместим с драйвером графической платы.
На сегодняшний день для создания игр используется два интерфейса прикладного программирования. Первый из них — это вездесущий Microsoft DirectX, который мы регулярно обновляем, дабы новые игры запускались без проблем. В состав DirectX входит целый набор различных API: для музыки, звуков, устройств ввода и прочее. За графику отвечает только Direct3D. DirectX чертовски популярен, поэтому в настоящее время именно Microsoft задает тон игровой индустрии, регулярно добавляя в свой API новые возможности.
Еще один распространенный интерфейс программирования — OpenGL (Open Graphics Library). Сегодня он не так востребован, как прежде. Как отмечают разработчики игр, вплоть до выхода DirectX 9 пользоваться OpenGL было удобнее, но в данный момент API от Microsoft предоставляет больше возможностей. Тем не менее OpenGL используется в таких играх, как Doom 3, Prey, Quake 4, Enemy Territory: Quake Wars. К тому же следующий проект небезызвестной id Software — игра Rage — будет написан исключительно под OpenGL.
Для обеспечения максимальной совместимости игр с графической подсистемой компьютера в них часто встраивают несколько путей кода — для разных API. Например, многие современные игры поддерживают одновременно DirectX 9.0c и DirectX 10. Очевидно, что, работая с более старым API, игра лишается многих визуальных эффектов.
Трехмерные игры современности используют для построения объектов грани, однако так было не всегда. В свое время в игровой индустрии активно применялась так называемая воксельная графика.
Воксель — это, по сути, тот же пиксель, но расположенный в трехмерном пространстве и обладающий не двумя, а тремя координатами. С помощью большого количества вокселей выстраивается трехмерный объект. Если представить, что кирпичное здание — это трехмерная модель, то центры кирпичей можно считать вокселями. Стоит отметить, что сами воксели лишь задают данные, а способ их обработки зависит от особенностей движка игры. Например, на место видимых вокселей могут устанавливаться как простейшие двухмерные текстуры, так и полноценные кубы, шары или, как в случае с вышеозначенным зданием, кирпичи. Естественно, в последнем случае нагрузка на видеокарту существенно возрастет.
Воксельная графика позволяет создавать разрушаемые объекты, не прибегая ко всяким ухищрениям: деревянный забор, состоящий из вокселей, можно продырявить очередью из автомата, и каждая дыра будет реальной — сквозь нее будет видно то, что происходит за забором. При использовании полигональной графики дерево в лучшем случае разлетится в щепки, форма которых была заранее предусмотрена дизайнерами.
Увы, воксели отъедают массу ресурсов процессора и оперативной памяти, поскольку производители видеокарт отдали предпочтение полигональной модели и современные видеоадаптеры не могут обрабатывать воксели на аппаратном уровне.
В качестве примеров игр, использующих воксели, можно привести таких ветеранов, как Blood, Comanche, Red Alert 2, Периметр и Outcast.
Мы рассмотрели базовые принципы работы видеокарт. Структура графического конвейера, описанная выше, в чистом виде использовалась достаточно давно — во времена GeForce 2 и Radeon 7000. Вместе с GeForce 3 мир узнал новое доселе слово — шейдер. Именно благодаря шейдерам сегодняшние игры как никогда близки к понятию «фотореалистичность». Сумасшедшие спецэффекты, реалистичное освещение, наполненные жизнью персонажи — все это их заслуга. В следующей части нашей статьи мы обязательно расскажем вам, что есть шейдер и какую роль сыграл он в развитии графических плат.