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


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

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

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

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

Типы буферов

Ниже приведены типы ресурсов буфера, поддерживаемые Direct3D 11.

Буфер вершин

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

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

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

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

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

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

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

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

Перед созданием буфера вершин необходимо определить его макет. После создания объекта входного макета вы привязываете его к этапу сборщика входных данных (IA).

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

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

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

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

  • Смещение — количество байтов из базового адреса буфера индекса.
  • StartIndexLocation — указывает первый элемент буфера индекса из базового адреса и смещения. Начальная позиция представляет первый индекс для отрисовки.
  • IndexCount — количество индексов для отрисовки.

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

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

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

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

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

Каждый элемент хранит константу компонента 1–4, определяемую форматом хранимых данных.

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

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

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