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


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

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

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

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

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

Тип
телевизор Вершина треугольника
AV Смежная вершина
LV Вершина линии

 

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

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

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

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

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

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

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

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

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

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

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

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