Конвейер визуализации OpenGL
Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







Конвейер визуализации OpenGL





 

В OpenGL используется так называемый конвейер визуализации, то есть последовательность обработки предоставляемых OpenGL вашей программой данных, которые преобразуются в конечную картинку. Диаграмма 1.2 показывает порядок функционирования конвейра визуализации, который используется в версии 4.3. Конвейр визуализации OpenGL сильно развился со времен изобретения.

----

Диаграмма 1.2

----

OpenGL отталкивается от геометрических данных, которые вы предоставляете (вершина графов и геометрические примитивы) и сначала обрабатывает их последовательность шейдреов: вершинный шейдер, мозаичный шейдеры (который состоит сам из двух шейдеров), и наконец, геометрический шейдер, перед тем как направить всё на растрезацию. Растрезация превратит все объекты в области отборки во фрагменты, и применит фрагментарный шейдер ко всем сгенерированным объектам.

Как видите, шейдеры занимают важнейшую роль при создании приложения на OpenGL. От вас полностью зависит, какие шейдеры будут использованы, и что каждый из них будет делать. Но не все стадии абсолютно необходимы. Фактически, обязательны только вершинный и фрагментарный шейдеры. Мозаичный и геометрический шейдеры - опциональны.

Теперь давайте углубимся в каждую стадию по отдельность, чтобы разъяснить для вас некоторые важные моменты. Мы понимаем, что для начала обучения это может быть слегка чересчур, но пожалуйста потерпите: в конце концов понимание ключевых моментов облегчит для вас работу с программой в дальнейшем.

 

Подготовка данных для отправки в OpenGL

После запуска буферов, мы можем запросить рендеринг геометрических примитивов с помощью вызова одной из команд отрисовки OpenGL, такой как glDrawArrays(), как мы сделали в Примере 1.1.



Отрисовка в OpenGL обычно обозначает переправку вершинных денных на сервер OpenGL. Представьте вершины графов как пакет данных обрабатываемый одновременно. И хотя в эти данные может входить что угодно (вы сами определяете, что задает вершины), почти всегда часть этих данных - о положении в пространстве. Дополнительно туда могут входить данные о конечном цвете пикселей.
Подробнее о команде отрисовке см. Главу 3 “Рисование в OpenGL”.

Вершинные шейдеры

Для каждой вершины графа, заданной командой отрисовки, будет вызван вершинный шейдер для обработки данных связанных с этой вершиной. Взависимости от того, задействованы ли какие-либо другие пред-растровые шейдеры, вершинные шейдеры могут быть довольно простыми, например, просто копирование и передача данных (так называемый, сквозной шейдер) на следующую стадию более сложному шейдеру, который обрабатывает большое количество различных данных с целью определить конечное положение вершины на экране. Часто эта стадия использует матрицы трансформации, о которых читайте в Главе 5. Определение цвета вершины с использованием вычисления освещения описывается в Главе 7. Так на этой стадии можно применить любое множество других техник.

Обычно любое приложение представляет из себя множество вершинных шейдеров, но одновременно работать могут не больше одного.

 

Мозаичные шейдеры

После того, как вершинный шейдер обработал данные вершин графов, мозаичный шейдер продолжит обработку этих данных, если его задействовать. Как мы сможем увидеть в Главе 9, мозаичные шейдеры используют пятна для описания формы объекта, что позволяет при мозаикирование создать из геометрических примитивов более сложные и приятные глазу модели. На стадии мозаичного шейдинга возможно применение фактически двух шейдеров для умножения количества пятен и генерирования конечной формы.

 

Геометрические шейдеры

Следующая стадия - геометрический шейдинг. Здесь можно применить шейдери индивидуально к каждому геометрическому примитиву, а также создать новые перед тем, как перевести изображение в растры. Эта стадия также необязательна, но представляет собой очень мощный инструмент для создания изображений, как мы сможем увидеть в Главе 10.

 

Примитивная сборка

Все предыдущие стадии оперируют вершинами, и информацией о том, как эти вершины собираются в геометрические примитивы, которые переносятся в OpenGL. Стадия примитивной сборки превращает вершины в в соответствующие примитивы, подготавливая их к отборке и растрированию.

 

Отборка

Периодически будет так получаться, что некоторые вершины будут выходить за пределы поля зрения - области, в которой вы можете рисовать, - тогда примитивы связанные с такой вершиной будут изменяться для того, чтобы не один из ех пикселей не был за пределами зрения. Это и есть так называемая “отборка” и это действие программа OpenGL выполняет автоматически.

 

Растрирование

Непосредственно после отборки, обработанные примитивы перерабатываются в растры, для создания фрагментов. Назовем фрагменты “кандидатами в пиксели”, так как у каждого пикселя есть место в кадровом буфере, а фрагменты могут не получить доступа изменению положения пиксиля. Обработка данных фрагментов происходит на последующих стадиях - фрагментарный шейдинг и пред-фрагментный процесс.

Фрагментарные шейдеры

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

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

 

По-фрагментные операции

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

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

Как вы видели в Диаграмме 1.2, есть также путь доступа для пиксельной информации. В целом, пиксельные данные поступают из файла изображения, хотя их также можно создать при визуализации OpenGL. Обычно пиксельная информация хранится в карте текстур для обрабокте при текстурном маппинге, что позволяет разным стадиям текстурирования обратиться к этим данным. Текстурный маппинг подробнее описан в Главе 6.

 

Это было короткое описание конвейера OpenGL, теперь разберем Пример 1.1 и перенаправим операции обратно в конвейер визуализации.









Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2018 zdamsam.ru Размещенные материалы защищены законодательством РФ.