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


Этап сборщика входных данных

Входной ассемблер (IA) вводит треугольники, линии или точки в конвейер отрисовки, извлекая исходные геометрические данные из 1D-буферов.

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

Последовательность вершин создается на основе данных, извлекаемых из буферов. Данные извлекается в обходе, который направляется сочетанием состояния фиксированной функции и различных вызовов DDI Draw*(). Различные топологии-примитивы (например, список точек, список строк, список треугольников и полоса треугольников) позволяют сделать последовательность данных вершины последовательностью примитивов.

Данные вершин можно создать одним из двух способов. Первый способ получения данных вершин — неиндексированная отрисовка, которая представляет собой последовательный обход буферов, содержащих данные вершин. Данные вершин возникают при смещении начала при каждой привязке буфера. Второй способ получения данных вершин — индексируемая отрисовка, которая представляет собой последовательный обход одного буфера, содержащего скалярные целочисленные индексы. Индексы берутся с начального смещения в буфер. Каждый индекс указывает, где следует извлечь данные из буфера, содержащего данные вершин. Значения индекса не зависят от характеристик буферов, на которые они ссылаются. Буферы описываются объявлениями. Неиндексированная и индексированная отрисовка, каждая по-своему, создает адреса, из которых извлекает данные вершин в памяти, а затем собирает результаты в вершины и примитивы.

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

Другой особый случай IA заключается в том, что он может считывать буферы, в которые записывается этап вывода потока. Такой сценарий позволяет использовать новый тип операции рисования DrawAuto. DrawAuto позволяет использовать динамический объем выходных данных, записанный в буферы потокового вывода, без вмешательства ЦП, чтобы определить, сколько данных было записано на самом деле.

Помимо создания данных вершин из буферов, IA может автоматически создавать три скалярных значения счетчиков: VertexID, PrimitiveID и InstanceID, для ввода в этапы шейдера в конвейере отрисовки.

При индексированной отрисовке топологий полосы, таких как полосы треугольников, предоставляется механизм для рисования нескольких полос с одним вызовом *Draw*() (т. е. команда *cut для вырезания полос).

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

CalcPrivateElementLayoutSize

CreateElementLayout

DestroyElementLayout

IaSetIndexBuffer

IaSetInputLayout

IaSetTopology

IaSetVertexBuffers