Introdução a um recurso no Direct3D 11

Os recursos são os blocos de construção da cena. Eles contêm a maioria dos dados que o Direct3D usa para interpretar e renderizar sua cena. Os recursos são áreas na memória que podem ser acessadas pelo pipeline do Direct3D. Os recursos contêm os seguintes tipos de dados: geometria, texturas, dados de sombreador. Este tópico apresenta recursos do Direct3D, como buffers e texturas.

Você pode criar recursos fortemente tipado ou sem tipo; você pode controlar se os recursos têm acesso de leitura e gravação; você pode tornar os recursos acessíveis apenas para a CPU, GPU ou ambos. Até 128 recursos podem estar ativos para cada estágio do pipeline.

O Direct3D garante retornar zero para qualquer recurso que seja acessado fora dos limites.

O ciclo de vida de um recurso Direct3D é:

  • Crie um recurso usando um dos métodos create da interface ID3D11Device .
  • Associe um recurso ao pipeline usando um contexto e um dos métodos definidos da interface ID3D11DeviceContext .
  • Desaloque um recurso chamando o método Release da interface de recurso.

Esta seção contém os seguintes tópicos:

Digitação forte versus fraca

Há duas maneiras de especificar totalmente o layout (ou volume de memória) de um recurso:

  • Digitado – especifique completamente o tipo quando o recurso é criado.
  • Sem tipo – especifique totalmente o tipo quando o recurso estiver associado ao pipeline.

Criar um recurso totalmente com tipo restringe o recurso ao formato com o qual ele foi criado. Isso permite que o tempo de execução otimize o acesso, especialmente se o recurso for criado com sinalizadores indicando que ele não pode ser mapeado pelo app. Os recursos criados com um tipo específico não podem ser reinterpretados usando o mecanismo de exibição, a menos que o recurso tenha sido criado com o sinalizador D3D10_DDI_BIND_PRESENT. Se D3D10_DDI_BIND_PRESENT estiver definido, as exibições de recurso de destino de renderização ou de sombreador poderão ser criadas nesses recursos usando qualquer um dos membros totalmente tipado da família apropriada, mesmo que o recurso original tenha sido criado como totalmente tipado.

Em um tipo menos recurso, o tipo de dados é desconhecido quando o recurso é criado pela primeira vez. O aplicativo deve escolher entre o tipo disponível menos formatos (consulte DXGI_FORMAT). Você deve especificar o tamanho da memória a alocar e se o tempo de execução precisará gerar as subtexturas em mipmap. No entanto, o formato de dados exato (se a memória será interpretada como inteiros, valores de ponto flutuante, inteiros sem sinal etc.) não é determinado até que o recurso seja associado ao pipeline com uma exibição de recurso. Como o formato de textura permanece flexível até a textura ser associada ao pipeline, o recurso será referido como armazenamento com tipo fraco. O armazenamento com tipo fraco tem a vantagem de poder ser reutilizado ou reinterpretado em outro formato, desde que o número de componentes e a contagem de bits de cada componente sejam os mesmos em ambos os formatos.

Um recurso único pode ser vinculado a vários estágios de pipeline, desde que cada um tenha um modo de exibição exclusivo que qualifique totalmente os formatos em cada local. Por exemplo, um recurso criado com o formato DXGI_FORMAT_R32G32B32A32_TYPELESS poderia ser usado como um DXGI_FORMAT_R32G32B32A32_FLOAT e um DXGI_FORMAT_R32G32B32A32_UINT em locais diferentes no pipeline simultaneamente.

Exibições de recursos

Os recursos podem ser armazenados em formatos de memória de uso geral para que possam ser compartilhados por vários estágios de pipeline. Um estágio de pipeline interpreta os dados de recurso usando uma exibição. Uma exibição de recurso é conceitualmente semelhante à conversão dos dados do recurso para que possam ser usados em um contexto específico.

Uma exibição pode ser usada com um recurso sem tipo. Ou seja, você pode criar um recurso em tempo de compilação e declarar o tipo de dados quando o recurso estiver associado ao pipeline. Uma exibição criada para um recurso sem tipo sempre tem o mesmo número de bits por componente; a maneira como os dados são interpretados depende do formato especificado. O formato especificado deve ser da mesma família que o formato sem tipo usado ao criar o recurso. Por exemplo, um recurso criado com o formato R8G8B8A8_TYPELESS não pode ser exibido como um recurso de R32_FLOAT mesmo que ambos os formatos possam ter o mesmo tamanho na memória.

Uma exibição também expõe outras funcionalidades, como a capacidade de ler superfícies de profundidade/estêncil em um sombreador, gerar um cubemap dinâmico em uma única passagem e renderizar simultaneamente para várias fatias de um volume.

Interface de recurso Descrição
ID3D11DepthStencilView Acesse um recurso de textura durante o teste de estêncil de profundidade.
ID3D11RenderTargetView Acesse um recurso de textura usado como um destino de renderização.
ID3D11ShaderResourceView Acesse um recurso de sombreador, como um buffer constante, um buffer de textura, uma textura ou um sampler.
ID3D11UnorderedAccessView Acesse um recurso não ordenado usando um sombreador de pixel ou um sombreador de computação.

 

Exibições brutas de buffers

Você pode pensar em um buffer bruto, que também pode ser chamado de buffer de endereço de bytes, como um recipiente de bits aos quais você deseja acesso bruto, ou seja, um buffer que você pode acessar convenientemente por meio de partes de um a quatro valores de endereço sem tipo de 32 bits. Você indica que deseja acesso bruto a um buffer (ou, uma exibição bruta de um buffer) ao chamar um dos seguintes métodos para criar uma exibição para o buffer:

Você pode usar os tipos de objeto HLSL ByteAddressBuffer e RWByteAddressBuffer quando trabalha com buffers brutos.

Para criar uma exibição bruta para um buffer, você deve primeiro chamar ID3D11Device::CreateBuffer com o sinalizador D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS para criar o recurso de buffer subjacente. Especifique esse sinalizador no membro MiscFlags da estrutura D3D11_BUFFER_DESC à qual o parâmetro pDesc de ID3D11Device::CreateBuffer aponta. Não é possível combinar o sinalizador de D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS com D3D11_RESOURCE_MISC_BUFFER_STRUCTURED. Além disso, se você especificar D3D11_BIND_CONSTANT_BUFFER em BindFlags de D3D11_BUFFER_DESC, também não poderá especificar D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS em MiscFlags. Essa não é uma limitação apenas de exibições brutas porque os buffers constantes já têm uma restrição que não podem ser combinadas com nenhuma outra exibição.

Além dos casos inválidos anteriores, ao criar um buffer com D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS, você não está limitado na funcionalidade em vez de não definir D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS. Ou seja, você pode usar esse buffer para acesso não bruto de várias maneiras possíveis com o Direct3D. Se você especificar o sinalizador D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS , só aumentará a funcionalidade disponível.

Recursos

Novos tipos de recursos