2010-12-12 4 views
83

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

ответ

147

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

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

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

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

Другими словами:

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

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

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

+4

Спасибо, очень четкие и краткие пояснения. Кажется, я понял это сейчас. – adivasile

+0

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

25

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

2

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

+1

«Чтобы манипулировать вершинами индивидуально, как правило, для движений в модели или волн в океане». Как это может быть верно, это более подходит для шейдера геометрии, который принимает участие после шейдера вершин и перед шейдером Pixel/Fragment. – Placeable

19

Nvidia CG Book

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

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

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

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

4

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

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

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

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