Графический конвейер.
Графический конвейер (Graphic Pipeline) — это некоторое программно-аппаратное средство, которое преобразует описание объектов в «мире» приложения в матрицу ячеек видеопамяти растрового дисплея. Его задача — создать иллюзию трехмерного изображения.
В глобальных координатах приложение создает объекты, состоящие из трехмерных примитивов. В этом же пространстве располагаются источники освещения, а также определяется точка зрения и направление взгляда наблюдателя. Естественно, что наблюдателю видна только часть объектов: любое тело имеет как видимую (обращенную к наблюдателю), так и невидимую (обратную) сторону. Кроме того, тела могут перекрывать друг друга, полностью или частично.
1. Первая стадия графического конвейера - трансформация (Transformation).
На первой стадии графического конвейера, называемой трансформацией (Transformation) обрабатывается взаимное расположение объектов относительно друг друга и их видимость зафиксированным наблюдателем.
На этой стадии выполняются вращения, перемещения и масштабирование объектов, а затем и преобразование из глобального пространства в пространство наблюдения (world-to-viewspace transform), а из него и преобразование в «окно» наблюдения (viewspace-to-windowtransform), включая и проецирование с учетом перспективы.
Попутно с преобразованием из глобального пространства в пространство наблюдения (до него или после) выполняется удаление невидимых поверхностей, что значительно сокращает объем информации, участвующей в дальнейшей обработке.
2. Вторая стадия графического конвейера - освещенность (Lighting).
На следующей стадии конвейера (Lighting) определяется освещенность(и цвет) каждой точки проекции объектов, обусловленной установленными источниками освещения и свойствами поверхностей объектов.
3. Третья стадия графического конвейера - растеризации(Rasterization).
На стадии растеризации(Rasterization) формируется растровый образ в видеопамяти. На этой стадии на изображения поверхностей наносятся текстуры и выполняется интерполяция интенсивности цвета точек, улучшающая восприятие сформированного изображения.
Весь процесс создания растрового изображения трехмерных объектов называется рендерингом(rendering).
Движение.
Чтобы трехмерное изображение «оживить» движением, изображения объектов в новом положении должны сходить с графического конвейера со скоростью хотя бы 15 кадров в секунду (современные акселераторы могут строить и 100 кадров в секунду). Это колоссальное ускорение построений обеспечивается применением в графических картах встроенного специализированного процессора, решающего значительную часть задач графического конвейера.
Графическое приложение создает модель, в которой объекты задаются как совокупность тел и поверхностей. Тела могут иметь разнообразную форму, описанную каким-либо математическим способом. Проще всего иметь дело с многогранниками, у которых каждая грань представляет собой часть плоскости, ограниченной многоугольником (полигоном). Описание такого тела относительно несложно — оно состоит из упорядоченного списка вершин.
Тесселяция(Tesselation).
Сложнее дело обстоит с объектами, имеющими не плоские (криволинейные) поверхности. В этом случае в модели поверхности описываются сложными нелинейными уравнениями, однако для дальнейших построений их использование из-за громадных объемов вычислений проблематично. Для упрощения задачи криволинейные поверхности аппроксимируются многоугольниками, и, конечно же, чем мельче многоугольники, тем ближе аппроксимация к модели, но и тем более громоздким становится описание объекта, а следовательно, и больше времени требуется на его обработку.
Представление криволинейной поверхности совокупностью плоских граней-многоугольников называется тесселяцией(Tesselation). Многоугольники-грани должны быть простыми (не пересекающими себя на манер цифры 8), плоскими и выпуклыми — эти ограничения заметно упрощают их дальнейшую обработку.
Оптические свойства.
Кроме формы объектов (описания их поверхностей), важное значение имеют их оптические свойства. Проще всего дело обстоит с непрозрачными объектами — все другие объекты, перекрытые ими для взгляда наблюдателя, просто невидимы. Эти объекты будут перекрывать и лучи от источников освещения, установленных в модели, на пути которых они встречаются.
Сложнее дело обстоит с прозрачными и просвечиваемыми объектами. Прозрачность (transparency) объекта позволяет видеть и объекты, расположенные за ним, а просвечиваемость (trans-lucency) позволяет проходить через него лучам света от источников.
Поверхность имеет некоторый цвет,а также характеризуется степенью отражения(она может быть глянцевой или матовой). Для того чтобы получить реалистичное отображение модели, приходится отслеживать прохождение лучей от установленных источников освещения, достигающих глаза воображаемого наблюдателя как при отражении от поверхностей, так и при преломлении при прохождении через прозрачные и просвечиваемые объекты. При этом должны учитываться эффекты перспективы, как оптической (искажение формы), так и атмосферной (имитация дымки или тумана).
Рендеринг.
Весь процесс создания растрового изображения трехмерных объектов называется рендерингом.
Технологии создания трехмерных изображений очень сложны и многообразны, обсудим некоторые ее основные моменты и поясним связанные с ними термины.
Вполне понятно, что рендеринг модели может производиться только поэлементно. Результатом
тесселяции является набор многоугольников (обычно четырехугольников или треугольников, с которыми манипулировать проще), аппроксимирующих поверхности объектов. Плоское растровое представление должно формироваться с учетом взаимного расположения элементов (их поверхностей) — те из них, что ближе к наблюдателю, естественно, будут перекрывать изображение более удаленных элементов. Многоугольники, оставшиеся после удаления невидимых поверхностей, сортируются по глубине: реалистичную картину удобнее получать, начиная обработку с наиболее удаленных элементов.
Z-буфер.
Для учета взаимного расположения применяют так называемыйZ-буфер, названный по имени координаты третьего измерения (X и Y — координаты в плоскости экрана).
Этот буфер представляет собой матрицу ячеек памяти, каждая из которых соответствует ячейке видеопамяти, хранящей цвет одного пиксела.
В процессе рендеринга для очередного элемента формируется его растровое изображение (bitmap) и для каждого пиксела этого фрагмента вычисляется параметр глубины Z (координатой его можно назвать лишь условно).
В видеопамять этот фрагмент поступает с учетом результата попиксельного сравнения информации из Z-буфера, с его собственными значениями:
- если глубина Z данного пиксела фрагментаоказываетсяменьше величины Z той ячейки видеопамяти, куда должен попасть этот фрагмент, это означает, что выводимый элемент оказался ближе к наблюдателю, чем ранее обработанные, отображение которых уже находится в видеопамяти. В этом случае выполняется модификация пиксела видеопамяти, а в ячейку Z-буфера видеопамяти помещается новая величина, взятая от данного фрагмента (что подразумевается под модификацией, см. далее в разделе альфа-блендинг);
- если же результат сравнения иной, то текущий пиксел фрагмента оказывается перекрытым прежде сформированными элементами, и его параметр глубины в Z-буфер не попадет. Однако цвет пиксела видеопамяти, возможно, все равно придется модифицировать: ведь перекрывающий элемент может оказаться прозрачным.
Итак, Z-буфер позволяет определить взаимное расположение текущего и ранее сформированного пиксела, которое учитывается при формировании нового значения пиксела в видеопамяти.
От разрядности Z-буфера зависит разрешающая способность графического конвейера по глубине. При малой разрядности (например, 8 бит) для близко расположенных элементов рассчитанные значения Z могут совпасть, в результате картина перекрытий исказится. Большая разрядность буфера требует большого объема памяти, доступного графическому процессору. По нынешним меркам минимальная разрядность Z-буфера — 16 бит, профессиональные графические системы используют 32-битный Z-буфер.
Aльфа-блендинг (Alpha-blending).
Теперь обсудим модификацию цвета пиксела видеопамяти. В общем случае у нас есть два значения цвета — С1 для того образа, который «ближе», С2 для того, что «дальше» (по Z-параметру). Результирующий цвет определяется обоими значениями и свойством «прозрачности» ближнего.
Для получения нового значения цвета обычно используют так называемый альфа-блендинг (Alpha-blending). Мерой прозрачности объекта является коэффициент а (0 < а < 1),
а =1 (единице) соответствует полной непрозрачности.
Результирующий цвет пиксела вычисляется по формуле С = С1 х а + С2 х (1 - а), причем за этой формулой стоит в три раза больше операций, поскольку цвет определяется тремя значениями базисных цветов (R, G и В).
Ну и нетрудно догадаться, что для реализации данного метода требуется и свой альфа-буфер с количеством ячеек, по меньшей мере равным числу пикселов на экране.
Часто 8-битный коэффициент прозрачности для каждого пиксела хранят прямо в видеопамяти: при 24-битном кодировании цвета от двойного слова (32 бит), выделяемого на пиксел для упрощения адресации и ускорения обмена, как раз остается 8 бит. Такой формат видеопамяти называют RGBA.
Текстура.
Объекты, входящие в модель и представляющие их элементы (тессели), не обязательно однородны по цвету: на их поверхности могут быть наложены текстуры — растровые картинки, исходно плоские, но как бы к ним приклеенные. Текстура состоит из элементов, называемых текселами (Texel — Texture Element). Здесь уместна аналогия с созвучным термином пиксел (Picture Element), который относится к элементу изображения на экране и его образу в видеопамяти.
Текстуры (в виде матриц текселов) хранятся в памяти. Для каждого многоугольника -частицы отображаемой поверхности вычисляется соответствующий ему участок текстуры — тоже многоугольник.
Далее этот участок должен быть отображен в видеопамять — текселы должны быть отображены в пикселы.
Что должно происходить с рисунком текстуры при изменении положения плоскости, на которую она наносится, легко представить, повертев перед глазами спичечный коробок и наблюдая за этикеткой. Кроме искажения формы при поворотах учитываются и изменения размера картинки текстуры при приближении и удалении объекта от наблюдателя, а также перспектива.
Масштабирование и повороты текстур могут приводить к различным искажениям: к примеру, увеличенное и повернутое изображение гладкого горизонтального (или вертикального) отрезка превратится в грубую ступенчатую линию. Кроме того, могут появляться «рваные» края у текстур по линиям их сопряжения. Существуют способы улучшения качества представлением одной и той же текстуры в разном масштабе(MIPmap).
MIPmap (представление одной и той же текстуры в разном масштабе).
Для улучшения качества представления одной и той же текстуры в разном масштабе применяют так называемый MIPmap — набор нескольких версий одной и той же текстуры, выполненных с различным разрешением (обычно очередная версия имеет размер в четверть от предыдущей). При рендеринге выбирается та версия, у которой масштаб ближе к требуемому.
Дефекты, обусловленные растровым представлением текстуры (векторные изображения в отличие от растровых масштабируются и трансформируются без потери информации), могут быть устранены путем фильтрации — билинейной, или более сложной — трилинейной.
При билинейной фильтрации (Bilinear Filtering) цвет очередного пиксела, записываемого в видеопамять, определяется с учетом цветов прилегающих к нему четырёх соседних пикселов.
Трилинейная фильтрация (Trilinear Filtering) сложнее — здесь билинейная фильтрация выполняется дважды для двух соседних уровней MIPmap, ближайших к требуемому масштабу. Окончательный цвет пиксела определяется интерполяцией этих двух результатов.
Наложение текстур при всех хлопотах, связанных с его реализацией, позволяет упростить описание объектов и ускорить их рендеринг. Так, например, фасад кирпичного здания можно построить «по-честному», задав поверхности всех кирпичиков, оконных и дверных проемов и т. п. Но если это изображение нужно получить, например, в игре, где воображаемый наблюдатель должен приближаться и удаляться от стены, а также менять угол зрения достаточно быстро, то проще представить ее одной плоскостью с «нарисованными» кирпичами и прочими деталями (вспомним каморку папы Карло).
На одни и те же объекты часто накладывают несколько текстур — для имитации освещенности, теней, отражений, рельефа и т. д.
И, наконец, когда все объекты, расположенные на сцене, уже прорисованы, для большего эффекта объемности можно ввести эффект атмосферной перспективы — сильно удаленные объекты подернуть дымкой (туманом). Это несложно сделать, используя для попиксельного смешивания цветов тумана и объектов информацию о глубине из Z-буфера: чем больше Z, тем больше на результирующий цвет влияет туман и меньше цвет исходного пиксела.
В последнее время стали использовать и трехмерные текстуры (3D textures) — трехмерные массивы пикселов. Они позволяют, например, имитировать объемный туман, динамические источники света (языки пламени).