DirectX 12: de Leonardo da Vinci al arte contemporáneo

Los gráficos por computadora son una disciplina extensa y de rápido desarrollo. Cada año, las interfaces de programación de aplicaciones se vuelven más flexibles, lo que les permite implementar algoritmos de procesamiento y formación de imágenes más complejos. Sin embargo, las posibilidades de los gráficos interactivos no han alcanzado el nivel de los paquetes de modelado y visualización en 3D. Todo esto fomenta la investigación activa en esta área.


imagen


DirectX 12 es un componente de la interfaz de programación de gráficos de alto rendimiento. Los objetivos principales de la nueva interfaz son reducir la sobrecarga de CPU del controlador, disminuir el nivel de abstracción de hardware, la capacidad de combinar tarjetas gráficas a nivel API (antes de eso solo había soluciones CrossFireX, NVIDIA SLI específicas del vendedor). Lanzado oficialmente por Microsoft en julio de 2015.


El artículo está destinado a aquellos que ya han trabajado con bibliotecas gráficas (OpenGL, DirectX 11). Sin embargo, para las personas que planean comenzar a estudiar gráficos con la versión 12, también puede ser útil.


En él, consideraremos los siguientes temas:


  • Medio ambiente
  • Breve descripción de la tubería gráfica.
  • Nuevas características de DirectX 12
    1. Estados
    2. Equipos
    3. Sincronización
    4. Adjunto de recursos

Medio 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 algunas de las características de DirectX 12. Si está interesado en este tema o en cualquier otra área de gráficos por computadora, anule la suscripción en los comentarios.


Enlaces:
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