Вершинный шейдер против фрагментного шейдера [дубликат]


этот вопрос уже есть ответ здесь:

  • Что такое вершинные и пиксельные шейдеры? 5 ответов

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

5 89

5 ответов:

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

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

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

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

поставить иначе:

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

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

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

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

Nvidia CG Book

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

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

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

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

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

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

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

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

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