Introdução aos buffers no Direct3D 11

Um recurso de buffer é uma coleção de dados completamente tipados, agrupados em elementos. É possível usar buffers para armazenar uma ampla variedade de dados, incluindo vetores de posição, vetores normais, coordenadas de textura em um buffer de vértice, índices em um buffer de índice ou estado do dispositivo. Um elemento de buffer é composto de 1 a 4 componentes. Elementos de buffer podem incluir valores de dados de pacote (como valores de superfície R8G8B8A8), inteiros de 8 bits únicos ou quatro valores de ponto flutuante de 32 bits.

Um buffer é criado como um recurso não estruturado. Como ele não é estruturado, um buffer não pode conter níveis de mipmap, não pode ser filtrado quando lido e não pode conter várias amostras.

Tipos de buffer

Os tipos de recursos de buffer seguintes são compatíveis com Direct3D 11. Todos os tipos de buffer são encapsulados pela interface ID3D11Buffer .

Buffer de vértice

Um buffer de vértice contém os dados de vértice usados para definir sua geometria. Dados de vértice incluem coordenadas de posição, dados de cor, dados de coordenadas de textura, dados normais e assim por diante.

O exemplo mais simples de um buffer de vértice é aquele que contém apenas dados de posição. Ele pode ser visualizado como na ilustração a seguir.

illustration of a vertex buffer that contains position data

Com mais frequência, um buffer de vértices contém todos os dados necessários para especificar totalmente vértices 3D. Um exemplo disso pode ser um buffer de vértices que contém coordenadas de posição, normais e de textura por vértice. Esses dados geralmente são organizados como conjuntos de elementos por vértice, conforme mostrado na ilustração a seguir.

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

Esse buffer de vértice contém dados por vértice; cada vértice armazena três elementos (posição, normal e coordenadas de textura). A posição e o normal normalmente são especificados usando três floats de 32 bits (DXGI_FORMAT_R32G32B32_FLOAT) e as coordenadas de textura usando dois floats de 32 bits (DXGI_FORMAT_R32G32_FLOAT).

Para acessar os dados em um buffer de vértice, você precisa saber qual vértice acessar, além dos seguintes parâmetros de buffer adicionais:

  • Deslocamento -o número de bytes desde o início do buffer para os dados para o primeiro vértice. Você pode especificar o deslocamento usando o método ID3D11DeviceContext::IASetVertexBuffers .
  • BaseVertexLocation -o número de bytes do deslocamento até o primeiro vértice usado pela chamada de desenho apropriada.

Antes de criar um buffer de vértice, você precisa definir seu layout criando uma interface ID3D11InputLayout ; isso é feito chamando o método ID3D11Device::CreateInputLayout . Depois que o objeto de layout de entrada for criado, você poderá associá-lo ao estágio de assembler de entrada chamando o ID3D11DeviceContext::IASetInputLayout.

Para criar um buffer de vértice, chame ID3D11Device::CreateBuffer.

Buffer de índice

Buffers de índice contêm deslocamentos de inteiros em buffers de vértice e são usados para renderizar primitivas de forma mais eficiente. Um buffer de índice contém um conjunto sequencial de índices de 16 ou 32 bits; cada índice é usado para identificar um vértice em um buffer de vértices. Um buffer de índice pode ser visualizado como na ilustração a seguir.

illustration of an index buffer

Os índices sequenciais armazenados em um buffer de índice estão localizados com os seguintes parâmetros:

Início do Buffer de Índice = Endereço Base do Buffer de Índice + Deslocamento (bytes) + StartIndexLocation * ElementSize (bytes);

Nesse cálculo, ElementSize é o tamanho de cada elemento de buffer de índice, que é dois ou quatro bytes.

Para criar um buffer de índice, chame ID3D11Device::CreateBuffer.

Buffer constante

Um buffer constante permite que você forneça com eficiência dados constantes do sombreador no pipeline. Você pode usar um buffer constante para armazenar os resultados do estágio de fluxo de saída. Conceitualmente, um buffer constante parece muito com um buffer de vértice de elemento único, conforme mostrado na ilustração a seguir.

illustration of a shader-constant buffer

Cada elemento armazena uma constante de 1 a 4 componentes determinada pelo formato dos dados armazenados. Para criar um buffer de constante de sombreador, chame ID3D11Device::CreateBuffer e especifique o membro D3D11_BIND_CONSTANT_BUFFER do tipo enumerado D3D11_BIND_FLAG .

Um buffer constante só pode usar um único sinalizador de associação (D3D11_BIND_CONSTANT_BUFFER), que não pode ser combinado com qualquer outro sinalizador de associação. Para associar um buffer de constante de sombreador ao pipeline, chame um dos seguintes métodos: ID3D11DeviceContext::GSSetConstantBuffers, ID3D11DeviceContext::P SSetConstantBuffers ou ID3D11DeviceContext::VSSetConstantBuffers.

Para ler um buffer constante de sombreador de um sombreador, use uma função de carga HLSL (por exemplo, Carregar). Cada estágio de sombreador permite até 15 buffers constantes de sombreador; cada buffer pode manter até 4.096 constantes.

Buffers