Большинство реализаций OpenGL имеют сходный порядок операций или этапов обработки, называемый конвейером визуализации OpenGL (OpenGL rendering pipeline). Этот порядок показан на рисунке 1-2 и, хотя он не является жестким правилом для всех реализаций, тем не менее, дает представление о том, что делает OpenGL.
Диаграмма демонстрирует конвейер (в духе сборочных линий Генри Форда), который используется OpenGL для обработки данных. Геометрические данные (вершины, линии и полигоны) проходят путь, включающий оценку и повершинные операции, в то время как пиксельные данные (пиксели, изображения и битовые карты) в части общего процесса обрабатываются иначе. Оба типа данных проходят через одинаковые финальные шаги (растеризация и операции над фрагментами) до того, как результирующие пиксельные данные записываются в буфер кадра.
Рисунок 1.2. Порядок операций
Теперь более детально рассмотрим ключевые этапы конвейера визуализации OpenGL.
1.5.1 Списки
Все данные, геометрические или пиксельные могут быть сохранены в списках (display lists) для текущего или последующего использования. (Альтернативой занесению данных в списки является их немедленная обработка, известная как непосредственный режим.) Когда исполняется список, сохраненные в нем данные обрабатываются также, как если бы они поступали в непосредственном режиме.
1.5.2 Вычислители
Все геометрические примитивы описываются своими вершинами. Параметрические кривые и поверхности могут быть изначально описаны с помощью контрольных точек и полиномиальных функций, называемых базисными функциями. Вычислители предоставляют метод для определения реальных вершин, представляющих поверхность, по ее контрольным точкам. Этот метод – полиномиальная аппроксимация, он позволяет получить нормаль поверхности, координаты текстуры, цвета и значения координат в пространстве.
1.5.3 Повершинные операции
Для геометрических данных следующим этапом является выполнение повершинных операций (per-vertex operations). В течение этого этапа вершины преобразуются в примитивы. Некоторые типы вершинных данных трансформируются матрицами чисел с плавающей точкой размерности 4х4. Пространственные координаты проецируются с позиции в 3D мире в позицию на вашем экране.
Если активизированы дополнительные возможности библиотеки OpenGL, то этот этап становится еще более сложным. Если используется текстурирование, координаты текстуры могут быть сгенерированы и изменены на этом шаге. Если используется освещение, вычисления, связанные с ним, производятся с использованием трансформированных вершин, нормалей поверхностей, позиций источников света, свойств материала, а также другой информации, позволяющей вычислить цветовую величину.
1.5.4 Сборка примитивов
Отсечение – большая часть сборки примитивов – это уничтожение частей геометрии, выпадающих за полупространство, определенное плоскостью. Отсечение точек просто отвергает или не отвергает вершину; отсечение линий или полигонов может добавить дополнительные вершины в зависимости от ситуации (того, как именно линия или полигон отсекаются).
В любом случае, после этого процесса производится перспективное разделение, которое заставляет более дальние объекты выглядеть меньше, чем ближние. Затем выполняются операции с портом просмотра (viewport) и глубиной (координатой z). Если включено распознавание лицевых граней, и примитив является полигоном, то на этом шаге грань может быть отвергнута в зависимости от теста на лицевые грани. В зависимости от режима рисования полигонов, они могут быть нарисованы в виде точек или линий.
Результатом этого этапа являются завершенные примитивы, то есть трансформированные и отсеченные вершины со связанными цветом, глубиной и, иногда, координатами текстуры.
В то время как геометрические данные движутся по конвейеру своим путем, пиксельные данные двигаются иным маршрутом. Первым делом массивы данных из системной памяти распаковываются, то есть преобразуются из какого-либо формата, в формат с необходимым числом компонент. Далее данные масштабируются, базируются и обрабатываются пиксельными картами. Результат сжимается и записывается в текстурную память или отправляется на этап растеризации.
Если пиксельные данные читаются из буфера кадра, над ними выполняются пиксельные операции (pixel-transfer operations). Затем результаты упаковываются в соответствующий формат и возвращаются в массив в системной памяти.
Существуют специальные операции копирования пикселей (pixel copy operations) для копирования данных из одной части буфера кадра в другие или из буфера кадра в текстурную память.
1.5.6 Наложение текстуры
Приложения OpenGL могут накладывать текстурные изображения на геометрические объекты, чтобы заставить их выглядеть более реалистично. Если используется несколько изображений текстур, разумно поместить их в объекты текстуры, чтобы можно было легко переключаться между ними.
Некоторые реализации OpenGL могут иметь дополнительные ресурсы для ускорения операций с текстурами. Например, может существовать специализированная быстрая текстурная память. Если такая память присутствует, текстурным объектам могут быть назначены приоритеты, чтобы управлять использованием этого ограниченного и весьма ценного ресурса.
1.5.7 Растеризация
Растеризация – это процесс преобразования геометрических и пиксельных данных во фрагменты. Каждый фрагмент соответствует пикселю в буфере кадра. Шаблоны линий и полигонов, толщина линии, размер точек, модель заливки, вычисления связанные с наложением для поддержки сглаживания принимаются в расчет при развертке двух вершин в линию или вычислении внутренних пикселей полигона. Каждый фрагмент имеет ассоциированные с ним значения цвета и глубины.
1.5.8 Операции над фрагментами
До того, как величины будут сохранены в буфере кадра, над ними производится серия операций, которые могут изменить или даже выбросить некоторые фрагменты. Все эти операции могут быть включены или выключены.
Первая операция, которая может быть произведена – это текстурирование, когда из текстурной памяти для каждого фрагмента генерируется и накладывается на него тексел (элемент текстуры). Также могут производиться (в порядке выполнения) вычисления тумана, тест отреза (scissor test), альфа-тест, тест трафарета (stencil test) и тест буфера глубины (для удаления невидимых поверхностей). Если фрагмент не проходит один из включенных тестов, это может закончить его путь по конвейеру. Далее могут быть произведены наложение, смешивание цветов (dithering), логические операции и маскирование с помощью битовой маски. Наконец, фрагмент заносится в соответствующий буфер, где становится пикселем.
Достарыңызбен бөлісу: |