Vertex shader vs Fragment Shader

Я прочитал несколько руководств по Cg, но одно не совсем ясно для меня. В чем же разница между вершинными и фрагментами шейдеров? И для каких ситуаций лучше всего подходит другое?

Ответ 1

Фрагментный шейдер такой же, как пиксельный шейдер.

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

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

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

Поставьте другой способ:

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

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

Просто прочитайте о графическом конвейере здесь, и все откроется: http://en.wikipedia.org/wiki/Graphics_pipeline

Ответ 2

Vertex shader выполняется на каждой вершине, а фрагментарный шейдер - на каждом пикселе. Шейдер фрагмента применяется после вершинного шейдера. Подробнее о конвейере графического процессора шейдеров текст ссылки

Ответ 3

Nvidia Cg Tutorial:

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

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

Ранее мы говорили, что вы должны рассматривать фрагмент как пиксель, если вы точно не знаете, что это за фрагмент. Однако на этом этапе различие между фрагментом и пикселем становится важным. Термин "пиксель" означает "элемент изображения". Пиксель представляет содержимое буфера кадра в определенном местоположении, например цвет, глубину и любые другие значения, связанные с этим местоположением. Фрагмент - это состояние, необходимое для обновления определенного пикселя.

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

Ответ 4

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

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

Фрагментный шейдер принимает выходные данные вершинного шейдера и связывает цвета, значение глубины пикселя и т.д. После этих операций фрагмент отправляется в Framebuffer для отображения на экране.

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

Ответ 5

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