- Графический конвейер
-
Графический конвейер — аппаратно-программный комплекс визуализации трёхмерной графики.
Содержание
Элементы трехмерной сцены
В общем виде трехмерную сцену можно представить как набор отдельных групп элементов: группы трехмерных объектов, группы источников освещения, группы применяемых текстурных карт, группы камер.
Трехмерный объект обладает свойствами координат вершин треугольников в пространстве сцены и локальных координат в пространстве текстурной карты. Ему соответствует алгоритм поведения: параметры масштабирования, угла поворота, смещения и прочие изменения в течение времени в соответствии с замыслом разработчиков. Производным от первых двух свойств является грань — плоскость объекта, имеющая три вершины, с наложенными на нее текстурами.
Источник освещения может обладать следующим набором свойств (полностью или частично): координатами в пространстве сцены, ориентацией (направленностью), типом излучения (фоновым, точечным и т. п.), цветом и алгоритмом изменения светового излучения.
Камера представляет собой точку, откуда наблюдатель обозревает трёхмерную сцену. Почему же предпочитают использовать термин камера? Дело в том, что наблюдатель-человек обладает стереоскопическим зрением, а камера имеет только один «глаз». Поэтому глубину сцены приходится имитировать на плоском экране с помощью различных ухищрений. Плоскость, в которой расположена камера, называется плоскостью проецирования, или картинной плоскостью. Камера обладает свойствами координат в пространстве сцены, целевой точкой, углом зрения, углом поворота. Линия, соединяющая камеру и целевую точку, называется линией визирования. Угол поворота рассчитывается относительно оси линии визирования.
Текстурой (или текстурной картой) называют двух- или трёхмерное изображение, имитирующее зрительное восприятие человеком свойств различных поверхностей. На полигон можно накладывать несколько текстур, смешивая их различными способами, с тем, чтобы моделировать зрительный образ нужного материала. Специализированные текстуры (например, карты окружающей среды) сами не отображаются, а используются для модификации других текстур, накладываемых на полигон.
Аппаратные средства
В самом общем виде современный ускоритель 3D-графики должен иметь блок геометрических преобразований и расчёта освещения (геометрический процессор), блок механизма установки примитивов, блок обработки текстур и блок обработки буфера кадра. Геометрический процессор обрабатывает примитивы и строит проекцию трёхмерной сцены. Блок расчета освещения формирует данные о параметрах освещения для вершин примитивов.
Блок установки примитивов с помощью данных, полученных из буфера глубины, определяет видимость отображаемой точки (пиксела). Видимые пикселы обрабатываются в блоке текстур различными методами с применением одной из технологий фильтрации и наложения текстурных карт. Обработанный таким образом пиксел вновь помещается в буфер кадра, либо заменяя находящееся там значение, либо смешиваясь с ним по выбранному правилу.
Программные интерфейсы
Скорость и качество обработки трёхмерной сцены во многом зависят от совершенства инструкций, передаваемых приложением графическому ускорителю. Такие инструкции объединены в специализированные прикладные программные библиотеки (Graphics API). С одной стороны, инструкции должны учитывать особенности построения аппаратной части графического адаптера. С другой стороны, конструкция графического адаптера должна соответствовать возможностям API.
Точного соответствия между аппаратурой и API не бывает: иногда разработчики видеокарты опережают время и вводят функции, которые не поддерживаются действующими API. Часто в API появляются инструкции, которые не могут быть выполнены конкретным графическим адаптером. Поддержка API реализуется через драйвер видеокарты. Бывает, что разработчики игр пытаются использовать функции видеокарты, недоступные через стандартную версию API. В этом случае они создают собственные мини-драйверы.
Совокупность аппаратных и программных средств обработки трехмерных сцен образует графический конвейер, конечным итогом работы которого является кадр, размещенный на экране монитора. Ниже рассмотрены основные принципы работы такого конвейера.
Шесть этапов работы 3D-конвейера
Большинство приложений трехмерной графики, в том числе игр, при построении объемных сцен придерживаются определенной последовательности действий, в совокупности составляющей 3D-конвейер. Итогом работы 3D-конвейера является отрисовка (рендеринг) результирующего изображения на дисплее компьютера. Группу операции, выполняющих обособленные промежуточные действия, принято называть этапом, или стадией 3D-конвейера. Описываемая ниже последовательность операций отнюдь не является жестко заданной, а скорее общепринятой в современных графических подсистемах. При конкретной реализации на программном и аппаратном уровнях могут появляться существенные отличия, однако смысловое содержание блоков практически не меняется. Итак, на сегодняшний день процесс визуализации трёхмерной сцены на экране компьютера выглядит в общих чертах следующим образом.
Первый этап
Здесь определяется состояние объектов, принимающих участие в сцене, которую необходимо отобразить. На первый взгляд к самой графике этот этап отношения не имеет. На самом деле он является определяющим, ибо состояние объектов и их взаимное положение формируют логику последующих действий программы. Например, если вашего персонажа в игре уже «убили», какой смысл вообще выводить трехмерную сцену? С каждым объектом в сцене связана соответствующая текущему моменту геометрическая модель. То есть объект один (например, некий монстр), но с ним сопоставляются разные геометрические модели в зависимости от состояния — жив, ранен, убит, трансформировался в другой объект и т. д. Практически все операции на первом этапе выполняет центральный процессор. Результаты его работы пересылаются в графический чипсет посредством драйвера.
Второй этап
Происходит декомпозиция (разделение на примитивы) геометрических моделей. Внешний вид объекта формируется с помощью набора определенных примитивов. Чаще всего в роли примитива выступает треугольник как простейшая плоская фигура, однозначно располагаемая в трехмерном пространстве. Все прочие элементы состоят из таких треугольников. Таким образом, можно утверждать, что по большей части термины «полигон» и «треугольник» применительно к игровой 3D-графике суть синонимы.
Современные графические процессоры умеют выполнять дополнительные операции, например тесселяцию (Tesselation), то есть разделение исходных треугольников на более мелкие. Некоторые графические чипсеты могут аппаратно обрабатывать геометрические модели, построенные на основе параметрических поверхностей (механизм RT-Patches). Часть графических процессоров умеет превращать плоские треугольники в трёхмерные поверхности путём «выдавливания» в третье измерение (механизм N-Patches).
Итоговый результат операций второго этапа пересылается в блок трансформаций и освещения (Transform&Lighting, T&L) геометрического процессора.
Третий этап
В блоке T&L на аппаратном уровне к вершинам треугольников применяют различные эффекты преобразований и освещённости. Содержание операций блоков T&L новейших графических чипсетов можно динамически изменять посредством вершинных шейдеров (Vertex Shaders) — специальных микропрограмм, включаемых в код игры. То есть сегодня персональный компьютер в дополнение к центральному процессору получил полноценный программируемый графический процессор. По завершении операций трансформации и расчёта освещённости параметры вершин нормализуются и приводятся к целочисленному виду.
Четвёртый этап
На данном этапе происходит так называемая установка примитивов (Triangle Setup). Графический процессор пока ничего не знает о свойствах треугольников, поскольку обрабатывал вершины по отдельности. Теперь необходимо «собрать» вершины в треугольники и преобразовать результаты в координаты и цвет каждого пиксела, а также отсечь невидимые области.
В ходе «сборки» определяется видимость объектов с позиции камеры. Полигоны, находящиеся ближе к камере, могут загородить более удалённые полигоны. Для хранения информации о степени удалённости объекта от плоскости проецирования используют специальный буфер глубины (Z-буфер). Современные графические процессоры применяют различные механизмы отсечения невидимых полигонов на ранних этапах 3D-конвейера с тем, чтобы избежать излишних операций. Данные буфера глубины обрабатываются специализированными блоками графического процессора. В конечном счете, на выходе блока геометрических преобразований получают проекцию трехмерной сцены на плоскость визуализации. Координаты и исходный цвет видимых пикселов передаются в текстурный конвейер (Texture Pipeline).
Пятый этап
Графический чипсет может иметь несколько параллельных текстурных конвейеров. В каждом из них происходит наложение текстур различного типа, в том числе и тех, которые сами не отображаются (например, карты высот), а служат для модификации других текстур. На этом этапе в современных чипсетах возможно исполнение пиксельных шейдеров (Pixel Shaders) — специальных микропрограмм, определяющих порядок смешивания текстур, полученных на выходе из каждого конвейера. Здесь также учитывается информация (полученная на этапе установки примитивов) о принадлежности пиксела к определённому треугольнику. В целом указанные операции составляют суть процесса визуализации (рендеринга).
Шестой этап
На заключительном этапе работы 3D-конвейера к полученному в текстурном блоке плоскому изображению применяют операции устранения дефектов (например, часто используют билинейные, анизотропные и другие фильтры). Операции конечной обработки применяют какой-либо эффект (например, туман) к целиком сформированному изображению. Перед выводом в буфер кадра в последний раз проверяется видимость пикселов, и наконец изображение появляется на экране.
Перечисленные этапы в конкретных графических чипсетах могут быть переставлены, разделены, объединены, выполняться неоднократно (в несколько проходов), однако их физический смысл остается неизменным. Технологически некоторые элементы этапов или этапы целиком могут быть выполнены различными способами. Вариант реализации зависит от особенностей приложения и видеокарты.
В зависимости от типа видеоускорителя часть этапов просчитывается программно, а часть — аппаратно. Самые современные ускорители имеют на борту графический процессор, способный аппаратно просчитывать этапы трансформации (преобразований) и расчета освещения, наложения текстур.
Особенности первого этапа
Одним из ключевых критериев реалистичности сцены является качество представленных в ней моделей. Качество отображения, близкое к фотореализму, возможно при наличии 500 000 и более треугольников в сцене. Объём данных для обработки каждой вершины треугольника составляет, как минимум, 12 байт: 3 для координат вершины + 3 для параметров нормалей в вершинах + 3 для координат текстуры + 3 для параметров цвета. Для треугольника в целом минимальный объем данных составит 36 байт. Если же применить различные эффекты, предусмотренные, например, в библиотеке DirectX (карты окружения, анизотропную фильтрацию), то максимальный объем данных для одного треугольника достигает 768 байт. Принято считать, что средний объем данных на каждый треугольник составляет 180 байт. При наличии полумиллиона треугольников в сцене общий объем данных составит около 90 Мбайт. Приемлемая скорость смены кадров в играх — примерно 30 раз в секунду, то есть общий поток данных превысит 2,5 Гбайт/с.
Путем оптимизации моделей часто удается добиться совмещения вершин треугольников. Выдающимся считается коэффициент оптимизации 0,5 — это снижает поток данных вдвое, в нашем случае примерно до 1,3 Гбайт в секунду. Для сравнения укажем, что пропускная способность шины
Одним из методов улучшения формы трехмерных полигональных моделей и снижения потока данных служит применение трёхмерных поверхностей высокого порядка. В этом случае исходный объект можно представить меньшим числом элементов, а детализацию выполнить средствами графического адаптера путём разбиения граней на мелкие треугольники (тесселяция). В библиотеке DirectX версии 8 появились средства описания поверхностей высокого порядка с помощью набора контрольных точек (patсhes).
Второй этап: борьба за качество
В общем случае после декомпозиции модели блок геометрического конвейера в качестве исходных данных получает данные о координатах вершин грани объекта и нормалях (векторах к освещаемой поверхности) в вершинах. В зависимости от заданной степени тесселяции исходный треугольник может различными способами разбиваться на более мелкие (от 4 до 64). Этот процесс эффективно обсчитывается в графическом процессоре. Тесселяция позволяет несколько повысить качество отображения объектов, однако не избавляет от коренного недостатка: сравнительно грубых исходных граней.
Параметрические поверхности
В библиотеке поверхностями Безье — набор RT-Patches, которые поддерживаются ускорителями GeForce3, GeForce4.
Параметрические поверхности, описываемые типом RT-Patches (Rectangular and Triangular Patches) имеют прямоугольную форму. В библиотеке DirectX версии 8.1 использованы поверхности Безье первого, второго и пятого порядка. Поверхность первого порядка представляет собой плоскость, а более высокого порядка — трехмерную структуру. Поверхность пятого порядка имеет большое число контрольных точек, что позволяет более точно моделировать сложные кривые, задающие поверхность.
Графический процессор, поддерживающий RT-Patches, разбивает представленную приложением поверхность высокого порядка на сегменты (треугольники и вершины), исходя из заданных разработчиком программы параметров. Каждый этап тесселяции увеличивает число сегментов вдвое. Тем самым обеспечивается адаптивная детализация поверхностей высокого порядка, связанная с расстоянием до плоскости проецирования. Вблизи камеры можно применить подробную детализацию, а на достаточном расстоянии задействовать минимум ресурсов.
Применение параметрических поверхностей позволяет моделировать живые объекты и динамически модифицируемые формы (например, колебания ткани платья в движении) на фотореалистичном уровне. Такая технология широко применяется в мощных программах трёхмерного моделирования. Однако в 3D-приложениях рендеринг сцены идет продолжительное время, что совершенно неприемлемо для игр. Поддержка RT-Patches на аппаратном уровне открывает возможность использования в играх моделей, качество которых не хуже кинематографических персонажей, поскольку по шине AGP вместо огромного потока сведений о треугольниках достаточно передать формулы, задающие поверхности Безье (объём передаваемых данных снижается на два порядка!).
Главными препятствиями на пути внедрения технологии RT-Patches в играх выступает трудоёмкость их разработки и несовместимость с видеоадаптерами, не поддерживающими данную технологию. То есть разработчик игры должен либо создавать все модели на основе параметрических поверхностей (и тем самым исключить из круга потенциальных покупателей владельцев «устаревшего» железа), либо выполнять двойную работу, создавая дополнительный комплект объектов из традиционных моделей, построенных на основе треугольников.
Обработка RT-Patches на аппаратном уровне была впервые обеспечена в блоке Surface Engine геометрического процессора чипсета GeForce3. Однако отсутствие реальных приложений с моделями на основе параметрических поверхностей (в силу указанных выше причин), привели фирму nVIDIA к решению отказаться (быть может, временно) от поддержки RT-Patches в чипсетах GeForce3/4 (путем отключения этой функции в драйверах, начиная с версии 21.81).
Имитация параметрических поверхностей
Как говорилось ранее, каждая вершина полигона полностью описывается параметрами трехмерных координат, нормали, цвета, текстурной координаты. При обработке вершины блоком T&L или программой (вершинным шейдером) графический процессор не имеет какой-либо информации о соседних вершинах треугольника. Нормаль (вектор, перпендикулярный к моделируемой поверхности) также является атрибутом вершины, но не треугольника.
Трёхмерные поверхности на основе N-Patches строят на базе контрольных точек, расставляемых графическим процессором на каждой стороне исходного треугольника. Суть N-патчей проста — из нормалей можно «вытащить» информацию о кривизне поверхности. Для этого требуется выполнить два условия: получить данные о всех трёх вершинах полигона и сгруппировать их («собрать» примитив).
Получив координаты вершин и значения нормалей в вершинах к создаваемой трехмерной поверхности, графический процессор, поддерживающий технологию N-Patches, рассчитывает положение контрольных точек, разделяя стороны треугольника на равные отрезки. Тем самым исходный треугольник разбивается на более мелкие треугольники (до 64). Значения нормалей в генерируемых контрольных точках получают методом линейной или квадратичной интерполяции.
Координаты контрольных точек рассчитываются методом их проецирования на плоскость, перпендикулярную к нормали в вершине исходного треугольника. Если все три нормали в вершинах будут перпендикулярны к плоскости исходного треугольника, он так и останется плоским, разбей его хоть на 1000 частей.
Если нормали в вершинах не перпендикулярны к плоскости треугольника, контрольные точки тесселяции начнут «притягиваться» к имитируемой поверхности. Чем больше угол между нормалью в вершине и плоскостью исходного треугольника, тем более «притягательной» становится поверхность, перпендикулярная к данной нормали.
Очевидно, что при максимальном числе контрольных точек получают наилучшее качество трёхмерной поверхности. Причём увеличение числа контрольных точек никак не сказывается на объёме геометрических данных, поступающих через шину AGP, поскольку используются обычные полигональные модели. В этом состоит основное (на сегодняшний день) преимущество технологии N-Patches: она не требует коренной переработки существующих программ. Разработчикам достаточно указать в программе, какие объекты сцены разрешается обрабатывать N-Patches, степень тесселяции, а остальное сделает геометрический процессор видеокарты.
Вместе с тем, у технологии N-Patches имеется ряд существенных недостатков. Во-первых, это заметные искажения геометрической формы объектов на стыках полигонов. Ведь обработка N-Patches приводит к тому, что треугольники как бы «раздуваются». И если для многих моделей живой природы это только улучшает их представление, модели техники, где много прямоугольных стыков и прямых линий, выглядят комично. А существенное расхождение треугольников на стыках граней приводит к появлению щелей.
Поэтому некоторые модели все же приходится дорабатывать под N-Patches, добавляя так называемые заглушки (Junction) на стыках граней. Второй недостаток связан с тем, что нормали исходной полигональной модели в принципе используют для манипулирования освещением, а не формой поверхности, и иногда интерполяция нормалей приводит к искажениям формы. Наконец, технология N-Patches является абсолютно бесперспективной (так как не приносит ничего нового в методы построения моделей), не поддерживает динамическую бесступенчатую детализацию и другие передовые решения.
Поддержка технологии N-Patches на аппаратном уровне была впервые обеспечена в чипсете Radeon 8500 фирмы ATI. Производители игр немедленно «проголосовали» за это нововведение, выпустив «заплатки» к популярным продуктам и заложив поддержку технологии в новые разработки.
Фирме nVIDIA ничто не мешает, с технической точки зрения, обеспечить функционирование N-Patches в своих графических адаптерах. Однако в чипсете GeForce4 такая возможность отсутствует, что объясняется исключительно «политическими» соображениями, связанными с конкурентной борьбой. В итоге страдают пользователи.
Третий этап: борьба за скорость
Современные графические ускорители (серий GeForce и Radeon) имеют геометрический конвейер сходной архитектуры, с аппаратной поддержкой T&L и вершинных шейдеров. Источником данных обычно является буфер вершин, который хранится в локальной видеопамяти. В буфер вершин параметры вершин треугольников поступают массивами (Triangle Strip, Triangle Fan), в последовательности, заданной приложением. Из буфера данные считываются в кэш (условно именуемый кэшем подготовки — Pre-T&L Сасhe), обслуживающий блоки T&L и обработки вершинных шейдеров (Vertex Shaders ALU). Буфер вершин бывает двух типов: обычный и индексируемый.
Из обычного буфера данные считываются последовательно, образуя поток вершин (Vertex Stream). Такой подход кардинально снижает количество промахов кэша, однако никак не влияет на общий объём потока данных.
В индексируемом буфере параметры вершин описываются индексами. Поэтому вершина с подходящими параметрами может использоваться в модели многократно, что существенно сужает поток данных. Индексируемый буфер вершин применён во многих современных графических чипсетах: Radeon 7500, Radeon 8500, GeForce2, GeForce3, GeForce4. Эффективность индексируемого буфера вершин зависит от особенностей реализации доступа к локальной видеопамяти и системы кэширования данных конкретного чипсета. Например, в чипсетах фирмы nVIDIA применена перекрестная (кроссовая) архитектура доступа к локальной видеопамяти. Каждый из чётырех блоков управления памятью получает доступ к участку шириной 32 бита общей шины. При необходимости буфер вершин задействует все блоки, монопольно управляя шиной шириной 128 бит.
При считывании параметров вершин из оперативной памяти производительность чипсета определяется полосой пропускания шины AGP. Тестирование видеокарт показывает, что максимальный поток геометрических данных по шине AGP составляет 650—770 Мбайт/с для видеокарт на базе GeForce3, GeForce4 и до 860 Мбайт/с для видеокарт на базе Radeon 8500.
Если все вершины поместились в кэш подготовки, то эффективность графического процессора ограничивается только производительностью блоков T&L и обработки вершинных шейдеров. Мощность блока T&L составляет для GeForce3 Ti500 около 5 миллионов вершин в секунду, для Radeon 8500 — около 12 миллионов (при восьми источниках света). Производительность блока вершинных шейдеров чипсета GeForce3 Ti500 достигает 12 миллионов вершин в секунду, а чипсета Radeon 8500 — 23 миллионов (на оптимизированных инструкциях).
Вершинные шейдеры
Большинство графических чипсетов третьего поколения (GeForce256/2, Radeon 7500) располагают блоком расчёта трансформаций и освещения (T&L), выполняющим фиксированные (заданные аппаратно) операции: установка параметров рендеринга освещения, текстур, матричные преобразования.
Шейдерами (Shaders) называют микропрограммы, задаваемые инструкциями API, которые динамически изменяют алгоритм работы графического процессора видеокарты. Вершинные шейдеры (Vertex Shaders) определяют порядок трансформации вершин треугольников. Как уже говорилось выше, минимально необходимый объем данных для каждой вершины полигона составляет 12 байт. Следовательно изменение свойств вершины вызывает необходимость пересчета большого объема данных, что сильно загружает центральный процессор и шину AGP. С появлением чипсетов, поддерживающих технологию вершинных шейдеров (GeForce3/4, Radeon 8500), задачи расчета трансформации вершин решаются графическим процессором, то есть объем геометрических данных, передаваемых по шине AGP, резко снижается. Например, вместо громадного массива новых параметров освещения вершин теперь достаточно передать несколько коротких инструкций API для графического процессора.
В спецификации DirectX 8.1 определено 17 инструкций для обработки свойств вершин, а длина шейдера ограничена 128 инструкциями. Укажем важнейшие операции, которые можно выполнять аппаратными средствами графического процессора:
— межкадровая интерполяция вершин (Key Frame Interpolation), что существенно ускоряет анимацию; — наложение вершин (Vertex Blending) с использованием более чем четырёх матриц преобразования, что облегчает «скелетную» анимацию сложных моделей без их разбиения на несколько частей; — процедурная геометрия, то есть искажение свойств вершин каким-либо параметрическим объектом (например, волны на водной поверхности или перекатывающиеся под кожей мускулы персонажа); — сложные модели освещения, учитывающие свойства материала объектов.
Кэширование шейдеров позволяет хранить в графическом чипсете несколько программ, что уменьшает время их пересылки из памяти. При использовании API DirectX кэшированием шейдеров управляет драйвер видеокарты, а в API OpenGL можно прямо указывать, какие шейдеры будут резидентными. Технология вершинных шейдеров является значительным шагом вперёд на пути к фотореалистичной графике. Вершинные шейдеры редко используются обособленно, в большинстве операций они тесно связаны с пиксельными шейдерами.
Адаптивная детализация
Современные приложения трёхмерной графики позволяют создавать для игровых программ реалистичные объекты с высокой степенью детализации даже при использовании исключительно полигонов. Однако с практической точки зрения нерационально все объекты трёхмерной сцены отображать с максимальной детализацией, так как человеческое зрение отказывается воспринимать мелкие детали удалённых объектов. Например, в армии давно выработаны эмпирические формулы, позволяющие по степени видимости деталей объекта оценивать расстояние до него. То есть, идентифицировать объект как танк можно за два километра, а вот определить его тип по характерным деталям — только за километр.
Очевидно, что и в играх нет смысла воспроизводить каждый трак на гусеничной ленте танка, если человек всё равно не способен его различить. К тому же непрерывная обработка нескольких сотен или тысяч полигонов, составляющих объект, независимо от его удаления, приводит к загрузке компьютера бессмысленной работой.
Таким образом, на каждый момент времени необходимо просчитать для всех объектов в трехмерной сцене так называемый LOD (Level of Detail — уровень детализации). Существуют два стратегических подхода к управлению детализацией: статический и динамический LOD. В первом случае заранее создают упрощённые варианты максимально детализированного объекта. Предположим, что для модели танка, состоящей из 1200 полигонов, достаточно сделать упрощённые варианты из 600 и 300 полигонов. В ходе построения сцены просчитывается удаление модели танка от плоскости проецирования и выбирается вариант, соответствующий дальности.
В технологии динамического, или непрерывного, LOD используют различные алгоритмы, позволяющие плавно регулировать число полигонов в объекте в зависимости от расстояния до картинной плоскости, обычно за счёт тесселяции треугольников.
У каждого метода есть свои преимущества и недостатки. Статическое управление вызывает эффект «дёрганья» изображения при смене детализации объекта. Если уровень LOD близок к граничному значению, иногда возникает циклическая смена моделей с разным уровнем детализации. К тому же приходится обсчитывать несколько разных моделей для одного объекта.
Динамическое управление детализацией потребляет значительные вычислительные ресурсы, требует непрерывного пересчёта не только координат вершин треугольников, но и параметров освещенности. При частом переключении между уровнями иногда наблюдается эффект «волнистости» поверхности — форма объекта непрерывно «плывёт», что в неживой природе выглядит особенно нереально.
Четвертый этап: ухищрения сборки
После трансформации, освещения и затенения вершины объединяются по три (этот процесс называется сборкой треугольников) для передачи блоку установки примитивов и последующей растеризации. Так как треугольники часто имеют общие вершины, обычно требуется обработка лишь одной вершины для каждого нового треугольника. Недостающие вершины считываются из второго кэша, который можно условно назвать кэшем постобработки (Post-T&L Cache). Если все вершины помещаются в кэш постобработки, производительность графического чипсета определяется эффективностью блока установки примитивов. Для чипсета GeForce3 Ti500 мощность блока установки примитивов достигает 47 миллионов вершин в секунду, для чипсета Radeon 8500 — 67 миллионов.
Буфер глубины
Как уже было рассмотрено, в трёхмерной графике одной из координат является значение Z, которое обычно характеризует глубину сцены, то есть степень удаления объектов от камеры (плоскости проецирования). Очевидно, что проекция непрозрачных объектов, расположенных ближе к камере, будет частично или полностью перекрывать проекцию удалённых объектов, исключая их видимость для наблюдателя. Кроме того, грани объекта, обращенные к плоскости проецирования, препятствуют видимости расположенных с тыла элементов. Графический адаптер должен определить, какие объекты следует отображать, а какие скрыть. Для этого координаты глубины помещают в Z-буфер.
Для оценки сложности сцены применительно к видимости её элементов по глубине применяют показатель перекрытия полигонов (Overdraw). Например, если значение Overdraw составляет три единицы (что характерно для современных программ), это означает, что в среднем один видимый полигон перекрывает три полигона, расположенных глубже.
Для раннего определения видимости по глубине применяют различные технологии. В частности, фирма nVIDIA в своих графических чипсетах применяет механизм раннего отсечения невидимых поверхностей HSR (Hidden Surface Removal), а фирма ATI использует иерархическое представление данных в Z-буфере (механизм Hyper Z). В современных графических адаптерах также широко применяют кэширование Z-буфера, сжатие Z-координат без потерь и механизм быстрой очистки буфера глубины. По результатам тестов в сценах с большими значениями Overdraw, механизм Hyper Z действует лучше, чем технология HSR ранних версий. В чипсете GeForce4 этот недостаток был исправлен, и последняя реализация HSR обеспечивает хорошие результаты.
Пятый этап: проблемы закраски
Для ускорения обработки текстур используют параллельную работу нескольких (обычно 2—3) конвейеров. В этом случае операции комбинирования двух-трёх текстур выполняются за один цикл (проход). Следует учитывать, что применение технологий с наложением трёх текстур (например, ЕМВМ) на двухконвейерных ускорителях всё равно потребует двух проходов. Последние модели графических адаптеров имеют до четырёх текстурных конвейеров, а также блок исполнения пиксельных шейдеров.
Пиксельные шейдеры
Пиксельные шейдеры (Pixel Shaders) служат для динамического изменения свойств отдельных пикселов. Единственная задача пиксельного шейдера — вычислить цвет одиночного пиксела на основе исходных значений, полученных от вершинного шейдера (координаты текстур) и заданных параметров освещения. Выполнение программируемых пиксельных операций является завершающей стадией 3D-конвейера, после которой данные поступают в буфер кадра и на экран.
До появления пиксельных шейдеров цвет пиксела мог вычисляться на основе только двух текстур, причём оба текстурных модуля не были связаны между собой. Примером реализации такой технологии служит механизм Shader Rasterizer графического чипсета GeForce2.
В чипсете GeForce3 впервые реализован механизм программируемого текстурного блока, способный оперировать с четырьмя текстурами по командам пиксельного шейдера длиной до 12 инструкций. В чипсете Radeon 8500 можно использовать шейдеры длиной до 22 инструкций, а оперировать шестью текстурами.
В целом аппаратные ресурсы, выделяемые для пиксельных шейдеров, весьма ограничены: два временных, восемь постоянных, четыре текстурных (в версии Pixel Shaders 1.4 — шесть) и два цветовых регистра. То есть программирование посредством пиксельных шейдеров по сути дела сводится к различным комбинациям значений текстурных регистров. Такой подход рационален с точки зрения производительности графической подсистемы.
Например, в разрешении 1600x1200 точек в 32-битной цветовой палитре необходимо выводить в буфер кадра 7,32 Мбайт данных с частотой, по меньшей мере, 30 раз в секунду (поток 220 Мбайт/с). При обработке 4-6 текстур (размером до 4096x4096 точек!) это очень ресурсоемкая задача. Технология пиксельных шейдеров позволяет успешно решать проблему смешивания нескольких текстур, в том числе карт отражения, карт теней (освещения), объёмных текстур и прочих. Только с появлением пиксельных шейдеров в играх появились текстуры, реалистично имитирующие воду и облака.
Адаптивное текстурирование
Самым простым способом текстурирования является создание единственной текстуры среднего размера и наложение её на полигоны объекта во всех случаях, когда требуется визуализация. Однако здесь возникают некоторые проблемы. Во-первых, если текстура создана с высоким значением разрешения в полной цветовой палитре (например, 4096x4096 пикселов при глубине цветового охвата 32 бит), то расход вычислительных ресурсов и памяти при наложении текстур на все объекты будет просто фантастическим — никакой ускоритель не справится с таким потоком данных.
Во-вторых, если уменьшить размер (и тем самым детализацию) текстур, то объекты по мере приближения к плоскости проекции будут выглядеть всё более грубо. В некоторых играх нередки эффекты, когда при максимальном приближении поверхность объекта предстает как набор огромных пятен — это означает, что на картинную плоскость попало всего несколько текселов (ТЕКстурных пикСЕЛОВ). То же самое касается и эффекта перспективы — одна и та же текстура, будучи наложена на близкий и удаленный участки объекта, вызывает искажение перспективы.
Чтобы обойти такие проблемы, была разработана технология, получившая название MIP-mapping (МIP-текстурирование). Ее суть заключается в предварительном или динамическом создании набора текстур с различным разрешением и уровнем детализации на основе базовой текстуры максимального разрешения. Цвет каждого тексела текстуры с более низкой детализацией выбирается путем аппроксимации цвета четырёх ближайших текселов текстуры предыдущего (более высокого) уровня детализации. При построении трёхмерной сцены определяется удаленность полигона от картинной плоскости и в соответствии с этим значением накладывается текстура с заданным разрешением.
Для выбора конкретного уровня детализации сегодня используют в основном динамический расчет LOD. Например, если проецирование текстуры вызывает наложение одного тексела на пиксел, то уровень LOD определяется как нулевой и выбирается текстура с наивысшей детализацией. Если на пиксел пришлось 4 тексела, уровень LOD составляет 1, поэтому выбирается следующий уровень М1Р-mapping, которому соответствует текстура с меньшей детализацией. Расчёт уровня LOD обычно ведут для каждого тексела.
Как известно, текстуры могут храниться в специально отведённой для них области видеопамяти и подгружаться динамически. Технология MIP-mapping позволяет снизить нагрузку на шину памяти, так как одни объекты удалены от плоскости проекции, другие приближены, в среднем объем загружаемых текстур существенно меньше, чем потребовалось бы при решении проблемы «в лоб».
Фильтрация текстур
Очевидно, что цвет пиксела проекции трёхмерного объекта на экране должен однозначно определяться цветом тексела соответствующей текстуры. Однако это правило действует только в простых случаях, при углах проецирования, близких к нормали, и соответствующем удалении от картинной плоскости. Ведь как пиксел, так и тексел только в математическом смысле именуются точками. Физически они выглядят как окружности, диаметр которых зависит от разрешения экрана монитора или размера текстуры. Как только угол проецирования выходит за определённые рамки, случается, что на один пиксел проецируется более одного тексела, так как проекция становится овальной. Если же объект близок к плоскости проецирования, может случиться обратная коллизия — один тексел будет проецироваться на несколько пикселов. Для вычисления правильного цвета пикселов используют различные методы фильтрации текстур.
Билинейная фильтрация
Для улучшения отображения текстур используют билинейную фильтрацию. В этом случае считается, что проекция представляет собой круг, а цвет пиксела рассчитывается путем аппроксимации цветов четырёх текселов, как бы образующих данный круг. При сильном приближении объекта к плоскости проецирования случается, что в круг попадает меньше четырёх текселей, тогда изображение выглядит чрезмерно размытым. Если же плоскость полигона повернута относительно плоскости проецирования, круг уже не соответствует реальной форме проекции (овалу, эллипсу или иной фигуре) и эффект перспективы хотя и присутствует (всё-таки сказывается аппроксимация по четырём точкам), но все равно существенно искажён. Для определения цвета одного пиксела требуется считывать цвета четырёх текселов, что увеличивает нагрузку на шину памяти. Поэтому билинейную фильтрацию сейчас применяют редко.
Трилинейная фильтрация
Для повышения качества отображения объектов, имеющих перспективу по глубине, разработана технология трилинейной фильтрации. По сути, она представляет собой комбинацию технологий MIP-mapping и билинейной фильтрации. Как известно, в MIP-mapping применяют текстуры с разной степенью детализации (и разным разрешением) в зависимости от удаленности полигона от плоскости проецирования. При трилинейной фильтрации берутся две соседние текстуры, одна из которых содержит текселы, попадающие в проекцию, а другая является ближайшей к ней по удаленности, и к каждой применяют билинейную фильтрацию.
В итоге аппроксимация цвета пиксела проводится уже по восьми текселам и результат выглядит более близким к реальности, так как текстуры для определённых расстояний обсчитаны заранее. Однако и к пропускной способности памяти требования в восемь раз выше, чем, при поточечной фильтрации.
Анизотропная фильтрация на сегодняшний день считается одной из лучших технологий отображения текстур. Существуют различные алгоритмы анизотропной фильтрации, суть которых — в возможна более точном учёте формы проекции при различном положении текстурированного полигона по отношению к проецируемой плоскости. Вокруг центра проекции строится виртуальный куб из наложенных друг на друга текселов текстур разного уровня детализации, которые теоретически пересекает проекция. В зависимости от размера грани куба может быть обсчитано от 8 до 32 текселов для определения цвета единственного пиксела. При анизотропной фильтрации велики требования к эффективности графического процессора.
Морфинг уровня детализации (LOD morphing)
Композитные текстуры
Текстуры высокого разрешения занимают в памяти много места. Учитывая широкое распространение программ с глубиной цветности 32 бит (текстура 2048x2048, 32 бит, занимает 16 Мбайт!), становится понятным, что никакой видеопамяти, при сложности сцены хотя бы в 10 000 полигонов, не хватит. Придется «подкачивать» текстуры из оперативной памяти, что сильно нагружает шину AGP. Технологии MIP-mapping и анизотропной фильтрации сами по себе также весьма требовательны к ресурсам.
Для решения этой проблемы была придумана технология так называемых композитных текстур, или текстур с детализацией. При таком подходе требуется создать всего две текстуры: базовую и детальную. Базовая текстура содержит основные элементы и как бы создает общий фон. Детальная текстура содержит лишь мелкие элементы, необходимые при рассмотрении объекта вблизи. Обе текстуры смешиваются, причем степень их взаимовлияния определяется исходя из расстояния до плоскости проецирования. В результате на большом расстоянии видна только базовая текстура, а по мере приближения объекта к картинной плоскости начинает проявляться детальная текстура.
Для построения композитных текстур был придуман пошаговый метод. Он основан на механизме МIР-mapping и мультитекстурировании. С помощью механизма LOD определяется уровень МIР-каскада для выборки соответствующей детальной структуры (напомним, что базовая текстура остается неизменной). Затем детальная структура накладывается на базовую, и результат отправляется в буфер кадра. Очевидно, что при такой методике уровень детализации меняется дискретно, скачками.
Смешение с помощью альфа-канала позволяет организовать динамическое изменение уровня детализации. Реализовать этот алгоритм достаточно просто, построив функцию зависимости степени прозрачности детальной текстуры от уровня LOD и направления движения объекта (к картинной плоскости или в глубину).
Объёмные текстуры. Элемент трёхмерной текстуры представляет собой виртуальный монолитный куб. Конечно, на самом деле трёхмерный объект в компьютерной графике состоит из конечного числа точек (текселов), и потому его удобно представлять как конечный набор слоёв (плоских текстур), текселы которых образуют узловые точки трёхмерной текстуры. Каждая точка внутри текстурного куба имеет присвоенный ей цвет.
Полигону, на который накладывается трёхмерная текстура, присваиваются такие локальные координаты вершин, чтобы он оказался сечением куба. При этом не обязательно, чтобы полигон целиком помещался в объём куба. Обычно точке полигона вне куба присваивается цвет ближайшей граничной точки трёхмерной текстуры.
Так как полигон может занять по отношению к кубу любое положение, лишь бы выполнялось сечение, возможны варианты, когда нельзя однозначно соотнести точку на полигоне и тексел трёхмерной текстуры. В этом случае применяют либо прямое присваивание цвета ближайшей узловой точки, либо трилинейную фильтрацию, то есть линейную аппроксимацию по восьми ближайшим узловым точкам.
Технология трёхмерного текстурирования позволяет применять для имитации освещения единственную текстуру, тогда как традиционный метод предусматривает генерацию уникальной карты освещённости для каждого полигона. Затраты вычислительных ресурсов при трёхмерном текстурировании примерно совпадают с таковыми для технологии трилинейной фильтрации.
Важным свойством трёхмерных текстур является способность реалистично имитировать материалы с характерной внутренней структурой. Например, для моделирования деревянной конструкции достаточно создать её полигональную модель, затем разработать трёхмерную текстуру, имитирующую фактуру дерева, и присвоить её полигонам. Заботиться о рисовании текстур для каждого полигона и о «сшивании» их на границах уже нет необходимости.
Помимо этого трёхмерные текстуры позволяют реалистично имитировать спецэффекты, природные явления и даже движение объектов. На самом деле, если полигон поместить последовательно, с заданным сдвигом, в трёхмерную текстуру и так же последовательно его отображать, меняя только одну координату, получится эффект анимации.
Подобным образом можно имитировать огонь, блики на поверхности воды и металлов, множество других эффектов. Правдоподобная имитация дыма, взрывов, локального тумана осуществляется достаточно простыми способами, по сравнению с ресурсоёмкой технологией систем частиц, применяемой в профессиональных 3D-программах.
Сжатие текстур
Повышение разрешения текстур до 4096x4096 точек при 32-битном цветовом охвате вызвало существенное возрастание требований к объёмам памяти, выделяемой для хранения текстурных карт. Ведь на основе базовой текстуры согласно многим методикам генерируются другие уровни текстурных карт. Кроме того, часто применяют и прочие карты: освещённости, рельефа, окружающей среды и т. д. Очевидно, что хранить гигантский объём данных в обычном виде становится нерациональным.
Разработчики чипсетов для видеоадаптеров с давних пор пытаются приспособить различные методы сжатия данных для текстурных карт. Здесь существенны два требования: сжатие практически без потери качества и обработка данных «на лету», в процессе преобразования и наложения текстур.
Первой по-настоящему общепризнанной технологией сжатия текстур стала S3TC (S3 Texture Compression). В зависимости от характера текстуры степень сжатия здесь достигает 6:1. Упаковка и распаковка текстур производится «на лету» и выполняется как программными, так и аппаратными средствами. Это обстоятельство привлекло фирму Microsoft, и она лицензировала новую технологию у фирмы S3, включив механизм сжатия текстур в библиотеку DirectX (технология получила обозначение DXTC).
Вскоре появились технологии сжатия, альтернативные S3TC. В первую очередь это технология FXT1 от фирмы 3Dfx, объявленная открытой. Её преимущества заключаются в лучшем коэффициенте сжатия, достигающем 8:1, и меньшей потере качества при компрессии текстур. Поддержка технологии FXT1 реализована на аппаратном уровне в чипсете VSA-100. Другие производители также обеспечивают аппаратную поддержку FXT1, но в разной степени. Например, чипсет Savage 2000 может только распаковывать текстуры.
Несколько особняком стоит технология VTC (Volume Texture Compression) от фирмы nVIDIA. Она ориентирована исключительно на сжатие трёхмерных текстур. Известно, что 3D-текстуры являются самыми требовательными к объёму видеопамяти, однако взамен они обеспечивают великолепное качество изображения, близкое к фотореалистичному.
В ближайшем будущем на повестке дня встанет вопрос о сжатии геометрических данных. Самые сложные игровые приложения уже насчитывают в отдельных сценах около 50 000 полигонов. Чем ближе программы 3D-графики будут приближаться к рубежу 500 000 полигонов в сцене, тем острее будет проблема обмена огромными объёмами данных между геометрическим процессором и локальной памятью на видеокарте.
Рельефное текстурирование
Технология Bump mapping (наложение рельефа) призвана повысить реализм моделей путем применения помимо текстурной карты дополнительной карты высот (карты рельефа). Сами по себе обработанные по данной технологии текстуры остаются плоскими. Карта высот содержит лишь двухмерный массив данных, где максимальное значение числа означает наибольшую относительную высоту. В отличие от географических карт, где возможны отрицательные значения высот (так как за точку отсчета принят уровень моря), карта рельефа в компьютерной графике содержит только положительные числа.
Широко распространённым методом наложения карт рельефа является так называемое диффузное смешение (embossing — тиснение). Суть его заключается в следующем. Берётся карта высот, и на её основе строится инвертированная (обратная) копия. Далее карте рельефа присваиваются координаты (х, у) вершины полигона, на который накладываются текстуры. Из вершины на плоскость полигона строится единичный вектор, направленный на источник света. Затем он умножается на некоторое число, а итоговый вектор служит для смещения относительно карты рельефа координат инвертированной копии. Затем обе карты суммируются. Важным в данном методе является подбор числа, на которое умножается единичный вектор света, так как величина смещения инвертированной карты высот не должна приводить к нежелательным эффектам. При недостаточном смещении эффект наложения высот не заметен, при излишнем смещении изображение двоится и размывается.
Если к базовой текстурной карте попеременно применять разные карты высот или одну карту, но со смещением на каждом последующем шаге, то мы получим динамическую картину изменения освещённости объекта. Очевидно, что в этом случае термины «наложение рельефа» и «расчёт освещенности» по физическому смыслу являются синонимами.
Для реализации технологии наложения рельефа требуется обработать три текстурных карты: базовую, рельефа и инвертированную. Необходимо не только вычислить вектор света, но и нормализовать его к поверхности полигона. В итоге для полноценного преобразования требуется три прохода конвейера блока рендеринга. Если в видеокарте реализованы два конвейера, способные работать параллельно, потребуется два прохода.
Недостатком технологии наложения рельефа, помимо большого расхода вычислительных ресурсов, считается не слишком качественная по сегодняшним меркам итоговая сцена. Поэтому разработчики пошли дальше и предложили более совершенные методы, в частности наложение рельефа методом скалярного произведения.
Метод скалярного произведения основан на так называемой математической модели света. Она существенно отличается от физической модели. В математической модели освещённость с расстоянием не изменяется. Свет рассматривается как единичный вектор, направленный на источник. Вторым вектором выступает вектор камеры (точки обзора наблюдателя). Используется также вектор нормали, представляющий собой сумму векторов света и камеры, приведенную к единице.
С помощью указанных векторов вычисляются значения для диффузного (рассеянного) и зеркального (бликового) света. Методикой скалярного произведения предусмотрено использование так называемых «карт возмущённых нормалей». Для этого берется карта рельефа и рассчитывается значение нормали в каждой точке в локальной системе координат. Результат записывается как отдельная текстурная карта (функция «возмущения» нормали картой рельефа), которая накладывается путём скалярного произведения на базовую текстуру.
Для полноценной реализации данного метода требуется: рассчитать для каждой вершины полигона в локальной системе координат вектор единичного света и вектор нормали, поместить результат как исходную карту освещённости; рассчитать карту возмущенных нормалей; загрузить базовую текстуру; наложить все текстуры друг на друга методом скалярного произведения. Многие графические процессоры умеют выполнять такую операцию, что в итоге даёт высокое качество изображения при однопроходном текстурировании.
Карты окружающей среды
Environment Map Bump Mapping (карта окружающей среды, иногда её называют картой отражения) служит для отражения в объекте визуальных свойств окружающего пространства. Карты отражения либо создают заранее, во время разработки игры (обычно используют сферические карты среды), либо в ходе построения трёхмерной сцены (кубические карты среды).
Визуальные свойства карт окружающей среды можно сделать зависимыми от направления линии визирования (что соответствует правилам физической оптики). С целью ускорения обработки трёхмерной сцены разработчики иногда не предусматривают изменения карты среды в зависимости от направления линии визирования. Более качественным является метод создания кубических карт окружающей среды в ходе построения трёхмерной сцены. По сути дела, для этого необходимо предварительно выполнить рендеринг сцены относительно объекта, к которому применяется технология ЕМВМ. Затем попиксельное состояние окружения записывается в трёхмерную текстурную карту, которая и накладывается на объект. В результате можно добиться качественного изображения эффектов, практически невыполнимых другими способами.
Шестой этап: борьба с дефектами
Дефекты изображения, возникающие при рендеринге трёхмерной сцены могут носить самый различный характер. Обычно пространственные искажения выражаются в ступенчатости ровных краёв (так называемый «лестничный эффект»), потере мелких деталей изображения, появлении муара (регулярной структуры на изображении, не предусмотренной разработчиками), искажении текстур. Технологии устранения дефектов получили название anti-aliasing, у нас прижился термин сглаживание. Пространственные дефекты сглаживаются либо локальными, либо глобальными методами.
Локальные методы применяют к краям объектов, то есть текселы текстуры, являющиеся краевыми в полигоне, обрабатываются таким образом, чтобы исключить лестничный эффект. Глобальные методы применяют ко всей области картинной плоскости.
В современных 3D-ускорителях самой популярной является технология полноэкранного сглаживания дефектов сцены (FSAA — Full scene anti-aliasing), основанная на масштабировании изображения. То есть, рендеринг сцены выполняется с разрешением, превосходящим необходимое экранное разрешение, а затем изображение уменьшается, при этом каждый пиксел обрабатывается на основе маски, соответствующей коэффициенту масштабирования.
Например, при маске 2x2 и экранном разрешении 800x600 точек необходимо выполнить рендеринг сцены в разрешении 1600x1200. Затем каждому пикселу в реальном изображении будет присвоен цвет, получившийся в виртуальном разрешении в результате смешения цветов соседних пикселов маски 2x2.
Другой метод FSAA был впервые реализован в технологии Т-Buffer фирмы 3Dfx. Каждый пиксел на изображении делится на две части (субпиксела) — левый и правый. Один из процессоров VSA-100 при этом играет роль головного (ведущего), а другие — ведомых. Каждый процессор VSA-100 в собственном кадровом буфере производит обработку (рендеринг) полной сцены, но опираясь на свои (левый или правый) субпикселы. Таким образом осуществляется взаимное смещение обрабатываемых кадров. Сейчас метод разделения исходного пиксела на более мелкие составляющие (сэмплы) путем рендеринга в высоком разрешении получил название суперсэмплинг.
При использовании технологии мультисэмплинга сглаживание осуществляется лишь на границах объектов. Среди названий мультисэплинга, придуманных маркетинговыми отделами компаний, можно встретить, например, Quincunx AA (фирма nVIDIA) — технологию поддерживаемую чипсетами GeForce3 и старше. Конкурент (ATI, чипсет Radeon 8500) использует собственный метод Smooth Vision.
Имитация движения
Для борьбы с непреднамеренными эффектами анимации используют технологию Motion Blur, которая рассмотрена подробно, а также метод аппроксимации нескольких фаз движения объекта в одном кадре итогового рендеринга сцены.
Проведите такой эксперимент — на улице резко поверните голову от одного плеча к другому, стараясь не двигать глазами. Вы наверняка заметите, что зрительная картина приобретает некоторую «смазанность», направление которой зависит от направления перемещения взгляда. Такой же эффект возникает, если смотреть из окна быстро движущегося поезда или автомобиля на близко расположенные объекты, которые иногда сливаются в одну полосу.
Причем описанный зрительный эффект имеет место не только при фланговой линии визирования — точно так же в движении на большой скорости происходит размытие изображения при фронтальном наблюдении. Этот эффект широко используется в художественной фотографии, видеопродукции и компьютерной графике. В англоязычной литературе он получил название Motion Blur. Достаточно сказать, что одноименный фильтр имеется даже в программе обработки двухмерных изображений Adobe Photoshop.
Разработчики игр и мультимедийных продуктов давно поняли, что эффект Motion Blur способен значительно повысить восприятие, «ощущение» движения в трёхмерных сценах. Однако лишь сравнительно недавно возможности аппаратуры позволили в полной мере применять в современных продуктах эффект размывания изображения в движении.
Технология Motion Blur, применяемая в настоящее время, достаточно проста, но требует значительных вычислительных ресурсов. Суть её заключается в создании избыточных данных и их приведении к нормальному значению. То есть, сначала создаётся избыточное количество кадров для анимационной последовательности, обычно кратное целому коэффициенту (например, восемь). Затем последовательность кадров делится на группы, включающие число кадров, равное принятому коэффициенту. Внутри группы все кадры смешиваются, и обсчитывается результирующий кадр. Из результирующих кадров составляется итоговая анимация.
Так как результирующие кадры, по сути, содержат несколько фаз движения, изображение получается размытым, со смещением границ в сторону, противоположную направлению движения. Чем больше принятый коэффициент Motion Blur, тем дальше отодвигается граница размытости изображения. В принципе, коэффициент должен быть прямо пропорционален скорости перемещения камеры.
Вокселы и тайлы
Хотя полигональные модели могут использовать трёхмерные текстуры, внешне похожие на воксельные объекты, на самом деле полигональная и воксельная технологии в корне различны. Вокселом (от Voxel, Volume pixel — объёмный пиксел) называют монолитный элементарный объект кубической формы, имеющий одинаковую окраску всех плоскостей. Трёхмерная модель конструируется из набора вокселов практически так же, как дети строят свои игрушки из кубиков.
В воксельной технологии отпадает необходимость текстурирования готовых моделей, так как каждый воксел одновременно представляет собой элемент текстуры. Очевидно, что минимальный по размерам воксел должен содержать число пикселов, совпадающее с числом плоскостей куба — шесть. Однако настолько мелкие элементы используют редко, ведь преимущество воксельной технологии заключается, прежде всего, в меньшей требовательности к компьютерным ресурсам, и потому разработчики ищут компромисс между размером вокселов и качеством картинки.
Сама отрисовка (рендеринг) воксельного объекта происходит по иной методике, нежели при текстурировании полигональной модели. Воксельному кубу в объекте в каждый момент времени соответствует куб с локальными координатами в пространстве сцены. Вокселы сортируются по удаленности от плоскости проекции (картинной плоскости) для определения степени видимости и последовательно на неё проецируются. В зависимости от удалённости воксела от плоскости проекции будут различаться и размеры самой проекции вокселов. Применение воксельной технологии позволяет отказаться от многих стадий 3D-конвейера. Очевидно, что существенно экономится память, а скорость обсчёта сцен возрастает. Однако воксельная технология обладает и врождёнными, трудноустранимыми недостатками, препятствующими её распространению.
Тайлами называют участки (как правило, одинаковые по размерам), на которые разбивается проекция трёхмерной сцены при рендеринге. Каждый такой участок сразу анализируется на предмет видимости объектов, и невидимые элементы из обработки исключаются. Графический чипсет (например, Куго фирмы STM), поддерживающий тайловую технологию, должен иметь специфическую архитектуру, поскольку 3D-конвейер в нём поставлен «с ног на голову»: сначала идёт сортировка по глубине, а затем все остальные стадии. Кстати, в подавляющей части игр сцена выводится «как есть», без сортировки объектов по глубине. Поэтому в реальных приложениях более простой и дешёвый тайловый чипсет мало уступает в скорости «богатым» собратьям.
Wikimedia Foundation. 2010.