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


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

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

Назначение и использование

Этап геометрии шейдер обрабатывает целые примитивы: треугольники (3 вершины с до 3 смежных вершин), линии (2 вершины с до 2 смежных вершин), а также точки (1 вершина).

иллюстрация треугольника и линии со смежными вершинами

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

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

Этап шейдера geometry хорошо подходит для алгоритмов, включая:

  • Расширение спрайта точки
  • Динамические системы частиц
  • Мех/Фин поколение
  • Создание теневого тома
  • Однопроходная отрисовка к кубу
  • Переключение материала на примитивы
  • Настройка материала per-Primitive. Эта возможность включает создание барицентрических координат в качестве примитивных данных, чтобы шейдер пикселей может выполнять интерполяцию настраиваемых атрибутов.

Ввод

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

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

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

Общие аббревиаций вершин:

Аббревиатура Термин
TV Вершина треугольника
Lv Вершина линии
AV Смежная вершина

 

Выходные данные

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

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

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

Шейдер геометрии выводит данные по одной вершине за раз, добавляя вершины к объекту выходного потока. Топология потоков определяется фиксированным объявлением, выбором треугольника, LineStream и PointStream в качестве выходных данных для этапа GS.

Доступны три типа объектов потока: TriangleStream, LineStream и PointStream, которые являются шаблонами. Топология выходных данных определяется соответствующим типом объекта, а формат вершин, добавленных к потоку, определяется типом шаблона.

Если выходные данные геометрического шейдера определяются как системное интерпретированное значение (например, SV_RenderTargetArrayIndex или SV_Position), оборудование смотрит на эти данные и выполняет некоторое поведение, зависящее от значения, помимо передачи данных на следующий этап шейдера для ввода. Если такие данные из геометрического шейдера имеют значение для оборудования на основе каждого примитива (например, SV_RenderTargetArrayIndex или SV_ViewportArrayIndex), а не на основе каждой вершины (например, SV_ClipDistance[n] или SV_Position), данные по каждому примитиву принимаются из основной вершины, выдаваемой для примитива.

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

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

Графический конвейер