Трехмерная графика для геймера. Часть 3

Из каких же компонентов состоит современный графический ускоритель? Перво-наперво, из самого видеочипа (GPU, графического процессора); обычно он сдвинут чуть вниз и вправо от центра карты и укрыт массивным радиатором (а чаще — и радиатором и вентилятором). Для последних поколений мощных карт хорошая система охлаждения — обязательное требование, так как они рассеивают просто неимоверные количества тепла; очень важно также проследить, чтобы в корпусе установленной видеокарте не мешали другие платы расширения, чтобы хватало свободного места — оно критично для хорошего охлаждения. Но вернемся к чипу: он, фактически, является главным компонентом видеокарты. От типа и рабочих частот GPU напрямую зависит производительность видеокарты в целом. Именно GPU выполняет все операции по визуализации 30-графики: подготовку и трансформацию треугольников, отсечение их невидимых частей, освещение, заполнение сцены текстурами, реализацию пиксельных эффектов.. В общем, графический процессор — сердце и «мозг» видеокарты.
Два главных производителя чипов для видеокарт — компании ATi и nVidia. Есть свои решения у Matrox, SiS, VIA (ныне владеющей S3) да Imagination Tech (торговая марка Куго), однако по сравнению с лидерами рынка по сумме показателей они не выдерживают конкуренции. Любопытно, но если взглянуть на цифры по рынку видеочипов, то можно обнаружить заметно меньшую долю рынка у ATi и nVidia по сравнению с маститой Intel. Хотя последняя и не поставляет видеочипов для отдельных видеокарт, огромное количество корпоративных компьютеров собираются на материнских платах со встроенными видеоускорителями Intel (по части производительности, разумеется, отстающих от «внешних» видеокарт в десятки и сотни раз). Отсюда и столь заметная доля рынка.
Кроме GPU-мозга видеокарте нужна память для хранения разнообразных текстур и координат, создания буфера кадра (грубо говоря, хранения сформированного для передачи на монитор изображения), а также прочей промежуточной информации. Казалось бы, в чем проблема? У нынешних компьютеров памяти много (256 Mb-1 Gb). Буфер кадра, например, для разрешения 1024x768 в 32-битном цвете занимает лишь чуть более 3 мегабайт, текстуры для сцены редко превышают 64-128 'Mb, дополнительная информация тоже вряд ли будет слишком объемной. Весь вопрос заключается лишь в скорости — при использовании «обычной» памяти и постоянной прокачке огромных объемов информации по шине AGP (с введением PCI-Express эта проблема исчезает, но первая неприятность все равно остается), GPU просто не будет хватать информации для работы — поэтому на видеокарте было решено устанавливать не слишком объемную, но очень быструю память с минимальными задержками и максимальными частотами. К примеру, на современных видеокартах GDDR-3 не новость, а обычные компьютеры только-только начинают осваивать DDR-2. Текстуры передаются из обычной системной памяти в быструю видеопамять, а уж она бесперебойно снабжает GPU всем необходимым. Несмотря на то, что объем памяти на видеокартах стремительно растет (верхние модели уже имеют 256 Mb на борту), большинство современных игр не использует текстуры в сверхбольших разрешениях, для которых бы требовалось более 64-128 Mb видеопамяти. Ввиду работы на высоких частотах, модули памяти также подвержены достаточно сильному нагреву и требуют хотя бы пассивного охлаждения (радиатор). Тем не менее, наиболее прогрессивная GDDR-3 не требует столь тщательного охлаждения благодаря новым технологиям и, в особенности, BGA-yпаковке (на вид квадратные, вместо традиционных прямоугольников TSOP-упаковки предыдущего поколения). Частоты, на которых работает видеопамять, также очень важны для повышения производительности видеокарты в целом. Однако, разумеется, главную роль здесь будет играть скорость GPU, а видеопамять просто не должна задерживать процесс доставки процессору необходимой информации.
Что еще, кроме памяти и GPU, находится на видеокарте7 Разумеется, сотни и тысячи «сопровождающих» элементов, а также еще как минимум один важный чип, без которого вы ничего на экране монитора не увидите; RAMDAC (Random Access Memory Digital Analog Converter — цифро-аналоговый преобразователь содержимого ОЗУ). RAMDAC преобразовывает отрисованное акселератором и сохраненное в кадровом буфере изображение в аналоговый сигнал для передачи его на монитор. Монитор к видеокарте может подключаться либо при помощи стандартного 15- контактного разъема D-Sub (обычно его окрашивают синим цветом для легкости ориентирования), либо более нового цифрового разъема DVI (Digital Visual Interface — цифровой визуальный интерфейс). Почти все нынешние видеокарты оснащены не одним, а двумя RAMDAC — второй чип может работать как на второй монитор (реже), так и на телевизор (гораздо чаще). Спору нет, очень удобно работать за монитором, а фильмы смотреть с компьютера на большом телевизоре. От качества RAMDAC (а также в некоторой степени от кабеля монитор-видеокарта) зависит качество отображаемой на мониторе картинки.
Некоторые графические карты к тому же снабжаются чипом, отвечающим за работу с видео (VIVO — Video In/Video Out, т.е. видеовход/видеовыход). С его помощью можно производить оцифровку видеоматериалов (разумеется, в непрофессиональном качестве) и более качественный видеовывод. Существуют также варианты карт с несколькими RAMDAC для вывода изображения на несколько мониторов, разъемами для дочерних интерфейсов, блоком ТВ-тюнера и прочими, порой совершенно лишними «наворотами».
Любопытно, что для обеспечения мощных AGP-видеокарт необходимым питанием на них устанавливают разъемы для дополнительного 12 В питания (такие же, как на жестком диске, CD-ROM и др.). Стандарт PCI-Express, по большому счету, такого недостатка лишен, потому как способен доставлять видеокарте гораздо больше энергии по сравнению со стандартным AGP. К слову об интерфейсах: в настоящее время подавляющее большинство видеокарт «общается» с другими узлами компьютера при помощи шины AGP (Accelerated Graphics Port), являющейся, по сути, ускоренным вариантом стандартной шины PCI (Peripheral Component Interconnect). Появившийся в 1996 году стандарт AGP переживает третью реинкарнацию (AGP 3.0 — «8х») и медленно доживает свой век, уступая место высокоскоростному PCI-Express. В отличие от 33 MHz стандартного PCI (и 2,5 GHz PCI-Express), AGP 4х работает на частоте 266 MHz и обеспечивает пиковую пропускную способность порядка 1 ГБайт/сек. AGP 8х соответственно, 2 ГБайт/сек. Необходимо отметить, что шину с такой пропускной способностью на данный момент не способны нагрузить даже самые мощные акселераторы, а потому пиковая пропускная способность интерфейса PCI-Express х16 (6,4 ГБайт/сек) кажется заделом на далекое-предалекое будущее. Тем не менее, последние линейки видеокарт и ATi (Radeon Х700), и nVidia (GeForce 6600) пока выпущены исключительно в PCX-варианте (PCX = PCi-eXpress). В ближайшее время начнется постепенная миграция на PCX-решения, пока же позиции AGP еще сильны.
За кулисами трехмерной сцены
Как видите, в мире ЗD-ускорителей всего за восемь лет «грубая сила», т.е. быстрота заполнения сцены текстурированными треугольниками, выросла более чем в полторы сотни раз! Но ведь к реализму (к которому так все стремятся) одним лишь «лобовым» подходом не шибко приблизишься. Поэтому давайте немного поговорим о ключевых технологиях, которые очень важны для создания привлекательной трехмерной графики и впечатляющих эффектов, а также о методах их реализации.
Уже Voodoo2 умел накладывать две текстуры за один проход. А это означало возможность получения более реалистичных эффектов. Зачастую при помощи мультитекстурирования создавались эффекты освещения (в основном этот метод подходил для ландшафтов): наложенная сверху черная текстура с каким-либо значением прозрачности исполняла роль статичной «тени». Кроме того, при помощи мультитекстурирования можно организовать «рельефное текстурирование». В таком случае вторая текстура, т.н. «карта рельефа», указывает не цвет каждого пикселя, а его «высоту». Затем, при реализации затенения по Фонгу, вектор нормали немного изменяет свое направление в зависимости от карты рельефа (ее можно называть еще картой высот) — соответственно, яркость пикселя будет немного другой, благодаря чему наш мозг быстро распознает выпуклость или впадину на изображении. В полной мере метод рельефного текстурирования проявил себя в движке Doom III.
С выходом GeForce 256 (первого GPU) на графический ускоритель можно было переложить расчеты геометрии и освещения, тем самым радикально снизив нагрузку на процессор и позволив относительно безболезненно увеличивать количество полигонов в поле зрения камеры. БлокТ&L (Transform&Lighting — трансформации и освещения), называемый иногда еще TCL-блоком (Тransformation-clipping-lighting), получал от приложения параметры и координаты источников света, а затем на их основании самостоятельно рассчитывал освещение каждого полигона. Кроме того, он имел в своем активе специальные максимально оптимизированные функции для быстрой реализации матричных преобразований (трансформации) и отсечения невидимых частей (перекрывающихся поверхностей) полигонов. Хотя блок T&L и был мощным, но особой гибкостью не страдал: для реализации новых функций приходилось ждать новых видеокарт. Именно поэтому в настоящее время он тихо умер, а его функции (и, при надобности, его эмуляция) теперь возложены на плечи вершинных шейдеров. Как раз из-за ограниченности установленных разработчиком функций и появились шейдеры, позволившие разработчикам очень гибко программировать «железо» акселератора под свои специфические нужды.
В последнее время это словечко («шейдер») у всех на слуху. Что же это за шейдер такой и с чем его едят? Грубо говоря, шейдер — это написанная на специальном языке (или ассемблере) и исполняемая непосредственно GPU программа, позволяющая оперировать освещением четверок пикселей (квадов) как самих по себе (пиксельные шейдеры), так и связанных с полигонами вершин (вершинные шейдеры).
Вершинные шейдеры могут эмулироваться программно при помощи CPU, пиксельные — нет. Пиксельные шейдеры позволяют достичь удивительной реалистичности изображения благодаря практически неограниченным возможностям управления освещением на самом низком уровне. Традиционным примером использования пиксельных шейдеров являются сложные отражающие поверхности (вода в Morrowind) и волосы. В каждой новой (2.0, 3.0) версии шейдеров растут их функциональность и производительность: те же самые операции на шейдерах более новой версии можно реализовать проще и быстрее, а нередко и вовсе добиться ранее недостижимых эффектов. Несмотря на долгие и упорные попытки nVidia приучить разработчиков к более удобному высокоуровневому (и «заточенному» под семейство GeForce, разумеется) языку программирования шейдеров Cg («С для графики»), они упорно продолжают пользоваться стандартным HLSL (High Level Shader Language — высокоуровневый шейдерный язык), который лучше «переваривают» карты ATi.
В дальнейшем (практически уже в настоящем) почти все основные операции по обработке изображения будут выполняться специализированными шейдерами, а современные графические API в традиционном своем понимании отойдут на второй план.
Однако для получения еще более полного и качественного «гейм-экспириенса» одних лишь шейдеров мало. Существуют некоторые особенности построения изображения на экране, которые проявляются в виде неприятных глазу дефектов изображения.
Современные технологии (фильтрация, сглаживание) призваны бороться с этими неприятностями. Познакомимся с ними поближе. Итак, что делает графическая карта? Грубо говоря, она «натягивает» текстуры на полигоны, позволяя этим полигонам выглядеть реалистично.
Представьте, например, что перед вами в игре стоит шкаф. Модель его проста — прямоугольный параллелепипед (трехмерный прямоугольник, короче), обтянутый соответствующей текстурой. Что будет, когда мы переместимся, скажем, назад? Само собой, процессор рассчитает смену положения игрока в игровом мире, сообщит всю необходимую информацию GPU, и тот нарисует параллелепипед меньших размеров. Но как быть с текстурой? На модель будет наложена текстура более низкого разрешения — согласитесь, ведь при отдалении мы хуже различаем мелкие детали. Логично предположить, что при приближении к объекту разрешение текстур, накладываемых на объекты изменяющегося размера, стоит увеличивать. Вот это уменьшение (удаление от «точки зрения») и увеличение (приближение) размеров текстуры и называется MIP-mapping'oM.
Вроде все верно и правильно придумано, согласны? Но, как обычно, возникают проблемы. Первая — масштабирование. Текстуры нельзя увеличивать до бесконечности без потерь в качестве — отсюда и «квадраты» (эффект избыточного увеличения) в случае максимального приближения к объекту. Кроме того, на длинных сплошных моделях (например, пола, стен, потолка) будут хорошо заметны резкие «прыжки» между MIP-уровнями, т.е. текстурами с различным разрешением.
Вообразите, что вблизи идут текстуры высокого разрешения, которые чуть поодаль резко сменяются текстурами более низкого разрешения и т.д. Иногда эти переходы между уровнями сильно заметны, иногда — не очень, но лучше бы, конечно, их не было вовсе. Для борьбы с неприятным побочным эффектом MIP-mapping'a используется билинейная/трилинейная фильтрация.
Первая (в народе называемая «билинейкой») размывает границы пикселей текстуры и делает их более плавными — как результат, на «перемасштабированные» текстуры становится не так страшно смотреть. Вторая («трилинейка») борется с эффектом скачкообразной смены текстур — для этого цвета соседних пикселей двух «стыкующихся» текстур усредняются, что также благоприятно сказывается на качестве переходов. В таком случае картинка, казалось бы, выглядит как надо: четкие вблизи текстуры плавно «размываются» по мере удаления от игрока.
Но, опять-таки, появляются подводные камни: билинейная и трилинейная фильтрации улучшают качество текстур лишь на плоскости. В то же время, если взглянуть на результат их работы под каким-либо углом, то вылезут очередные неприятные неожиданности. Как быть?
В этом случае на помощь приходит анизотропная фильтрация, по достаточно сложным алгоритмам учитывающая форму объекта (конкретный полигон) при фильтрации. При удачном применении анизотропной фильтрации (которую, кстати, ATi и nVidia реализуют по-разному), наклонные поверхности, обтянутые текстурами, будут выглядеть гораздо более симпатично.
Последний штрих для придания картинке реалистичности и завершенности — сглаживание. Эффект «лесенки» наклонных линий, вы, конечно, неоднократно замечали.
Как бороться? Несмотря на тучу технологий и оптимизаций от ATi/nVidia с разными красивыми маркетинговыми названиями, общие принципы сглаживания, или «антиальязинга» (АА, anti-aliasing — «противоступенчатость»), остались неизменными.
Для борьбы с неприятными «лестницами» каждый пиксель на экране разбивается на подпиксели (субпиксели), затем значения цветов субпикселей усредняются, и это усредненное значение принимается за цвет пикселя.
К примеру, если «пиксель» составляет половина черных и половина белых субпикселей, то цвет пикселя устанавливается серым. «Стоп-стоп! — воскликнет читатель, честно пытающийся разобраться во всех графических хитросплетениях. — Мы же только недавно говорили о том, что пиксель — мельчайший элемент изображения. Какие тогда к чертям субпиксели?» Все верно, физически субпикселей (еще их называют «сэмплами») не существует. Но их можно получить несколькими методами: например, рассчитать все изображение на экране в удвоенном разрешении (этот метод называется «суперсэмплинг», или метод грубой силы) или рассчитать границы отдельных, подверженных неприятному эффекту «лестницы», объектов с применением различных дополнительных ухищрений (более интеллектуальный метод — «мультисэмплинг»). Если первый метод, в силу своей чрезвычайной ресурсоемкости (для сглаживания картинки с разрешением 800x600 нужно рассчитывать, фактически, изображение в 1600x1200) практически не применяется, то второй метод на современных картах позволяет достичь отличного качества при достаточной скорости прорисовки.
Вот такие технологии и методы позволяют картинке в нынешних играх выглядеть эффектно. Сколько для этого нужно вычислительной мощности — лучше даже и не думать. Удивителен другой факт: продукты, предназначенные исключительно для игр, стоят от 100 до 500 долларов и выше, причем заметно совершенствуются каждый год. Это ли не свидетельство исключительного влияния игр на сердца, умы и кошельки? Не становитесь рабами железок и помните — это вы играете в игры, а не игры манипулируют вами, вашим временем и средствами. Или все-таки наоборот?
В ближайшие годы, уверен, качество трехмерной графики, обсчитываемой ускорителями в реальном времени, заметно возрастет и достигнет уровня 3D-фильма Final Fantasy: Spirits Within, а в дальнейшем, через 5-10 лет, мы с трудом сможем отличить (если вообще сможем) созданную компьютером картинку от настоящей. Уверен, с нынешними темпами развития за этим дело не станет.
Так или иначе, благодарю вас за внимание и надеюсь, что многие вопросы по трехмерной графике в играх и устройствах, ее создающих, я сумел прояснить. Конечно, вопросы остались. Возможно, появилось желание узнать больше — что ж, это похвально. На вопросы я всегда рад ответить (адрес — в подписи к статье), ну а за дополнительными и более систематизированными знаниями обращайтесь в Интернет.
Рекомендую начать с сайтов http://www.ixbt.com, http://www.3dnews.ru, http://www.overclockers.ru, http://www.nvworld.ru, http://www.gu- ide3d.ru (русскоязычные) и http:// www.ati.com,http://www.nvidia.com, http://www.tweak3d.net, http://www. tomshardware.com, http://www.guru- 3d.com (англоязычные).
Шустрых вам игрушек и крутых карточек!!!
Николай "Nickky" Щетько, me@nickky.com
Краткий словарь 3D-терминов
MIP-текстурирование (лат. Multum in Parvum — «многое в едином») — метод наложения текстур с учетом удаленности их от точки обзора. При этом более удаленные текстуры берутся с меньшим разрешением, а приближенные — с большим. Соответственно, для каждой текстуры должно быть предусмотрено несколько вариантов в различных разрешениях, т.н. МIР уровней. Для устранения эффекта резкого перехода между MIP-уровнями используются различные виды фильтрации.
MIP-уровень — текстура с определенным разрешением, используемая в МIР-текстурировании. При таком текстурировании для каждой текстуры должно быть предусмотрено несколько MIP-уровней с различными разрешениями.
Анизотропная фильтрация – метод фильтрации, позволяющий избежать эффектов резкого перехода между MIP-уровнями, а также искажения текстур на наклоненных полигонах. При этом используются достаточно сложные алгоритмы, учитывающие положение полигона в трехмерном пространстве.
Билинейная фильтрация — размывает границы пикселей в текстуре, позволяя избежать резких цветовых переходов в случае перемасштабированных текстур.
Вертексный конвейер (англ. — vertex pipe) —часть видеоакселератора, «специализирующаяся» на вершинных, или вертексных. операциях. Занимается всеми геометрическими операциями, реализуемыми, по большей части, с помощью вертексных шейдеров. Конвейеры работают параллельно, т в. скорость работы с геометрией возрастает прямо пропорционально числу конвейеров.
Спрайт —двумерная картинка с изображением кого/чего бы то ни было. Ранее анимация реализовывалась при помощи сотен и тысяч спрайтов, на каждом из которых была изображена некоторая фаза движения объекта. Быстрой сменой картинок-спрайтов достигался эффект движения.
Квад (англ. Quad – «четверка») — квадрат из четырех пикселей (2x2). Пиксели в современных ускорителях обрабатываются не по одиночке а квадами, что дает определенный выигрыш в производительности и удобстве управления ими.
Мультитекстурирование — наложение на один и тот же полигон нескольких текстур для получения специфических эффектов.
Пиксельный конвейер (англ. — pixel pipe) — часть видеоакселератора, «специализирующаяся» на операциях с пикселями. Занимается закраской, «смешением» значений цвета для квадов, пиксельными шейдерами и прочими операциями пиксельного уровня. Конвейеры работают параллельно, т.е. скорость работы с текстурами и пикселями возрастает прямо пропорционально числу конвейеров.
[Полноэкранное] Сглаживание (англ. АА (anti-aliasing), FSAA (Full-Screen Anti- Aliasing)) — ликвидация эффекта «лесенки» на наклонных линиях. В общем случае происходит путем расчета изображения целиком или отдельными частями в более высоком разрешении и последующем усреднении цветов соответствующих пикселей на основании избыточной информации.
Трилинейная фильтрация – методика усреднения цветов соседних пикселей на стыке текстур для ликвидации эффекта резкого перехода между MIP-уровнями.

