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


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

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

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

Типы буферов

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

Буфер вершин

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

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

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

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

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

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

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

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

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

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

Буфер индекса

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

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

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

  • Смещение — количество байтов из базового адреса буфера индекса. Смещение передается методу ID3D11DeviceContext::IASetIndexBuffer.
  • StartIndexLocation — указывает первый элемент буфера индекса из базового адреса и смещение, предоставленное в IASetIndexBuffer. Начальное расположение предоставляется методу ID3D11DeviceContext::DrawIndexed или ID3D11DeviceContext::DrawIndexedInstanced и представляет первый индекс для отрисовки.
  • 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::PSSetConstantBuffersили ID3D11DeviceContext::VSSetConstantBuffers.

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

Буферы