Вводные сведения о буферахIntroduction to buffers

Буферный ресурс — это коллекция полностью распределенных по типам данных, сгруппированных в элементы.A buffer resource is a collection of fully typed data, grouped into elements. Буферы хранят данные, например координаты текстур в буфере вершин, индексы в буфере индексов, данные констант шейдера в буфере констант, векторы положений, векторы нормалей и состояния устройства.Buffers store data, such as texture coordinates in a vertex buffer, indexes in an index buffer, shader constants data in a constant buffer, position vectors, normal vectors, or device state.

Элемент буфера состоит из компонентов числом от 1 до 4.A buffer element is made up of 1 to 4 components. Элементы буфера могут включать в себя упакованные значения данных (например, значения поверхности R8G8B8A8), единичные 8-разрядные целые числа или четыре 32-разрядных значения с плавающей запятой.Buffer elements can include packed data values (like R8G8B8A8 surface values), single 8-bit integers, or four 32-bit floating point values.

Буфер создается как неструктурированный ресурс.A buffer is created as an unstructured resource. Поскольку он неструктурированный, буфер не может содержать какие-либо уровни MIP, не может использовать фильтрацию при чтении и не может подвергаться множественной дискретизации.Because it is unstructured, a buffer cannot contain any mipmap levels, it cannot get filtered when read, and it cannot be multisampled.

Типы буферовBuffer Types

Ниже приведены типы буферных ресурсов, поддерживаемые Direct3D 11.The following are the buffer resource types supported by Direct3D 11.

Буфер вершинVertex Buffer

Буфер вершин содержит данные вершин, используемые для определения геометрии.A vertex buffer contains the vertex data used to define your geometry. К данным вершин относятся координаты положения, данные цвета, данные координат текстуры, данные нормали и т. д.Vertex data includes position coordinates, color data, texture coordinate data, normal data, and so on.

Самый простой пример буфера вершин — это буфер, который содержит только данные положения.The simplest example of a vertex buffer is one that only contains position data. Его можно изобразить, как на следующем рисунке.It can be visualized like the following illustration.

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

Чаще всего буфер вершин содержит все данные, необходимые для полного описания трехмерных вершин.More often, a vertex buffer contains all the data needed to fully specify 3D vertices. Примером этого может быть буфер вершин, который содержит положение, нормаль и координаты текстуры для каждой вершины.An example of this could be a vertex buffer that contains per-vertex position, normal and texture coordinates. Эти данные обычно упорядочены в виде наборов элементов для каждой вершины, как показано на следующем рисунке.This data is usually organized as sets of per-vertex elements, as shown in the following illustration.

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

Этот буфер вершин содержит данные по каждой вершине; для каждой вершины сохраняются три элемента (положение, нормаль и координаты текстуры).This vertex buffer contains per-vertex data; each vertex stores three elements (position, normal, and texture coordinates). Положение и нормаль обычно задаются с помощью трех 32-разрядных значений с плавающей запятой, а координаты текстуры — с помощью двух 32-разрядных значений с плавающей запятой.The position and normal are each typically specified using three 32-bit floats and the texture coordinates using two 32-bit floats.

Для доступа к данным из буфера вершин необходимо знать, какая вершина нужна, а также следующие дополнительные параметры буфера.To access data from a vertex buffer you need to know which vertex to access, plus the following additional buffer parameters:

  • Смещение — число байтов от начала буфера до данных для первой вершины.Offset - the number of bytes from the start of the buffer to the data for the first vertex.
  • BaseVertexLocation — количество байтов от смещения до первой вершины, используемой с помощью соответствующего вызова рисования.BaseVertexLocation - the number of bytes from the offset to the first vertex used by the appropriate draw call.

Перед созданием буфера вершин необходимо определить его макет.Before you create a vertex buffer, you need to define its layout. После создания объекта макета входных данных привяжите его к этапу сборщика входных данных (IA).After the input-layout object is created, you bind it to the Input Assembler (IA) stage.

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

Буферы индексов содержат целочисленные указатели в буферы вершин и используются для более эффективной отрисовки примитивов.Index buffers contain integer offsets into vertex buffers and are used to render primitives more efficiently. Буфер индексов содержит последовательный набор 16-разрядных или 32-разрядных индексов; каждый индекс используется для идентификации вершины в буфере вершин.An index buffer contains a sequential set of 16-bit or 32-bit indices; each index is used to identify a vertex in a vertex buffer. Буфер индексов можно изобразить, как на следующем рисунке.An index buffer can be visualized like the following illustration.

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

Последовательные индексы, хранящиеся в буфере индексов, обнаруживаются по следующим параметрам:The sequential indices stored in an index buffer are located with the following parameters:

  • Смещение — число байтов от базового адреса буфера индексов.Offset - the number of bytes from the base address of the index buffer.
  • StartIndexLocation — указывает первый элемент буфера индексов из базового адреса, а также смещение.StartIndexLocation - specifies the first index buffer element from the base address and the offset. Начальное расположение представляет первый индекс для отрисовки.The start location represents the first index to render.
  • IndexCount — число индексов для отрисовки.IndexCount - the number of indices to render.

Начала буфера индекса = базовый адрес буфера индекс + смещение (в байтах) + StartIndexLocation * ElementSize (в байтах);Start of Index Buffer = Index Buffer Base Address + Offset (bytes) + StartIndexLocation * ElementSize (bytes);

В этом расчете ElementSize — это размер каждого элемента буфера индексов, представляющий собой два или четыре байта.In this calculation, ElementSize is the size of each index buffer element, which is either two or four bytes.

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

Буфер констант позволяет эффективно поставлять данные констант шейдера в конвейер.A constant buffer allows you to efficiently supply shader constants data to the pipeline. Буфер констант можно использовать для хранения результатов этапа вывода потока.You can use a constant buffer to store the results of the stream-output stage. Концептуально буфер констант аналогичен одноэлементному буферу вершин, что показано на следующем рисунке.Conceptually, a constant buffer looks just like a single-element vertex buffer, as shown in the following illustration.

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

Каждый элемент хранит определяемую форматом данных константу с числом компонентов от 1 до 4.Each element stores a 1-to-4 component constant, determined by the format of the data stored.

Буфер констант может использовать только один флаг привязки, который невозможно сочетать с каким-либо другим флагом привязки.A constant buffer can only use a single bind flag , which cannot be combined with any other bind flag.

Для чтения буфера констант шейдера из шейдера используйте функцию загрузки HLSL.To read a shader-constant buffer from a shader, use an HLSL load function. На каждом этапе шейдера можно определить до 15 буферов констант шейдера, причем каждый буфер может содержать до 4096 констант.Each shader stage allows up to 15 shader-constant buffers; each buffer can hold up to 4096 constants.

Связанные разделыRelated topics

Буферы вершин и индексовVertex and index buffers