
| Процессоры | Системные платы | Видеосистема | Носители информации | Мультимедиа | Периферия | Коммуникации | Поиск по сайту |
3DМы все играли в Quake (Если вы не играли в Quake, поиграйте, пожалуйста, при первой же возможности). Многие из нас играли в него на каком-либо ускорителе трехмерной графики. Некоторые, поиграв или понаблюдав за играющими, решили купить этот самый "ускоритель", поставив себя перед угрозой мучительного интеллектуального труда, хорошо знакомого современному жителю крупного города: поиска товара устраивающей его цены и обладающего при этом оптимальными для нее характеристиками. В большинстве случаев именно этот процесс способен неожиданно расширить познания человека в области рассматриваемой им ранее лишь с потребительской точки зрения. В этом я сейчас и попытаюсь помочь. 3D-конвейерБольшинство игр, а также множество более серьезных приложений следуют довольно стандартной схеме построения трехмерных изображений (далее мы будем называть этот процесс конвейером). Причем, некоторые программы реализуют все стадии этого конвеера, некоторые же перекладывают часть работы на плечи аппаратных устройств, специальных библиотек программ (API), другие программы или, даже, пользователя. Итак, конвейер состоит из следующих стадий:
Теоретически мы подковались, теперь попробуем разобраться, как все обстоит на самом деле. Во-первых, некоторые стадии этого конвейера могут быть переставлены местами, разбиты на части или совмещены. Во-вторых они могут отсутствовать вообще (редко) или могут появится новые (часто). И, в-третьих, результат работы каждой из них может быть послан (в обход других стадий) обратно. Например, картинку, полученную на последней стадии, можно использовать как новую текстуру для 8-ой реализуя таким образом эффект отражающих поверхностей (зеркал). Таких, как мраморный пол в игре Unreal. 3D APIХорошо, теперь у нас есть последовательность действий. Но для производства готового результата надо определится с двумя вещами – кто какие стадии будет выполнять и как он это будет делать. У нас есть три основных кандидата на работу – сама программа (как правило - начальные стадии конвейера), библиотека прикладного программирования (интерфейс, API) и сам ускоритель. Впрочем, программы, не использующие ускоритель, (Doom, Quake в программном режиме и т.д.) все стадии конвейера выполняют самостоятельно. В понятие библиотеки в данном контексте можно (без особого зазрения совести) поместить драйвера данного ускорителя т.к. с точки зрения программы они становятся частью библиотеки. Программ и ускорителей существует великое множество, а вот число общепризнанных библиотек весьма ограничено. Наиболее часто игры используют следующие библиотеки
Еще существует около 10 библиотек низкого уровня, созданных разработчиками различных ускорителей, такие как R-Redline фирмы Rendition, S3D Toolkit фирмы S3 и т.д. Как и следовало ожидать, программы, написанные специально для них, постепенно исчезают. Хотя большинство современных ускорителей берут на себя лишь две-три последние стадии конвейера, существует важное и быстро прогрессирующие исключение из этого правила: появились первые доступные чипы с поддержкой геометрических преобразований, способные здорово увеличить скорость построения изображения на компьютерах с недостаточной вычислительной мощностью (а она, мощность, недостаточна по определению - иначе не было бы потребности в ускорителях вообще). 3D акселерация
Если не вдаваться в глубокие технические подробности, закраска происходит следующим образом: блок обработки буфера кадра определяет видна ли закрашиваемая точка, например с помощью буфера глубин (Z Buffer). Если она видна, блок обработки текстур вычисляет цвет текстуры соответствующий этой точке примитива. Здесь есть несколько важных моментов – интерполяция (filtering, сглаживание) и выбор уровня текстуры (mip-mapping). Первый обеспечивает изображение без резких прямоугольных пикселей, даже когда вы находитесь вблизи предмета и разрешение текстуры явно недостаточно. Второй устраняет искажения (странные узоры) возникающие при черезмерном удалении от текстуры, выбирая аналог текстуры с меньшим разрешением. Фактически, существует несколько режимов комбинирования этих двух методов. Сейчас наиболее распространены билинейная фильтрация (bilinear filtering - вначале определяется необходимая для этого расстояния текстура, а затем - значение цвета линейно интерполируется между четырьмя соседними точками текстуры, по каждой из координат на поверхности выбранной текстуры) и три-линейная (trilinear - две билинейных для двух текстур, с меньшим и большим разрешениями, затем результат интерполируется между ними). Последняя выглядит более приятно, но и требует больших затрат, так как не реализуется за один такт на современных ускорителях с одним блоком обработки текстур и, в результате, вдвое понижает скорость закраски. Сейчас появились первые ускорители с анизотропной (anisotropic - внутри куба, из двух наборов по 4 соседних точки текстур, и того по 8 точкам) фильтрацией, которая выглядит совсем хорошо, но и занимает еще вдвое больше времени. Затем вычисленный с помощью одного из вышеописанных методов цвет текстуры помещается в буфер кадра, заменяя находившееся там ранее значение, либо комбинируется с ним по какому-либо правилу (combination, blending, alpha-blending), как минимум, ускоритель должен поддерживать режимы Источник*Приемник (Src*Dest) и Источник+Приемник (Src+Dest). Подобные возможности позволяют реализовать цветное освещение, эффекты типа металла или отражения, реализовывать трилинейную фильтрацию там где она не поддерживается аппаратно и т.д. (Так называемое многопроходное построение изображения, multipass rendering). Как правило, для каждой точки текстуры, кроме RGB цвета, можно задать степень ее прозрачности (alpha, RGBA формат текстуры), которая будет использоваться ускорителем для регулирования воздействия источника на приемник. Подобным образом закрашиваются, например, полупрозрачные по краям взрывы и ореолы вокруг источников света в Unreal. Не является жизненно необходимой, но очень ускоряет работу программ, использующих многопроходное построение изображения (например, Quake2 или Unreal), возможность мультитекстурирования (multitexturing). Фактически, это наличие двух (или, даже, более) блоков обработки текстур, способных одновременно вычислять два цвета по двум текстурам для одной точки примитива, а затем комбинировать их между собою. Подобной возможностью обладает Vоodoo2, RivaTNT и еще несколько пока "недоделанных" чипов. Важны также точность представления цветов, 16 бит – Hi-Color или 32 бита – True-Color (последний гораздо лучше) и точность буфера глубин (Z-Buffer, 16 бит хуже, 24 и 32 лучше) используемого для определения видимости отдельных точек примитива. Ошибки в определении глубины способны приводить к странным эффектам, например, к проглядывающим сквозь постамент ногам статуи в игре Unreal. И последнее действие блока обработки буфера кадра - наложениие глобальных эффектов на готовую картинку. Например, туман, дымка или темнота (с точки зрения ускорителя это одно и то же), т.е. эффект известный как fogging. Или, используемый в RivaZX, метод полноэкранного сглаживания (full screen antialiasing), когда изображение рассчитывается с большим разрешением чем показывается пользователю, причем соседние точки изображения суммируются и именно суммарное значение демонстрируется пользователю как одна точка. Подобным образом устраняются резкие границы между полигонами, изображению придается приятный "монолитный" вид. Существует также краевое сглаживание примитивов, приводящее к практически идентичному (чуть хуже) результату (edge antialiasing) но требующее гораздо меньше затрат на построение изображения. РезюмеЗаймемся подведением итогов. Хороший ускоритель на ближайшее будущее это:
И самое главное: приятное для вас изображение и скорость в распространенных играх. |
| Александр Медведев (uncsam@chat.ru) 13 Августа 1998 г. |
| Комментарии? Поправки? Дополнения? pavel@ixbt.com |

| Процессоры | Системные платы | Видеосистема | Носители информации | Мультимедиа | Периферия | Коммуникации | Поиск по сайту |
Copyright (c) by iXBT, 1998. Produced by pavel@ixbt.com & gavric@ixbt.com Дизайн (с) 1998 студия РусАрт |