Notícias
Novos modelos de linguagem da API Serverspace GPT
Serverspace Black Friday
DF
Daniil Fedorov
março 19, 2025
Atualizado março 19, 2025

Descriptor Heaps

Descriptor Heaps são um dos principais mecanismos de gerenciamento de recursos na API gráfica Direct3D 12. Eles representam arrays de descritores de recursos, simplificando e acelerando o acesso aos dados durante a renderização.

Conceitos Principais

No Direct3D 12, os descritores são usados para representar recursos como texturas, buffers e samplers. Um Descriptor Heap é uma área especial de memória que contém esses descritores, permitindo que a GPU acesse rapidamente os dados necessários.

Tipos de Descriptor Heaps

O Direct3D 12 fornece quatro tipos de Descriptor Heaps:

  1. CBV/SRV/UAV Heap – Armazena os seguintes descritores:
    • CBV (Constant Buffer View) – Representa buffers constantes.
    • SRV (Shader Resource View) – Representa recursos usados em shaders (como texturas e buffers estruturados).
    • UAV (Unordered Access View) – Representa recursos que podem ser acessados em qualquer ordem (por exemplo, para cálculos em Compute Shader).
  2. Sampler Heap – Contém descritores de samplers, que controlam a filtragem e o endereçamento de texturas.
  3. RTV Heap (Render Target View) – Armazena descritores de render targets (RTVs), usados como buffers de saída de renderização.
  4. DSV Heap (Depth Stencil View) – Contém descritores para buffers de profundidade e stencil (DSVs), responsáveis por testes de profundidade e operações de stencil.

Criação e Uso de Descriptor Heaps

Para criar um Descriptor Heap, usa-se a estrutura D3D12_DESCRIPTOR_HEAP_DESC, onde são definidos os seguintes parâmetros:

  • Tipo do Heap (Type – CBV_SRV_UAV, SAMPLER, RTV, DSV).
  • Número de descritores (NumDescriptors).
  • Flags (Flags – por exemplo, D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE, caso o heap deva estar acessível nos shaders).
  • Máscara de nó (NodeMask) para sistemas com múltiplos adaptadores.

Exemplo de criação de um descriptor heap para RTV:

D3D12_DESCRIPTOR_HEAP_DESC renderTargetHeapDesc = {};
renderTargetHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;
renderTargetHeapDesc.NumDescriptors = 1;
renderTargetHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
device->CreateDescriptorHeap(&renderTargetHeapDesc, IID_PPV_ARGS(&rtvHeap));

Gerenciamento de Descritores

Após criar um Descriptor Heap, é necessário alocar descritores para os recursos. Isso pode ser feito com device->Create...View, por exemplo:

device->CreateRenderTargetView(renderTarget, nullptr, rtvHeap->GetCPUDescriptorHandleForHeapStart());

Aqui, GetCPUDescriptorHandleForHeapStart() retorna um D3D12_CPU_DESCRIPTOR_HANDLE que aponta para o início do heap.

Se o heap for utilizado em shaders, ele deve ser configurado com SetDescriptorHeaps e vinculado às tabelas de descritores usando SetGraphicsRootDescriptorTable ou SetComputeRootDescriptorTable.

Conclusão

Os Descriptor Heaps desempenham um papel fundamental no gerenciamento de recursos no Direct3D 12, oferecendo um mecanismo flexível e eficiente para acessar dados. O uso adequado dos Descriptor Heaps pode melhorar significativamente o desempenho da GPU e otimizar a eficiência da renderização.

Usamos cookies para melhorar sua experiência no Serverspace. Ao continuar a navegar em nosso site, você concorda com o Uso de Cookies e com a Política de Privacidade.