Поделиться через


Этап шейдера геометрии

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

Схема, показывающая примеры входных примитивов геометрического шейдера.

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

Этап геометрического шейдера может выводить несколько вершин для формирования одной выбранной топологии. Доступные топологии вывода GS: tristrip, linestrip и pointlist. Число примитивов, создаваемых геометрическим шейдером, может различаться, однако максимальное число вершин, которые может выдавать геометрический шейдер, должно быть объявлено статически. Длина полосы, излучаемая геометрическим шейдером, может быть произвольной (существует команда cut ).

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

Этап геометрического шейдера может реализовывать следующие алгоритмы:

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

  • Широколинейная тесселяции. Шейдер получает две вершины линии (LV0 и LV1) и создает четыре вершины для четырехугольника, представляющего расширенную линию. Кроме того, геометрический шейдер может использовать смежные вершины линии (AV0 и AV1) для выполнения митеринга на конечных точках линии.

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

  • Создание теневых томов: сведения о смежности, которые используются для определения того, следует ли выдавливать.

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

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

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

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

Среда выполнения Direct3D вызывает следующие функции драйвера для создания, настройки и уничтожения геометрического шейдера: