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

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

Шейдер геометрии

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

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

Тип
ТЕЛЕВИЗОР Вершина треугольника
AV Смежная вершина
LV Вершина линии

 

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

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

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

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

Шейдер геометрии выводит данные по одной вершине путем добавления вершин к объекту потокового вывода. Топология потоков определяется фиксированным объявлением, при этом в качестве выходных данных для этапа GS выбирается одно из следующих значений: PointStream, LineStream или TriangleStream. Существует три типа потоковых объектов: PointStream, LineStream и TriangleStream, которые являются шаблонами объектов. Топология выходных данных определяется их соответствующим типом объекта, а формат вершин, добавленных к потоку, определяется типом шаблона. Выполнение экземпляра шейдера геометрии атомарно относительно других вызовов с тем исключением, что добавляемые в потоки данные последовательны. Выходные данные отдельного вызова шейдера геометрии независимы от других вызовов (хотя порядок учитывается). Шейдер геометрии, создающий полосы треугольников, при каждом вызове будет создавать новую полосу.

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

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

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

Алгоритмы, которые можно реализовать в геометрическом шейдере:

  • расширение спрайтов точек;
  • динамические системы частиц;
  • Создание меха/"плавников"
  • Создание объемных теней
  • Однопроходная отрисовка с использованием кубической карты
  • Замена материалов по примитивам
  • Per-Primitive настройка материала . Включая создание барицентрических координат в качестве примитивных данных, чтобы пиксельный шейдер может выполнять настраиваемую интерполяцию атрибутов (пример нормальной интерполяции более высокого порядка см. в примере CubeMapGS).

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

Этапы конвейера (Direct3D 10)