Графический конвейер Direct3D10 и Direct3D11 - SIISII/DirectX GitHub Wiki

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

Графический конвейер Direct3D11 включает пять стадий с фиксированной функциональностью (прямоугольники) и пять стадий шейдеров, то есть программ, выполняемых на графическом процессоре (овалы). Графический конвейер Direct3D10 включает четыре фиксированных и три шейдерных стадии: в нём отсутствуют стадии, осуществляющие тесселяцию (сюда входят каркасный и доменный шейдеры и фиксированная стадия собственно тесселяции).

  • Стадия сбора исходных данных (input-assembler stage, IA) выбирает исходную информацию из вершинных буферов и собирает её в подлежащие рендерингу графические примитивы (точки, отрезки и треугольники).

  • Стадия вершинного шейдера (vertex-shader stage, VS) производит обработку поступающих от IA вершин. На этом этапе выполняются только повершинные операции, например, преобразование координат, морфинг и повершинное освещение. Вершинный шейдер является обязательным. Если вершины обрабатывать не нужно, к конвейеру привязывается шейдер, просто передающий данные следующей стадии в неизменном виде.

  • Стадия геометрического шейдера (geometry-shader stage, GS), появившаяся в Direct3D10, производит обработку не отдельных вершин, а целых примитивов. Помимо информации о вершинах, образующих текущий обрабатываемый примитив, геометрический шейдер может иметь доступ к соседним вершинам (двум при обработке отрезка и трём — треугольника). В результате выполнения геометрического шейдера число примитивов может изменяться: он может уничтожить поступивший на вход примитив, а может сформировать новые примитивы. Геометрический шейдер может отсутствовать.

  • Стадия потокового вывода (stream-output stage, SO) осуществляет запись в память информации, поступающей от предыдущей стадии конвейера (обычно от геометрического шейдера). Это даёт возможность многократной обработки геометрической информации одними и теми же или разными шейдерами, а также совместной обработки данных графическим и центральным процессорами. Эта статия может пропускаться.

  • Стадия растеризации (rasterized stage, RS) преобразует графические примитивы из векторной формы в растровую, то есть проецирует находящиеся в трёхмерном пространстве примитивы на плоскость отображения, разбивая при этом их на отдельные пиксели и выполняя для каждого полученного пикселя интерполяцию вершинных атрибутов. Эта и последующие стадии могут отсутствовать, если результатом работы конвейера является лишь информация, записываемая в память стадией потокового вывода.

  • Стадия пиксельного шейдера (pixel-shader stage, PS) производит обработку каждого пикселя, сформированного при растеризации. На этом этапе можно рассчитать, например, попиксельное освещение и выполнить постобработку.

  • Стадия вывода и слияния (output-merger stage, OM) формирует окончательные значения цветов пикселей и сохраняет их в области памяти, отведённой под так называему цель рендеринга. Она учитывает значения цветов, сформированные пиксельным шейдером, текущее состояние графического конвейера, содержимое цели рендеринга и буфера глубины/шаблона. В частности, она может отбросить пиксель, если он является невидимым, или смешать его цвет с цветом пикселя, ранее записанным в цель рендеринга.

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

При привязке ресурсов и объектов состояния к графическому конвейеру надо помнить, что в Direct3D10 счётчик ссылок на интерфейсы этих ресурсов и объектов не увеличивается, а в Direct3D11 — увеличивается. Соответственно, программа, использующая Direct3D10, не должна освобождать эти интерфейсы до тех пор, пока рендеринг не закончится, а программа, использующая Direct3D11, может освобождать их сразу после привязки к конвейеру, если после рендеринга они не понадобятся.