Introducción a los búferes en Direct3D 11

Un recurso de búfer es una colección de datos totalmente tipados agrupados en elementos. Puede usar búferes para almacenar una amplia variedad de datos, incluidos vectores de posición, vectores normales, coordenadas de textura en un búfer de vértices, índices en un búfer de índice o estado del dispositivo. Un elemento de búfer se compone de 1 a 4 componentes. Los elementos de búfer pueden incluir valores de datos empaquetados (como valores de superficie R8G8B8A8), enteros de 8 bits únicos o cuatro valores de punto flotante de 32 bits.

Se crea un búfer como un recurso no estructurado. Dado que no está estructurado, un búfer no puede contener ningún nivel de mapa mip, no se puede filtrar cuando se lee y no puede ser multimuestreo.

Tipos de búfer

A continuación se muestran los tipos de recursos de búfer admitidos por Direct3D 11. Todos los tipos de búfer se encapsulan mediante la interfaz ID3D11Buffer .

Búfer de vértices

Un búfer de vértices contiene los datos de vértice usados para definir la geometría. Los datos de vértice incluyen coordenadas de posición, datos de color, datos de coordenadas de textura, datos normales, etc.

El ejemplo más sencillo de un búfer de vértices es uno que solo contiene datos de posición. Se puede visualizar como la ilustración siguiente.

illustration of a vertex buffer that contains position data

Con más frecuencia, un búfer de vértices contiene todos los datos necesarios para especificar completamente vértices 3D. Un ejemplo de esto podría ser un búfer de vértices que contiene la posición por vértice, las coordenadas normales y de textura. Normalmente, estos datos se organizan como conjuntos de elementos por vértice, como se muestra en la ilustración siguiente.

illustration of a vertex buffer that contains position, normal, and texture data

Este búfer de vértices contiene datos por vértice; cada vértice almacena tres elementos (coordenadas de posición, normal y textura). La posición y la normal se especifican normalmente con tres floats de 32 bits (DXGI_FORMAT_R32G32B32_FLOAT) y las coordenadas de textura con dos floats de 32 bits (DXGI_FORMAT_R32G32_FLOAT).

Para acceder a los datos desde un búfer de vértices, debe saber a qué vértice acceder, además de los siguientes parámetros de búfer adicionales:

  • Desplazamiento: número de bytes desde el inicio del búfer hasta los datos del primer vértice. Puede especificar el desplazamiento mediante el método ID3D11DeviceContext::IASetVertexBuffers .
  • BaseVertexLocation: el número de bytes del desplazamiento al primer vértice utilizado por la llamada de dibujo adecuada.

Antes de crear un búfer de vértices, debe definir su diseño creando una interfaz ID3D11InputLayout ; Esto se hace llamando al método ID3D11Device::CreateInputLayout . Una vez creado el objeto input-layout, puede enlazarlo a la fase del ensamblador de entrada llamando a ID3D11DeviceContext::IASetInputLayout.

Para crear un búfer de vértices, llame a ID3D11Device::CreateBuffer.

Búfer de índice

Los búferes de índice contienen desplazamientos enteros en búferes de vértices y se usan para representar primitivos de forma más eficaz. Un búfer de índice contiene un conjunto secuencial de índices de 16 o 32 bits; cada índice se usa para identificar un vértice en un búfer de vértices. Un búfer de índice se puede visualizar como la ilustración siguiente.

illustration of an index buffer

Los índices secuenciales almacenados en un búfer de índice se encuentran con los parámetros siguientes:

Inicio del búfer de índice = Dirección base del búfer de índice + Desplazamiento (bytes) + StartIndexLocation * ElementSize (bytes);

En este cálculo, ElementSize es el tamaño de cada elemento de búfer de índice, que es de dos o cuatro bytes.

Para crear un búfer de índice, llame a ID3D11Device::CreateBuffer.

Búfer de constantes

Un búfer de constantes le permite proporcionar eficazmente datos de constantes de sombreador a la canalización. Puede usar un búfer de constantes para almacenar los resultados de la fase de salida de flujo. Conceptualmente, un búfer de constantes es similar a un búfer de vértices de un solo elemento, como se muestra en la ilustración siguiente.

illustration of a shader-constant buffer

Cada elemento almacena una constante de componente de 1 a 4, determinada por el formato de los datos almacenados. Para crear un búfer de constantes de sombreador, llame a ID3D11Device::CreateBuffer y especifique el miembro D3D11_BIND_CONSTANT_BUFFER del tipo enumerado D3D11_BIND_FLAG .

Un búfer de constantes solo puede usar una sola marca de enlace (D3D11_BIND_CONSTANT_BUFFER), que no se puede combinar con ninguna otra marca de enlace. Para enlazar un búfer de constantes de sombreador a la canalización, llame a uno de los métodos siguientes: ID3D11DeviceContext::GSSetConstantBuffers, ID3D11DeviceContext::P SSetConstantBuffers o ID3D11DeviceContext::VSSetConstantBuffers.

Para leer un búfer de constantes de sombreador desde un sombreador, use una función de carga HLSL (por ejemplo, Cargar). Cada fase del sombreador permite hasta 15 búferes de constantes de sombreador; cada búfer puede contener hasta 4096 constantes.

Búferes