Общие сведения о буферах в Direct3D 11

Буферный ресурс — это коллекция полностью типизированных данных, сгруппированных в элементы. Буферы можно использовать для хранения самых разных данных, в том числе векторов положений, нормальных векторов, координат текстур (в буфере вершин), индексов (в буфере индексов) или состояния устройства. Элемент буфера состоит из компонентов числом от 1 до 4. Элементы буфера могут включать в себя упакованные значения данных (например, значения поверхности R8G8B8A8), единичные 8-разрядные целые числа или четыре 32-разрядных значения с плавающей запятой.

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

Типы буферов

Ниже приведены типы буферных ресурсов, поддерживаемые Direct3D 11. Все типы буферов инкапсулируются интерфейсом ID3D11Buffer .

Буфер вершин

Буфер вершин содержит данные вершин, используемые для определения геометрии. К данным вершин относятся координаты положения, данные цвета, данные координат текстуры, данные нормали и т. д.

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

иллюстрация буфера вершин, который содержит данные положения

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

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

Этот буфер вершин содержит данные по каждой вершине; для каждой вершины сохраняются три элемента (положение, нормаль и координаты текстуры). Положение и норма обычно задаются с помощью трех 32-разрядных с плавающей точкой (DXGI_FORMAT_R32G32B32_FLOAT), а координаты текстуры — двумя 32-разрядными с плавающей точкой (DXGI_FORMAT_R32G32_FLOAT).

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

  • Смещение — число байтов от начала буфера до данных для первой вершины. Смещение можно указать с помощью метода ID3D11DeviceContext::IASetVertexBuffers .
  • BaseVertexLocation — значение, добавляемое к каждому индексу перед чтением вершины из буфера вершин.

Перед созданием буфера вершин необходимо определить его макет, создав интерфейс ID3D11InputLayout ; Для этого вызывается метод ID3D11Device::CreateInputLayout . После создания объекта input-layout его можно привязать к этапу входного ассемблер, вызвав ID3D11DeviceContext::IASetInputLayout.

Чтобы создать буфер вершин, вызовите ID3D11Device::CreateBuffer.

Буфер индексов

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

иллюстрация буфера индексов

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

  • Смещение — число байтов от базового адреса буфера индексов. Смещение предоставляется методу ID3D11DeviceContext::IASetIndexBuffer .
  • StartIndexLocation — указывает первый элемент буфера индекса из базового адреса и смещение, предоставленное в IASetIndexBuffer. Начальное расположение предоставляется методу ID3D11DeviceContext::D rawIndexed или ID3D11DeviceContext::D rawIndexedInstanced и представляет первый индекс для отрисовки.
  • IndexCount — число индексов для отрисовки. Число предоставляется методу DrawIndexed .

Начало буфера индекса = базовый адрес буфера индекса + смещение (байты) + StartIndexLocation * elementSize (байты);

В этом расчете ElementSize — это размер каждого элемента буфера индексов, представляющий собой два или четыре байта.

Чтобы создать буфер индекса, вызовите ID3D11Device::CreateBuffer.

Буфер констант

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

иллюстрация буфера констант шейдера

Каждый элемент хранит определяемую форматом данных константу с числом компонентов от 1 до 4. Чтобы создать буфер констант шейдера, вызовите ID3D11Device::CreateBuffer и укажите D3D11_BIND_CONSTANT_BUFFER член перечисленного типа D3D11_BIND_FLAG .

Буфер констант может использовать только один флаг привязки (D3D11_BIND_CONSTANT_BUFFER), который нельзя объединить с любым другим флагом привязки. Чтобы привязать буфер констант шейдера к конвейеру, вызовите один из следующих методов: ID3D11DeviceContext::GSSetConstantBuffers, ID3D11DeviceContext::P SSetConstantBuffers или ID3D11DeviceContext::VSSetConstantBuffers.

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

Buffers