DirectX 12 - De Leonardo da Vinci à Arte Contemporânea

A computação gráfica é uma disciplina extensa e de rápido desenvolvimento. Todos os anos, as interfaces de programação de aplicativos se tornam mais flexíveis, o que lhes permite implementar algoritmos mais complexos de formação e processamento de imagens. No entanto, as possibilidades de gráficos interativos não atingiram o nível dos pacotes de modelagem e visualização em 3D. Tudo isso incentiva a pesquisa ativa nessa área.


imagem


O DirectX 12 é um componente da interface de programação gráfica de alto desempenho. Os principais objetivos da nova interface são reduzir a sobrecarga da CPU do driver, diminuir o nível de abstração de hardware, a capacidade de combinar placas gráficas no nível da API (antes disso, havia apenas soluções CrossFireX, NVIDIA SLI específicas do vendedor). Lançado oficialmente pela Microsoft em julho de 2015.


O artigo é destinado a quem já trabalhou com bibliotecas gráficas (OpenGL, DirectX 11). No entanto, para pessoas que planejam começar a estudar gráficos com a versão 12, também pode ser útil.


Nele, consideraremos os seguintes tĂłpicos:


  • Meio Ambiente
  • Breve descrição do pipeline gráfico
  • Novos recursos do DirectX 12
    1. Estados
    2. Equipas
    3. Sincronização
    4. Anexo de Recursos

Meio Ambiente


DirectX 12 Windows SDK Windows 10. IDE Visual Studio, C++. DirectX, d3d12.h dxgi1_6.h d3d12.lib, dxguid.lib, dxgi.lib, d3dcompiler.lib. Windows SDK. "D3D12 Helper Library" d3dx12.h, boilerplate . d3dx12.h .



, — - . , — . , . . , , . , — , .


, .



, , , , , , . — . , . , , , , . . — (clip space).



— , . . , . , . . ( ). API. , , .



, , , , . .



, (scissor test), (stencil test) (depth test). , . - , . , , . , .


DirectX 11 ( DiretcX 12 )


DirectX 12


DirectX 12.



11 : RSSetState(), OMSetDepthStencilState(), OMSetBlendState(). , . , . , — PSO (Pipeline State Object). : " ", . , , Root Signature ( ).



immideate context. . , DirectX 11 deferred context. DirectX 12 immideate context deferred . deferred command list, .


, : command list, , CPU .


, . , GPU, . , Release() — , .



GPU, DirectX 12 fence, ID3D12Fence . Fence — , GPU . «» , ID3D12CommandQueue::Signal() . ID3D12Fence::SetEventOnCompletion(UINT64 Value, HANDLE hEvent) winapi event. WaitForSingleObject() event- , . GPU , fence , WaitForSingleObject() .



— DirectX.



DirectX 11 : API. , ( ) 5 6 :


ID3D11ShaderResourceView* srvs[] = { 
    texture1->GetShaderResourceView();
    texture2->GetShaderResourceView();
};
context->PSSetShaderResources(5, 2, srvs);

GetShaderResourceView() ID3D11ShaderResourceView.
:


Texture2D texture1 : register(t5);
Texture2D texture2 : register(t6);

, . , . ? GCN ISA, :


All vector memory operations use an image resource constant (T#) that is a 128- or 256-bit value in SGPRs. This constant is sent to the texture cache when the instruction is executed. This constant defines the address, data format, and characteristics of the surface in memory.

, , (128 256-), . , , . , , «» . : (T#), (S#) (V#). Direct3D 12 , , — GPU.



, . — , (GPU , , , , ). — . :


  • Constant buffer views (CBVs)
  • Unordered access views (UAVs)
  • Shader resource views (SRVs)
  • Samplers

CBVs, UAVs, SRVs , — . , .


shader visible . , non shader visible :


  • Render Target Views (RTVs)
  • Depth Stencil Views (DSVs)
  • Stream Output Views (SOVs)

views ( ), non shader visible ( D3D12_DESCRIPTOR_HEAP_FLAGS::D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE ).


view's, (, , ) :


  • Index Buffer View (IBV)
  • Vertex Buffer View (VBV)

D3D12_INDEX_BUFFER_VIEW D3D12_VERTEX_BUFFER_VIEW . Pipeline State Object. PSO .


, ID3D11...View, .


Root signature


Root signature — DirectX 12 API . , , . Root signature , () , .


Root signature , root parameter. root parameter root arguments. root argument, . Root parameter :


  • Root constants (1 DWORD == 32bit value)
  • Inline descriptors ( 64-bit GPU virtual addresses, 2 DWORDs )
  • (1 DWORD)

root signature — 64 DWORDs. , .


Root constant root signature 32- , constant buffer. (, MVP ), ( 4 ). , . : " ".


root signature — inline descriptors. — per object. , . . ( ), GPU. , , ID3D12GraphicsCommandList::SetGraphicsRootConstantBufferView, root parameter inline descriptor .


, . descriptor range. Descriptor range — . :


typedef enum D3D12_DESCRIPTOR_RANGE_TYPE
    {
        D3D12_DESCRIPTOR_RANGE_TYPE_SRV = 0,
        D3D12_DESCRIPTOR_RANGE_TYPE_UAV = ( D3D12_DESCRIPTOR_RANGE_TYPE_SRV + 1 ) ,
        D3D12_DESCRIPTOR_RANGE_TYPE_CBV = ( D3D12_DESCRIPTOR_RANGE_TYPE_UAV + 1 ) ,
        D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER = ( D3D12_DESCRIPTOR_RANGE_TYPE_CBV + 1 ) 
    }   D3D12_DESCRIPTOR_RANGE_TYPE;

typedef struct D3D12_DESCRIPTOR_RANGE
    {
    D3D12_DESCRIPTOR_RANGE_TYPE RangeType;
    UINT NumDescriptors;
    UINT BaseShaderRegister;
//...
    }   D3D12_DESCRIPTOR_RANGE;

, RangeType — , NumDescriptors — , BaseShaderRegister — . . ID3D12GraphicsCommandList::SetGraphicsRootDescriptorTable, root parameter . , , . , descriptor heap.



Examinamos alguns dos recursos do DirectX 12. Se você estiver interessado neste tópico ou em qualquer outra área de computação gráfica, cancele a inscrição nos comentários.


Links:
https://docs.microsoft.com/en-us/windows/win32/direct3d12/directx-12-programming-guide
https://developer.nvidia.com/dx12-dos-and-donts
https: // gpuopen.com/performance-root-signature-descriptor-sets/


All Articles