Novos tipos de recursos

Vários novos tipos de recursos foram adicionados no Direct3D 11.

Buffers e texturas de leitura/gravação

Os recursos do modelo 4 do sombreador são somente leitura. O modelo 5 do sombreador implementa um novo conjunto correspondente de recursos de leitura/gravação:

Esses recursos exigem uma variável de recurso para acessar a memória (por meio da indexação), pois não há métodos para acessar a memória diretamente. Uma variável de recurso pode ser usada nos lados esquerdo e direito de uma equação; se usado no lado direito, o tipo de modelo deve ser um único componente (float, int ou uint).

Buffer estruturado

Um buffer estruturado é um buffer que contém elementos de tamanhos iguais. Use uma estrutura com um ou mais tipos de membro para definir um elemento. Aqui está uma estrutura com três membros.

struct MyStruct
{
    float4 Color;
    float4 Normal;
    bool isAwesome;
};

Use essa estrutura para declarar um buffer estruturado como este:

StructuredBuffer<MyStruct> mySB;

Além da indexação, um buffer estruturado dá suporte ao acesso a um único membro como este:

float4 myColor = mySb[27].Color;

Use os seguintes tipos de objeto para acessar um buffer estruturado:

Funções atômicas que implementam operações intertravadas são permitidas em elementos int e uint em um RWStructuredBuffer.

Buffer de Endereços de Byte

Um buffer de endereço de bytes é um buffer cujo conteúdo pode ser endereçável por um deslocamento de bytes. Normalmente, o conteúdo de um buffer é indexado por elemento usando um passo a passo para cada elemento (S) e o número do elemento (N) conforme fornecido pelo S*N. Um buffer de endereço de bytes, que também pode ser chamado de buffer bruto, usa um deslocamento de valor de bytes desde o início do buffer para acessar dados. O valor de byte deve ser um múltiplo de quatro para que ele esteja alinhado ao DWORD. Se qualquer outro valor for fornecido, o comportamento será indefinido.

O modelo 5 do sombreador introduz objetos para acessar um buffer de endereço de bytes somente leitura , bem como um buffer de endereço de bytes de leitura/gravação. O conteúdo de um buffer de endereço de bytes foi projetado para ser um inteiro sem sinal de 32 bits; se o valor no buffer não for realmente um inteiro sem sinal, use uma função como asfloat para lê-lo.

Buffer ou textura de acesso não ordenado

Um recurso de acesso não ordenado (que inclui buffers, texturas e matrizes de textura - sem multisampling), permite acesso de leitura/gravação temporalmente não ordenado de vários threads. Isso significa que esse tipo de recurso pode ser lido/gravado simultaneamente por vários threads sem gerar conflitos de memória por meio do uso de funções atômicas.

Crie um buffer ou textura de acesso não ordenado chamando uma função como ID3D11Device::CreateBuffer ou ID3D11Device::CreateTexture2D e passando o sinalizador D3D11_BIND_UNORDERED_ACCESS da enumeração D3D11_BIND_FLAG .

Os recursos de acesso não ordenados só podem ser associados a sombreadores de pixel e sombreadores de computação. Durante a execução, sombreadores de pixel ou sombreadores de computação em execução em paralelo têm os mesmos recursos de acesso não ordenados associados.

Acrescentar e consumir buffer

Um buffer de acréscimo e consumo é um tipo especial de um recurso não ordenado que dá suporte à adição e remoção de valores do final de um buffer semelhante à maneira como uma pilha funciona.

Um buffer de acréscimo e consumo deve ser um buffer estruturado:

Use esses recursos por meio de seus métodos, esses recursos não usam variáveis de recurso.

Visão geral do sombreador de computação