Понятие конвейеров ввода и вывода графической информации

 

Множество графических приложений следуют довольно стандартной схеме построения трехмерных изображений (далее мы будем называть этот процесс конвейером). Причем, некоторые программы реализуют все стадии этого конвейера, некоторые же перекладывают часть работы на плечи аппаратных устройств, специальных библиотек программ (API), другие программы или, даже, пользователя. Итак, конвейер состоит из следующих стадий (Рис. 9.3):

1. Определение состояния объектов (Situation modeling) – эта часть программы не имеет прямого отношения к компьютерной графике, она моделирует тот мир, который будет отображаться в дальнейшем.

2. Определение соответствующих текущему состоянию геометрических моделей (Geometry generation) – эта часть конвейера создает геометрическое представление текущего момента нашего маленького "виртуального мира".

3. Разбиение геометрических моделей на примитивы (Tesselation) – эта первая действительно зависимая от "железа" стадия. На ней создается внешний вид объектов в виде набора определенных примитивов, разумеется, на основе информации из предыдущего шага конвейера. Наиболее распространенным примитивом в наше время является треугольник, и большинство современных программ и ускорителей работают именно с треугольниками. Не буду вдаваться в математические подробности, но на треугольники всегда можно разбить любой плоский многоугольник и именно тремя точками можно однозначно задать плоскость в пространстве.

 

 

Рис. 9.3 – Конвейер 3D визуализации.

 

4. Привязка текстур и освещения (Texture and light definition) – на этой стадии определяется, как будут освещены геометрические примитивы (треугольники), а также какие и как на них в дальнейшем будут наложены текстуры. Под текстурами понимаются изображения, передающие внешний вид материала объекта т.е. негеометрическую визуальную информацию. Хороший пример текстуры – песок на абсолютно ровном пляже. Как правило, на этой стадии информация вычисляется только для вершин примитива.

5. Видовые геометрические преобразования (Projection) – здесь определяются новые координаты для всех вершин примитивов, исходя из положения наблюдателя и направления его взгляда. Сцена как бы проектируется на поверхность монитора, превращаясь в двухмерную, хотя информация о расстоянии от наблюдателя до вершин сохраняется для последующей обработки.

6. Отбрасывание невидимых примитивов (Culling) – на этой стадии из списка примитивов исключаются полностью невидимые (оставшиеся позади или сбоку от зоны видимости).

7. Установка примитивов (Setup) – здесь информация о примитивах (координаты вершин, наложение текстур, освещение и т.д.) преобразуется в вид пригодный для последующей стадии. (Например: координаты точек буфера экрана или текстур в целые числа фиксированного размера, с которыми работает аппаратура).

8. Закраска примитивов (Fill) – на этой стадии собственно и происходит построение в буфере кадра (памяти отведенной под результирующие изображение) картинки, на основе информации о примитивах, сформированной предыдущей стадией конвейера, и прочих данных. Таких, как текстуры, таблицы тумана и прозрачности и пр. Как правило, на этой стадии для каждой точки закрашиваемого примитива определяется ее видимость, например с помощью буфера глубин (Z-буфера) и, если она не заслонена более близкой к наблюдателю точкой (другого примитива), вычисляется ее цвет. Цвет определяется на основе информации об освещении и наложении текстур, определенной ранее для вершин этого примитива. Большинство характеристик ускорителя, которые можно почерпнуть из его описания относятся именно к этой стадии, так как в основном именно эту стадию конвейера ускоряют аппаратно (в случае недорогих и доступных плат).

9. Финальная обработка (Post processing) – обработка всей результирующей картинки, как единого целого, какими-либо двумерными эффектами.

Теперь попробуем разобраться, как все обстоит на самом деле. Во-первых, некоторые стадии этого конвейера могут быть переставлены местами, разбиты на части или совмещены. Во-вторых, они могут отсутствовать вообще (редко) или могут появится новые (часто). И, в-третьих, результат работы каждой из них может быть послан (в обход других стадий) обратно. Например, картинку, полученную на последней стадии, можно использовать как новую текстуру для 8-ой стадии, реализуя таким образом эффект отражающих поверхностей (зеркал), таких как мраморный пол в игре Unreal.