Compartilhar via


Introdução aos buffers

Um recurso de buffer é uma coleção de dados totalmente tipados, agrupados em elementos. Os buffers armazenam dados, como coordenadas de textura em um buffer de vértice, índices em um buffer de índice, dados de constantes de sombreador em um buffer de constante, vetores de posição, vetores normais ou estado do dispositivo.

Um elemento tampão é composto de 1 a 4 componentes. Os elementos de buffer podem incluir valores de dados compactados (como valores de superfície R8G8B8A8), inteiros únicos de 8 bits ou quatro valores de ponto flutuante de 32 bits.

Um buffer é criado como um recurso não estruturado. Como não é estruturado, um buffer não pode conter nenhum nível de mipmap, não pode ser filtrado quando lido e não pode ser multiamostrado.

Tipos de buffer

Veja a seguir os tipos de recursos de buffer compatíveis com o Direct3D 11.

Buffer de vértice

Um buffer de vértice contém os dados de vértice usados para definir sua geometria. Os 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 a ilustração a seguir.

Ilustração de um buffer de vértice que contém dados de posição

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

Ilustração de um buffer de vértice que contém dados de posição, normal e textura

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

Para acessar dados de 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 até os dados do primeiro vértice.
  • BaseVertexLocation - o número de bytes do deslocamento para o primeiro vértice usado pela chamada de desenho apropriada.

Antes de criar um buffer de vértice, você precisa definir seu layout. Depois que o objeto de layout de entrada é criado, você o vincula ao estágio IA (Assembler de Entrada).

Buffer de índice

Os buffers de índice contêm deslocamentos inteiros em buffers de vértice e são usados para renderizar primitivos com mais eficiência. Um buffer de índice contém um conjunto sequencial de índices de 16 bits ou 32 bits; Cada índice é usado para identificar um vértice em um buffer de vértice. Um buffer de índice pode ser visualizado como a ilustração a seguir.

Ilustração de um buffer de índice

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

  • Deslocamento - o número de bytes do endereço base do buffer de índice.
  • StartIndexLocation - especifica o primeiro elemento de buffer de índice do endereço base e do deslocamento. O local inicial representa o primeiro índice a ser renderizado.
  • IndexCount - o número de índices a serem renderizados.

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 é de dois ou quatro bytes.

Buffer constante

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

Ilustração de um buffer de constante de sombreador

Cada elemento armazena uma constante de componente de 1 a 4, determinada pelo formato dos dados armazenados.

Um buffer constante só pode usar um único sinalizador de vinculação, que não pode ser combinado com nenhum outro sinalizador de vinculação.

Para ler um buffer constante de sombreador de um sombreador, use uma função de carregamento HLSL. Cada estágio do sombreador permite até 15 buffers constantes de sombreador; Cada buffer pode conter até 4096 constantes.

Buffers de vértice e índice