Как фрагменты генерируются растеризатором в OpenGL

Привет, я читаю учебник по компьютерной графике, и я наткнулся на описание растеризации, и оно в основном говорит, что когда объект проецируется на экран, то происходит сканирование всех пикселей на окне / экране и решает, пиксель / фрагмент находится внутри треугольника и, следовательно, определяет, что пиксель / фрагмент находится внутри треугольника и следует за дальнейшей обработкой для пикселя / фрагмента, такой как окрашивание и т. д.

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

Теперь еще один вопрос, связанный с этим, у меня есть то, что я знаю, что изображение / экран / окно пикселей является изображением или двумерным массивом пикселей, также известным как линейный кадровый буфер, который является линейным

Так что мне интересно, если это так, как проецирование 3-х вершин треугольника определяет, какие пиксели покрыты в стороне от него?

Растеризатор сначала рисует края треугольника, а затем просматривает каждый пиксель или 2-мерный массив пикселей (также известный как кадровый буфер по умолчанию) и определяет, находятся ли точки между линиями с использованием какого-либо математического метода или происходит какой-то другой более простой процесс?

заранее спасибо за ответы на мои вопросы

0

Решение

и я знаю, что OpenGL, вероятно, имеет свои реализации этого процесса

OpenGL — это просто документ спецификации. То, что работает на компьютере, является Реализация OpenGL, большую часть времени как часть драйвера графического процессора. Фактическая рабочая нагрузка выполняется графическим процессором…

это также происходит с OpenGL после процесса «Сканирование-преобразование» вершин, которые я прочитал в руководстве по OpenGL

более вероятный не. На самом деле на прошлых выходных я присутствовал на мероприятии Khronos (группа, которая определяет OpenGL), организованном AMD, и один из инженеров AMD по GPU сетовал на то, что новички имеют в виду алгоритм scanline с OpenGL, Direct3D, Mantel, Vulkan и т.д. в то время как графические процессоры делают что-то совершенно другое.

2d массив пикселей, также известный как линейный кадровый буфер по умолчанию

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

Тем не менее, точная компоновка, используемая внутри, является деталью, понятной только инженерам графического процессора. Но тот факт, что память организована не линейно, а локализованно, также является одной из причин того, что традиционный алгоритм сканирования линий не используется графическими процессорами.

Так что мне интересно, если это так, как проецирование 3-х вершин треугольника определяет, какие пиксели покрыты в стороне от него?

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

3

Другие решения

Алгоритм сканирования — это то, что люди делали в программном обеспечении еще в 1990-х, до современных графических процессоров. Разработчики графических процессоров довольно быстро выяснили, что используемые вами алгоритмы рендеринга программного обеспечения сильно отличается из алгоритмов, которые вы бы реализовали в реализации VLSI с миллиардами транзисторов. Алгоритмы, оптимизированные для аппаратной реализации, как правило, выглядят довольно чуждо любому, кто все равно имеет опыт работы с программным обеспечением.

Еще одна вещь, которую я хотел бы прояснить, это то, что OpenGL ничего не говорит о том, «как» вы отрисовываете, это просто «что» вы отрисовываете. Реализации OpenGL могут делать это по своему усмотрению. Мы можем узнать «что», прочитав стандарт OpenGL, но «как» скрыто в секретах, хранящихся у производителей графических процессоров.

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

Что мы знаем о преобразовании сканирования?

  • Сканирование преобразования имеет в качестве входных данных ряд примитивов. Для наших целей давайте предположим, что они все треугольники (что в наши дни становится все более верным).

  • Каждый треугольник должен быть обрезан плоскостями отсечения. Это может добавить до трех дополнительных сторон к треугольнику, в худшем случае (превращение его в шестиугольник). Это должно произойти до перспективного проектирования.

  • Каждый примитив должен пройти перспективную проекцию. Этот процесс берет каждую вершину с однородными координатами (X, Y, Z, W) и преобразует ее в (X / W, Y / W, Z / W).

  • Кадровый буфер обычно организован иерархически в виде плиток, а не линейно, как в программном обеспечении. Кроме того, обработка может выполняться на нескольких иерархических уровнях. Причина, по которой мы используем линейную организацию в программном обеспечении, заключается в том, что для вычисления адресов памяти в иерархической структуре требуются дополнительные циклы. Однако реализации VLSI не страдают от этой проблемы, они могут просто соединить биты в регистре так, как они хотят сделать из него адрес.

Таким образом, вы можете видеть, что в программном обеспечении плитки являются «сложными и медленными», но в аппаратных средствах они «легкие и быстрые».

Серия R5xx положительно устарела (2005), но документация доступна онлайн (поиск «R5xx_Acceleration_v1.5.pdf»). В нем упоминаются два преобразователя сканирования, поэтому конвейер выглядит примерно так:

primitive output -> coarse scan converter -> quad scan converter -> fragment shader

Конвертер грубого сканирования работает с большими ячейками настраиваемого размера (от 8×8 до 32×32) и имеет несколько выбираемых режимов: «на основе перехвата» и «на основе ограничивающего прямоугольника».

Затем преобразователь с четырехкратным сканированием принимает выходные данные преобразователя с грубым сканированием и выводит отдельные четырехугольники, которые представляют собой группы из четырех выборок. Значения глубины для каждого четырехугольника могут быть представлены в виде четырех дискретных значений или в виде плоского уравнения. Плоское уравнение позволяет быстро отбрасывать весь квад, если соответствующий квад в буфере глубины также указан в виде плоского уравнения. Это называется «ранний Z», и это обычная оптимизация.

Затем фрагментный шейдер работает на одном квадре за раз. Квадрат может содержать образцы вне треугольника, которые затем будут отброшены.

Стоит еще раз отметить, что это старый видеокарта. Современные видеокарты сложнее. Например, R5xx даже не позволяет вам сэмплировать текстуры из вершинных шейдеров.

Если вы хотите получить еще более радикально отличную картину, посмотрите на реализации PowerVR GPU, которые используют так называемое «рендеринг на основе тайлов». Эти современные и мощные графические процессоры оптимизированы для низкой стоимости и низкого энергопотребления, и они бросают вызов многим вашим предположениям о том, как работают рендереры.

1

Цитировать из http://http.developer.nvidia.com/GPUGems3/gpugems3_ch39.html

Блог разработчика nvidia «Gpu Gems» описывает, как OpenGL выполняет сканирование
преобразование и сравнивает его с CUDA, который, я думаю, достаточно в качестве ответа на мой вопрос

До введения CUDA несколько исследователей
сканирование с использованием графических API, таких как OpenGL и Direct3D (см. раздел
39.3.4 для более). Чтобы продемонстрировать преимущества CUDA по сравнению с этими API для вычислений, таких как сканирование, в этом разделе мы кратко опишем
эффективная реализация OpenGL с включенным сканированием Sengupta et
и др. (2006). Их реализация представляет собой гибридный алгоритм, который выполняет
настраиваемое количество шагов уменьшения, как показано в алгоритме 5. Затем
запускает версию алгоритма сканирования суммы с двойной буферизацией
показано в алгоритме 2 по результату шага редукции. Наконец то
выполняет свипирование, как показано в алгоритме 6.

Пример 5. Шаг сокращения алгоритма сканирования OpenGL

1: for d = 1 to log2 n do
2:     for all k = 1 to n/2 d  – 1 in parallel do
3:          a[d][k] = a[d – 1][2k] + a[d – 1][2k + 1]]
Example 6. The Down-Sweep Step of the OpenGL Scan Algorithm

1: for d = log2 n – 1 down to 0 do
2:     for all k = 0 to n/2 d  – 1 in parallel do
3:          if i > 0 then
4:             if k mod 2 U2260.GIF 0 then
5:                  a[d][k] = a[d + 1][k/2]
6:             else
7:                  a[d][i] = a[d + 1][k/2 – 1]

Расчет сканирования OpenGL реализован с использованием пиксельных шейдеров и
каждый массив [d] представляет собой двумерную текстуру на графическом процессоре. Запись в
эти массивы выполняются с использованием рендеринга в текстуру в OpenGL. Таким образом,
каждая итерация цикла в алгоритме 5 и алгоритме 2 требует чтения
из одной текстуры и записи в другую.

Основные преимущества CUDA перед OpenGL заключаются в совместном использовании на кристалле
память, функциональность синхронизации потоков и точечные записи в
память, которая не доступна пиксельным шейдерам OpenGL. CUDA делит
работа большого сканирования на множество блоков, и каждый блок обрабатывается
полностью на кристалле одним мультипроцессором до записи каких-либо данных
вне памяти чипа. В OpenGL все обновления памяти выполняются вне чиповой памяти
Обновления. Таким образом, полоса пропускания, используемая реализацией OpenGL, значительно
выше и, следовательно, производительность ниже, как показано ранее в
Рисунок 39-7.

-3
По вопросам рекламы [email protected]