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


Начало работы с этапом входных сборок

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

Основные шаги, связанные с настройкой этапа IA, показанного в следующей таблице, рассматриваются в этом разделе.

Этап Description
Создание входных буферов Создание и инициализация входных буферов с входными данными вершин.
Создание объекта input-Layout Определите способ потоковой передачи данных буфера вершин в этап IA с помощью объекта входного макета.
Привязка объектов к этапу входной сборки Привязать созданные объекты (входные буферы и объект входного макета) к этапу IA.
Указание типа примитива Определите, как вершины будут собраны в примитивы.
Методы рисования вызовов Отправьте данные, привязанные к этапу IA, через конвейер.

 

После выполнения этих действий перейдите к использованию системных значений.

Создание входных буферов

Существует два типа входных буферов: буферы вершин и буферы индекса. Буферы вершин предоставляют данные вершин на стадии IA. Буферы индекса являются необязательными; они предоставляют индексы вершин из буфера вершин. Вы можете создать один или несколько буферов вершин и, при необходимости, буфер индекса.

После создания буферных ресурсов необходимо создать объект входного макета, чтобы описать макет данных на этапе IA, а затем необходимо привязать буферные ресурсы к этапу IA. Создание и привязка буферов не требуется, если шейдеры не используют буферы. Пример простого шейдера вершин и пикселей, нарисовав один треугольник, см. в разделе "Использование этапа входной сборки без буферов".

Сведения о создании буфера вершин см. в статье "Практическое руководство. Создание буфера вершин". Сведения о создании буфера индекса см. в статье "Практическое руководство. Создание буфера индекса".

Создание объекта input-Layout

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

Объект макета ввода создается из массива описаний входных элементов и указателя на скомпилированный шейдер (см. файл ID3D11Device::CreateInputLayout). Массив содержит один или несколько входных элементов; каждый входной элемент описывает один элемент вершинных данных из одного буфера вершин. Весь набор описаний входных элементов описывает все элементы данных вершин из всех буферов вершин, которые будут привязаны к этапу IA.

В следующем описании макета описывается один буфер вершин, содержащий три элемента данных вершины:

D3D11_INPUT_ELEMENT_DESC layout[] =
{
    { L"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, 
          D3D11_INPUT_PER_VERTEX_DATA, 0 },
    { L"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, 
          D3D11_INPUT_PER_VERTEX_DATA, 0 },
    { L"NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 20, 
          D3D11_INPUT_PER_VERTEX_DATA, 0 },
};

Описание входного элемента описывает каждый элемент, содержащийся одной вершиной в буфере вершин, включая размер, тип, расположение и назначение. Каждая строка определяет тип данных с помощью семантики, семантического индекса и формата данных. Семантика — это текстовая строка, которая определяет, как будут использоваться данные. В этом примере первая строка определяет данные о положении 3-компонентов (xyz, например); вторая строка определяет 2-компонентные данные текстуры (например, UV), а третья строка определяет обычные данные.

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

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

Входные слоты

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

illustration of the input slots for the ia stage

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

Повторное выполнение объектов входного макета

Каждый объект макета ввода создается на основе сигнатуры шейдера; Это позволяет API проверять элементы входного макета-объекта в соответствии с сигнатурой шейдер-входных данных, чтобы убедиться, что есть точное совпадение типов и семантики. Вы можете создать один объект макета ввода для многих шейдеров, если все подписи шейдера-входных данных точно соответствуют.

Привязка объектов к этапу входной сборки

После создания ресурсов буфера вершин и объекта входного макета их можно привязать к этапу IA путем вызова ID3D11DeviceContext::IASetVertexBuffers и ID3D11DeviceContext::IASetInputLayout. В следующем примере показана привязка одного буфера вершин и объекта входного макета к этапу IA:

UINT stride = sizeof( SimpleVertex );
UINT offset = 0;
g_pd3dDevice->IASetVertexBuffers( 
    0,                // the first input slot for binding
    1,                // the number of buffers in the array
    &g_pVertexBuffer, // the array of vertex buffers
    &stride,          // array of stride values, one for each buffer
    &offset );        // array of offset values, one for each buffer

// Set the input layout
g_pd3dDevice->IASetInputLayout( g_pVertexLayout );

Привязка объекта входного макета требует только указателя на объект.

В предыдущем примере один буфер вершин привязан; однако несколько буферов вершин могут быть привязаны одним вызовом ID3D11DeviceContext::IASetVertexBuffers, а следующий код показывает такой вызов для привязки трех буферов вершин:

UINT strides[3];
strides[0] = sizeof(SimpleVertex1);
strides[1] = sizeof(SimpleVertex2);
strides[2] = sizeof(SimpleVertex3);
UINT offsets[3] = { 0, 0, 0 };
g_pd3dDevice->IASetVertexBuffers( 
    0,                 //first input slot for binding
    3,                 //number of buffers in the array
    &g_pVertexBuffers, //array of three vertex buffers
    &strides,          //array of stride values, one for each buffer
    &offsets );        //array of offset values, one for each buffer

Буфер индекса привязан к этапу IA путем вызова ID3D11DeviceContext::IASetIndexBuffer.

Указание типа примитива

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

g_pd3dDevice->IASetPrimitiveTopology( D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST );

Остальные типы примитивов перечислены в D3D_PRIMITIVE_TOPOLOGY.

Методы рисования вызовов

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

Методы рисования Description
ID3D11DeviceContext::D raw Рисуйте неиндексированные неисчерпаемые примитивы.
ID3D11DeviceContext::D rawInstanced Рисуйте неиндексированные, экземплярные примитивы.
ID3D11DeviceContext::D rawIndexed Рисуйте индексированные, неисчерпаемые примитивы.
ID3D11DeviceContext::D rawIndexedInstanced Рисуйте индексированные, экземплярные примитивы.
ID3D11DeviceContext::D rawAuto Рисуйте неиндексированные неисчерпаемые примитивы из входных данных, поступающих с этапа потоковой передачи.

 

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

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