1.4 Трехмерная графика
Все мы пользуемся продуктами высоких технологий. Прогресс — вещь замечательная. Не будь прогресса, не было бы новых интересных компьютерных игр, не смогли бы вы с легкостью работать в 2D- и 3D-редакторах. Летчики, спортсмены, моряки и т.д. не имели бы тренажеров. Такие полезные устройства, как ноутбуки и КПК, так и остались бы уделом научной фантастики. То есть компьютерная графика применяется во многих областях современной жизни, но считается, что именно развлечения (а более конкретно игры) подтолкнули человечество к такому стремительному прогрессу в этой области. Ибо игры – это то, что притягивает к себе большинство людей вне зависимости от возраста, образования, уровня жизни, профессии и т.д. Появляется много новых понятий и терминов. Порой не успеваешь следить за всеми техническими новинками. И в какой-то момент понимаешь, что отстал от прогресса. В самом центре технологической каши — миллионы людей, которые плохо понимают, что же все это такое. Вроде бы они знают, что такое, например, антиалиасинг, но вот когда их спросишь об этом поподробнее, они запнутся.Был момент, когда вы всего этого не знали. Стали играть в игры, разбираться в системе… Получается, что у огромного числа компьютерщиков нет устоявшихся знаний. Практически на любом компьютере сегодня можно получить такое качество и реалистичность изображения, кторое еще лет 10 назад существовало лишь на экранах мощнейших графических станций. Стоимость этих графических станций составляла несколько сотен тысяч долларов. И вот буквально за последние годы все сильно изменилось, теперь можно любоваться отметками монстров и адским пламенем на экране собственного монитора. При этом качество изображения гораздо выше, чем вы видите в телевизоре. Хотя в телевизоре изображение реальное, а в компьютере – смоделированное.
То есть, технически говоря, видеокарты очень сильно прогрессировали… Видеосистема – самая сложная часть персонального компьютера. Раньше по сложности она уступала только процессору, а сейчас уже процессор ей уступает. Видеокарта состоит из двух частей. Это графический процессор (самая большая микросхема видеокарты) и память. Практически это такая же память, как и оперативная. Правда, обычно она работает на большей частоте, чем оперативная (это требование графического процессора).
Сам графический процессор тоже можно разделить на две части. Каждая его часть названа по виду изображения, которое она создает. Есть часть, отвечающая за 2-мерное плоское изображение (так называемое 2D) и часть, создающая 3 –мерное изображение(3 D). Первая часть существовала даже в самых древних видеокартах. Собственно говоря, только она там и была. И за последние годы она практически не изменилась, проблема создания хорошего плоского изображения была решена еще в 386-х компьютерах. Главный пожиратель ресурсов видеокарты – это 3D часть графического процессора. Чтобы создать достоверное для глаза 3-мерное изображение, необходимо огромное количество вычислений. Но хотя самих вычислений много, они достаточно примитивные и однообразные и поэтому, чтобы не гонять эти данные по загруженной другими данными внутренней шине, вычисления производят в самой видеокарте, для этого и появился на ней свой собственный процессор. Самое сложное изображение можно разделить на элементарные составные части. Этих частей для достоверного изображения должно быть огромное количество, сотни тысяч на одном экране. Поэтому решено было (производителями компьютеров) разделить процесс создания 3-мерного изображения. Центральный процессор только подает команды на создание изображения, а самим созданием занимается видеокарта. Для создания изображения требуется гораздо меньше команд, поэтому графический процессор гораздо проще по своей структуре. Но главное его достоинство – возможность выполнять большое количество операций в секунду. Чтобы еще быстрее работать и давать более 30 достоверных кадров в секунду, в графическом процессоре были организованы несколько исполняющих модулей. Модули могут параллельно выполнять команды, одновременно создавая различные части изображения. А чтобы изображение формировалось еще быстрее, модули объединяют в так называемые конвейеры, чтобы одновременно работать на разных стадиях создания изображения. Но хотя процессор и формирует на лету элементарные фигурки, создающие реальное изображение, из этих фигурок получается только оболочка – каркас. Надо на этот каркас натянуть шкурку – текстуры, которые оживляют смоделированное компьютерное изображение. За этот реализм приходится платить немалую цену (в производительности), ведь текстуры в отличие от каркаса не смоделированы. Текстура – это реальное изображение реальной поверхности. Текстур требуется очень много, именно на создание их идет основная часть видеопамяти. Само изображение на экране, независимо от того 2D оно или 3D, занимает в памяти одинаковый объем. А вот если не хватает памяти для текстур, то центральный процессор начинает использовать для этой цели часть своей оперативной памяти и основная внутренняя шина сильно перегружается. Следствием является дерганее экрана и прочие неприятности с изображением. Поэтому на видеокарту стараются поместить как можно больше памяти, (это сдерживается только ценой). В первую очередь, в памяти располагается видеобуфер — специальный участок памяти, где хранится копия изображения, которое в следующее мгновение будет выведено на экран. В видеобуфере изображение как бы собирается по кускам и отправляется на обработку в RAMDAC. В случае если применяется двойная буферизация (double buffering), в видеобуфере хранится дополнительно предыдущее (“теневое”, или “заднее”) выведенное на экран изображение (все эти специальные термины будут рассмотрены в разделе посвященном созданию трехмерного изображения). Наш глаз обладает некоторой инерционностью, то есть некоторое время продолжает видеть изображение, которое уже исчезло.
Представьте себе, что все, что рисует видеокарта в видеобуфере, мгновенно попадает на экран. Рисуем линию — она рисуется поверх предыдущего изображения. Как бы быстро ни происходил этот процесс, глаз все равно будет замечать, что какие-то части изображения остались, какие-то изменились. Из-за этого игрок заметит крайне неприятное мелькание. Именно поэтому новый кадр сначала рисуется в теневой области видеобуфера (так называемый backbuffer), а затем этот кадр и тот, который был на экране, меняются местами. Благодаря этому создается впечатление гладкого и равномерного движения. Допустим, монитор находится в разрешении 1024х768 и в режиме 32 бита. Это значит, что цвет каждого пикселя определяют 32 бита, а количество всех возможных цветов — 232 = 4 294 967 296 — четыре с лишним миллиарда. Порог чувствительности человеческого глаза, к слову, немного ниже, то есть такая картинка будет восприниматься как абсолютно реальная (такой режим называется True Color как было отмечено ранее). В режиме 1024х768 на экране отображается 786432 пикселей. Нехитрые подсчеты показывают, что для хранения этого кадра в видеопамяти потребуется около 3 Мб. С учетом двойной буферизации получается 6 Мб. Но ведь в современном акселераторе в среднем стоит 128 Мб видеопамяти. На что же используются остальные.
Используются они в первую очередь на текстуры. Подгружать текстуры из оперативной памяти, а то и с жесткого диска в процессе рендера — неоправданно долго. Поэтому разработчики игр специальными командами дают задание акселератору подгрузить все или хотя бы часть необходимых ему текстур во время загрузки очередной карты или уровня. Средний размер текстуры — 1024х1024 при качестве 24 или даже 32 бита. Такая текстура будет занимать в памяти около 4 Мб. Значит, в видеопамять объемом 128 Мб влезет от силы 32 таких текстуры. Один путь — подгружать текстуры из оперативной памяти по мере необходимости, но тогда могут случаться задержки, вызывающие падение FPS. Другой путь — хранить текстуры в видеопамяти сжатыми, хотя бы простым алгоритмом. Одним из первых алгоритмов сжатия текстур был S3TC, разработанный в компании S3 Inc. Он стал индустриальным стандартом и поддерживается в DirectX, начиная с версии 6.0. Компания 3dfx разработала свой метод сжатия — FXT1, который отличается высокой степенью компрессии. В настоящее время в ходу несколько конкурирующих методов сжатия. Время определит лидера. Кроме того, в видеопамяти размещаются буферы для вспомогательных технологий: Z-буфер (о котором будет упомянуто позже), T-буфер, вспомогательные кадры для анизотропной фильтрации и ряд других. Пара слов о T-буфере. Эта технология была придумана в компании 3dfx и впервые реализована в Voodoo 5. Для одного и того же кадра в видеопамяти хранится четыре копии, немного сдвинутые друг относительно друга. После рендера они совмещаются, в результате чего края объектов немного размываются и устраняется эффект “лесенки”. T-buffer можно считать еще одной технологией антиалиасинга. Однако она еще и улучшает качество отрисовки быстро движущихся объектов за счет легкого их размытия. За время существования видеокарт разработчики придумали большое количество типов видеопамяти. Основных подходов два: взять уже существующий тип обычной оперативной памяти или разработать что-то новое, специально “заточенное” под хранение графики. Оба подхода были востребованы в разное время и периодически сменяют друг друга. Сейчас, например, в большинстве видеокарт стоит память типа DDR, практически та же самая, что и обычная оперативная память компьютера. Типы видеопамяти, либо по тем или иным причинам не получившие (пока) большого распространения: FPM, EDO DRAM, VRAM, WRAM, RDRAM, SDRAM, SGRAM. В профессиональных видеокартах устанавливаются специальные типы видеопамяти, которые оптимизированы под конкретные задачи, но нам они вряд ли будут интересны.