DirectX 12 - Von Leonardo da Vinci zur zeitgenössischen Kunst

Computergrafik ist eine umfangreiche und sich schnell entwickelnde Disziplin. Jedes Jahr werden Anwendungsprogrammierschnittstellen flexibler, wodurch komplexere Algorithmen zur Bilderzeugung und -verarbeitung implementiert werden können. Die Möglichkeiten interaktiver Grafiken haben jedoch nicht das Niveau von 3D-Modellierungs- und Visualisierungspaketen erreicht. All dies fördert die aktive Forschung auf diesem Gebiet.


Bild


DirectX 12 ist eine Komponente der Hochleistungs-Grafikprogrammierschnittstelle. Die Hauptziele der neuen Schnittstelle sind die Reduzierung des CPU-Overheads des Treibers, die Verringerung der Hardware-Abstraktion und die Möglichkeit, Grafikkarten auf API-Ebene zu kombinieren (zuvor gab es nur herstellerspezifische CrossFireX-, NVIDIA SLI-Lösungen). Offiziell von Microsoft im Juli 2015 veröffentlicht.


Der Artikel richtet sich an Personen, die bereits mit Grafikbibliotheken (OpenGL, DirectX 11) gearbeitet haben. FĂŒr Leute, die Grafik mit Version 12 studieren möchten, kann dies jedoch auch nĂŒtzlich sein.


Darin werden wir folgende Themen betrachten:


  • Umgebung
  • Kurze Beschreibung der grafischen Pipeline
  • Neue DirectX 12-Funktionen
    1. ZustÀnde
    2. Teams
    3. Synchronisation
    4. Ressourcenanhang

Umgebung


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.



Wir haben einige der Funktionen von DirectX 12 untersucht. Wenn Sie an diesem Thema oder einem anderen Bereich der Computergrafik interessiert sind, melden Sie sich in den Kommentaren ab.


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