VMS_Video (663536), страница 3
Текст из файла (страница 3)
Стадия "G". Геометрическая обработкаделится на несколько фаз, и может частично ускоряться 3D-ускорителем.
-
трансформация (transformation) – преобразование координат (вращение, перенос и масштабирование всех объектов)
-
отсечение (clipping), выполняемое до и после преобразования координат
-
освещение (lighting) – определение цвета каждой вершины с учетом всех световых источников (решение уравнения освещенности)
-
проецирование (projection) – преобразование координат в систему координат экрана
-
setup – предварительная обработка потока вершин (перевод из плавающей точки в фиксированную точку данных о вершинах, а также сортировка вершин, отбрасывание задних граней, субпиксельная коррекция)
Наиболее часто люди путаются именно с геометрической обработкой. Это усугубляется тем, что сами производители путают терминологию. (Например 3Dlabs заявляет, что Glint Delta – геометрический сопроцессор, что вообще говоря неверно, Delta – это setup engine.) Большинство существующих 3D-ускорителей ускоряют только последнюю фазу – setup, при том делают это с разной степенью полноты. Говорят, что 3D-ускоритель имеет полный setup engine, если он может переводить в фиксированную точку все данные о вершине. В зависимости от типа примитивов, с которыми работает 3D-ускоритель, речь ведется о triangle setup или о planar setup.
Геометрический процессором называется ускоритель, который ускоряет всю стадию геометрической обработки, в том числе трансформацию и освещение. Реализация геометрического процессора довольно дорого, и как уже было сказано, он является объектом рекламных спекуляций. Определить реализован ли геометрический процессор довольно легко – надо выяснить, поддерживает ли 3D-ускоритель операции с матрицами. Без такой поддержки не может идти речь об ускорении фазы трансформации. Геометрическими процессорами являются например Glint Gamma и Pinolite.
Стадия "R". Растеризация – наиболее интенсивная операция, обычно реализуемая на аппаратном уровне. Растеризатор выполняет непосредственно рендеринг и является наиболее сложной ступенью конвейера. Если стадия геометрической обработки работает с вершинами, то растеризация включает операции, проводимые на пиксельном и суб-пиксельном уровне. Растеризация включает в себя удаление скрытых поверхностей, текстурирование, альфа-смешение, z-буферизация, затенение, антиалиасинг, dithering.
-
Текстурирование (Texture mapping)
Текстурирование – основной метод моделирования поверхностей. Текстура – изображение, накладываемое на поверхность. Использование текстур требует гораздо меньше ресурсов, нежели моделирование поверхности с помощью полигонов. Текстуры хранятся в текстурной памяти, отдельные тексели (точки текстуры) используются для покрытия текстурой пикселей перед записью во фрейм-буфер. В зависимости от конкретного метода текстурирования, разное число текселей требуется для обработки одного пиксела.
Сэмплинг (point-sampling) – простейший метод текстурирования, в котором для отображения одной точки используется всего один тексел (рисунок ниже). Этому методу присущ серьезный артефакт: когда наблюдатель приближается вплотную к текстурированной поверхности, происходит пикселизация. Для избежания этого артефакта используют другие методы текстурирования, основанные на фильтрации текстур.
Билинейная фильтрация (bi-linear filtering) использует 4 смежных тексела для получения одного пиксела (рисунок ниже). Билинейная фильтрация требует четыре операции смешения для каждого результирующего пиксела: для двух верхних текселей, для двух нижних и для двух полученных значений.
Более сложные методы текстурирования основаны на мипмэппинге.
Когда полигоны текстурируются, необходимо учитывать перспективу. Для того, чтобы текстурированные объекты выглядели правильно, необходима перспективная коррекция. Она гарантирует, что текстура правильно наложится на разные части объекта. Перспективная коррекция – ресурсоемкая процедура (одна операция деления на каждый пиксел), поэтому 3D-ускорители должны реализовывать ее аппаратно. Но разные ускорители достигают разного качества перспективной коррекции.
Fillrate – скорость текстурирования, измеряемая в пикселах в секунду, является очень важной величиной, и именно ее указывают как основную характеристику 3D-чипсета. Fillrate 100 млн пикселей/сек означает, что 3D-ускоритель может обработать 100 млн пикселей в секунду, накладывая на них текстуры. На fillrate влияет множество факторов, таких как тип фильтрации, глубина цвета, альфа-смешение, туман и антиалиасинг.
Туман (Fog)
Туман используется для создания атмосферных эффектов. Туман используется для создания дымки и скрытия удаленных объектов. В первом случае повышается реалистичность сцены, во втором – понижается ее сложность.
С туманом объекты могут рендериться с разной степенью детализации в зависимости от расстояния до наблюдателя. Туман работает по принципу: чем дальше объект, тем больше туман его поглощает. Поэтому для удаленных объектов разумно использовать меньше полигонов, чем для близких. Туман также скрывает и переходы между уровнями детализации.
Туман можно разделить на полигонный (per-polygon) и пиксельный (per-pixel). Полигонный метод линейно интерполирует уровень тумана по значениям в вершинах для получения уровня тумана в каждой точке полигона. Этот метод хорош только для маленьких полигонов. Пиксельный метод рассчитывает уровень тумана для каждого пиксела, и для больших полигонов дает более реалистичное изображение.
Туман также можно разделить и по другому признаку – на линейный и экспоненциальный (или табличный). При линейном тумане степень поглощения объекта туманом линейно зависит от расстояния до наблюдателя, а при экспоненциальном тумане – рассчитывается на основании таблицы.
Удаление скрытых поверхностей (Hidden Surface Removal)
Удаление скрытых поверхностей (hidden surface removal – HSR) – комплексный механизм, служащий дл\я уменьшени\я числа треугольников, которые будут участвовать в рендеринге, а также правильном рендеринге с точки зрени\я глубины.
Прежде всего надо отбросить все треугольники, которые заведомо не видны.
Отсечение (clipping). Отбрасываютс\я все треугольники, которые не попадают в объем отсчечени\я (clip volume), который ограничен шестью плоскост\ями по трем координатам. Это важнейший метод HSR, который выполн\яетс\я всегда.
Отбрасывание задних граней (backface culling). Выполняется проверка, куда "смотрит" треугольник. Это возможно, так как у каждой вершины есть нормаль и поэтому все треугольники являются ориентированными в пространстве. Если треугольник смотрит "на наблюдателя", он считается видимым, а если "от наблюдателя" – то невидимым. Это позволяет снизить вдвое число видимых треугольников, например для вывода сферы, состоящей из треугольников, необходимо срендерить только треугольники, составляющие полусферу, которую видит наблюдатель.
BSP-деревья. Программный метод HSR для статической геометрии, например уровней в 3D-шутере. Цель BSP-деревьев – упорядочение треугольников спереди назад (front-to-back) и определение тех треугольников, которые полностью закрываются другими.
После того, как осталось минимум треугольников, надо их отрендерить, причем так, чтобы видимые пикселы были видимы, а невидимые – невидимы.
Z-буферизация (z-buffering).
Z-сортировка (z-sorting). Z-сортировка – менее аккуратный программный метод удаления скрытых поверхностей по сравнению с z-буферизацией, также известный как алгоритм Паинтера. Объекты сортируются сзади наперед (back-to-front). Более удаленные объекты рендерятся в первую очередь, за ними следуют менее удаленные. Если объекты пересекают друг друга, то ближайший накладывается на дальнего, то есть происходит z-алиасинг.
-
3D-программные интерфейсы (3D API)
API (программный интерфейс) – интерфейс для написания программ, поддерживающий оборудование определенного типа и операционную систему. 3D API позволяет программисту создавать трехмерное программное обеспечение, использующее все возможности 3D-ускорителей. API обычно включают в себя функции, глобальные данные, константы и другие элементы, позволяющие разработчику избегать непосредственного взаимодействия с оборудованием.
3D API делятся на универсальные и специализированные.
Универсальный 3D API позволяет абстрагироваться от конкретного оборудования. Без универсального API, поддерживающих широкий спектр 3D-ускорителей, разработчиками пришлось бы портировать игры под множество плат. Наиболее известные универсальные 3D API – OpenGL и Direct3D.
Специализированный 3D API (Native 3D API) предназначен для одного конкретного семейства 3D-ускорителей и ограждает программиста от низкоуровнего программирования с помощью прямого доступа к регистрам и памяти. Примеры специализированных 3D API – Glide (от 3Dfx), RRedline (от Rendition), PowerSGL (от Videologic), RenderGL (от Intergraph).
Direct3D – 3D API компании Microsoft, предназначенный для использования преимущественно в играх. Direct3D существует только в Windows 95, в скором будущем появится в Windows NT 5.0. Direct3D имеет два режима: RM (retained mode) или абстрактный и IM (immediate mode) или непосредственный. IM состоит из тонкого уровня, который общается с аппаратурой и обеспечивает самое высокое быстродействие. Абстрактный режим – высокоуровневый интерфейс, покрывающий множество операций для программиста, включая инициализацию и трансформацию. У обоих режимов есть достоинства и недостатки, большинство Direct3D-игр используют IM.
OpenGL – открытый 3D API, созданный компанией SGI и контролируемый ассоциацией OpenGL Architecture Review Board, в которую входят DEC, E&S, IBM, Intel, Intergraph, Microsoft и SGI. OpenGL реализует широкий диапазон функций от вывода точки, линии или полигона до рендеринга кривых поверхностей NURBS, покрытых текстурой.
Использование универсального 3D API предполагает использование драйверов для этого API. На сегодняшний день наличие драйверов Direct3D и OpenGL является обязательным требованием ко всем 3D-ускорителям.
Direct3D-драйвер реализует так называемый уровень аппаратной абстракции, HAL (Hardware Abstraction Layer) – интерфейс, который взаимодействует непосредственно с оборудованием и позволяет приложениям использовать возможности 3D-ускорителя с маскимальным быстродействием. HAL имеет низкоуровневый доступ к 3D-чипу и реализует 3D-функции на аппаратном или программно-аппаратном уровне. В отличие от HAL, уровень эмуляции, HEL (Hardware Emulation Layer) является программным растеризатором.
OpenGL-драйвер может быть реализован в двух вариантах: как ICD и как MCD. ICD (Installable Client Driver) полностью включает все стадии конвейера OpenGL, что дает максимальное быстродействие, но ICD довольно сложно программировать. MCD (Mini Client Driver) разработан для внесения абстракции в конвейер OpenGL. MCD гораздо легче программировать, так как разработчик программирует только те участки кода драйверы, которые он считает нужным оптимизировать для своего чипсета. Однако MCD уступает ICD в быстродействии, плюс ко всему MCD работает только в Windows NT. Для широкого внедрения OpenGL на платформе Windows 95 сейчас разрабатывается 3D Graphics Device Driver Kit (Комплект разработчика драйверов устройств для 3D-графики). Новый DDK будет включать переработанный SGI ICD DDK и Direct3D DDK и позволит поставщикам графических микросхем и плат разрабатывать OpenGL-драйверы для Windows 95, Windows NT 4.0, а также Windows 98 и Windows NT 5.0.
-
Наложение рельефа (Bump mapping)
Наложение рельефа, или bumpmapping, – продвинутая методика моделирования рельефных поверхностей. Суть bumpmappingа в следующем: в реальном времени рассчитывается рельефная карта, которая используется для симуляции рельефности. Такой рельефной картой может быть карта освещенности или карта смещений UV. Общий вид рельефной карты – DuDvL, где Du/Dv – дельты текстурных координат environment map, L – освещенность.
Прежде всего программист готовит карту высот (height map), которая описывает рельеф в виде множества высот, либо карту смещений нормалей (normal dispmap), которая описывает рельеф в виде нормалей. Для того, чтобы например подчеркнуть показать бугорки и впадины рельефа с помощью светотени, надо затемнить либо осветлить стенки этих бугорков и впадин. Таким образом существенными для bumpmapping являются не сами высоты, их дифференциалы.
Рассмотрим два вида рельефных карт по отдельности.
Карта освещенности (lightmaps). Каждому пикселу ставится в соответствие значение освещенности L. Карта освещенности рассчитывается с учетом источников света. Полученная карта освещенности накладывается на основную текстуру альфа-смешением. Этот метод симулирует рельефность матовой поверхности игрой света и тени.
-
Карта смещений UV (UV-dispmap). Каждому пикселу ставится в соответствие вектор DuDv. Карта смещений UV используются для получения environment map с пертурбацией. Пертурбация означает, что environment map искажается определенным образом, чтобы передать рельефность. Полученный environment map также накладывается на основную текстуру альфа-смешением. Этот метод симулирует рельефность глянцевой или зеркальной поверхности отражением окружающей среды.
Используя комбинацию карты освещенности и карты смещений UV, можно получать очень красивые модели.
-
Z-буферизация (Z-buffering)
Z-буферизация – самый надежный метод удаления скрытых поверхностей. Z-буфер – область видеопамяти, в которой для каждого пиксела хранится значение глубины. Когда рендерится новый пиксел, его глубина сравнивается со значением, хранимом в z-буфере, точнее с глубиной уже срендеренного пиксела с теми же x и y координатами. Если новый пиксел имеет значение глубины выше значения в z-буфере, это значит что новый пиксел невидим, и он не записывается во фрейм-буфер, если ниже – то записывается. Z-буфер обычно расположен во фреймбуфере, поэтому при отключении аппаратной z-буферизации место под z-буфер освобождается, что позволяет 3D-ускорителю работать в более высоких разрешениях. Ради получения этих высоких разрешений некоторые игры с несложной графикой используют не Z-буферизацию, а более простые методы удаления скрытых поверхностей. Тем не менее отключение z-буферизации может приводить к артефакту, известному как z-алиасинг.