Udostępnij przez


Rysunek pośredni

Rysowanie pośrednie umożliwia przeniesienie niektórych operacji przeszukiwania sceny i odrzucania z CPU do GPU, co może poprawić wydajność. Bufor poleceń może być generowany przez procesor CPU lub procesor GPU.

Podpisy poleceń

Obiekt sygnatury polecenia (ID3D12CommandSignature) umożliwia aplikacjom określanie rysunku pośredniego, w szczególności ustawienie następujących ustawień:

Podczas uruchamiania aplikacja tworzy niewielki zestaw podpisów poleceń . W czasie wykonywania aplikacja wypełnia bufor poleceniami (za pośrednictwem dowolnego sposobu, w jaki wybiera deweloper aplikacji). Polecenia opcjonalnie zawierające stan ustawiany dla widoków buforu wierzchołka, widoków buforu indeksu, stałych głównych i deskryptorów głównych (nieprzetworzonych lub ustrukturyzowanych SRV/UAV/CBVs). Te układy argumentów nie są specyficzne dla sprzętu, więc aplikacje mogą generować bufery bezpośrednio. Podpis polecenia dziedziczy pozostały stan z listy poleceń. Następnie aplikacja wywołuje ExecuteIndirect, aby poinstruować procesor GPU, aby interpretował zawartość pośredniego buforu argumentów zgodnie z formatem zdefiniowanym przez określony podpis polecenia.

Jeśli podpis polecenia zmieni jakiekolwiek argumenty główne, to jest przechowywane w podpisie polecenia jako część podpisu głównego.

Po zakończeniu wykonywania żaden stan sygnatury polecenia nie przenika z powrotem do listy poleceń. Jednak po ExecuteIndirectwszystkie powiązania są resetowane do znanych wartości. W szczególności:

  • Jeśli podpis polecenia wiąże bufor wierzchołka z określonym miejscem, po wywołaniu ExecuteIndirect bufor wierzchołka NULL jest powiązany z tym miejscem.
  • Jeśli podpis polecenia wiąże bufor indeksu, to po wykonaniu ExecuteIndirectzostaje powiązany bufor indeksu NULL.
  • Jeśli podpis polecenia ustawia stałą główną, po wywołaniu ExecuteIndirect wartość stałej głównej jest ustawiona na 0.
  • Jeśli podpis polecenia ustawia widok główny (CBV/SRV/UAV), po wywołaniu ExecuteIndirect zostanie ustawiony widok główny na widok NULL.

Jako przykład używania podpisów poleceń: załóżmy, że deweloper aplikacji chce, aby w buforze argumentów pośrednich określono unikatową stałą główną dla każdego wywołania rysowania. Aplikacja utworzy sygnaturę polecenia, która umożliwia buforowi argumentów pośredniego zdefiniowanie następujących parametrów na wywołanie rysowania.

  • Wartość jednej stałej głównej.
  • Argumenty rysowania (liczba wierzchołków, liczba instancji itp.).

Bufor argumentu pośredniego wygenerowany przez aplikację zawiera tablicę rekordów o stałym rozmiarze. Każda struktura odpowiada jednemu wywołaniu rysowania. Każda struktura zawiera argumenty rysowania i wartość stałej bazowej. Liczba wywołań rysowania jest określona w oddzielnym buforze widocznym dla GPU.

Przykładowy bufor polecenia wygenerowany przez aplikację jest następujący:

Struktury bufora argumentów pośrednich

Poniższe struktury definiują sposób wyświetlania określonych argumentów w buforze argumentów pośrednich. Te struktury nie są wyświetlane w żadnym interfejsie API D3D12. Aplikacje używają tych definicji podczas zapisywania w buforze argumentów pośrednich (CPU lub GPU):

Tworzenie podpisu polecenia

Aby utworzyć podpis polecenia, użyj następujących elementów interfejsu API:

Kolejność argumentów w buforze argumentów pośrednich jest definiowana tak, aby dokładnie odpowiadała kolejności argumentów określonych w parametrze pArgumentsD3D12_COMMAND_SIGNATURE_DESC. Wszystkie argumenty dla jednego wywołania renderowania/uruchamiania obliczeń w buforze argumentów pośrednich są ściśle pakowane. Jednak aplikacje mogą określać dowolny krok bajtowy między poleceniami draw/dispatch w buforze argumentów pośrednich.

Podpis bazowy musi być określony wtedy i tylko wtedy, gdy podpis polecenia zmienia jeden z argumentów bazowych.

Dla root SRV/UAV/CBV, określona przez aplikację wielkość jest wyrażona w bajtach. Warstwa debugowania zweryfikuje następujące ograniczenia dotyczące adresu:

  • CBV — adres musi zawierać wielokrotność 256 bajtów.
  • Nieprzetworzone SRV/UAV — adres musi mieć wielokrotność 4 bajtów.
  • Ustrukturyzowane SRV/UAV — adres musi być wielokrotnością odstępu bajtowego struktury (zadeklarowanego w shaderze).

Dany podpis polecenia jest rysowaniem lub podpisem polecenia obliczeniowego. Jeśli podpis polecenia zawiera operację rysunku, jest to podpis polecenia grafiki. W przeciwnym razie podpis polecenia musi zawierać operację wysyłania i jest to podpis polecenia obliczeniowego.

W poniższych sekcjach przedstawiono przykładowe podpisy poleceń.

Brak zmian argumentów

W tym przykładzie bufor argumentu pośredniego wygenerowany przez aplikację zawiera tablicę struktur 36-bajtowych. Każda struktura zawiera tylko pięć parametrów przekazanych do DrawIndexedInstanced (plus dopełnienie).

Kod do utworzenia opisu podpisu polecenia jest następujący:

D3D12_INDIRECT_ARGUMENT_DESC Args[1];
Args[0].Type = D3D12_INDIRECT_ARGUMENT_TYPE_DRAW_INDEXED;

D3D12_COMMAND_SIGNATURE_DESC ProgramDesc;
ProgramDesc.ByteStride = 36;
ProgramDesc.NumArgumentDescs = 1;
ProgramDesc.pArguments = Args;

Układ pojedynczej struktury w buforze argumentu pośredniego to:

Bajty Opis
0:3 IndexCountPerInstance
4:7 LiczbaInstancji
8:11 StartIndexLocation
12:15 BaseVertexLocation
16:19 StartInstanceLocation
20:35 Dopełnienie

 

Stałe bazowe i bufory wierzchołków

W tym przykładzie każda struktura w buforze argumentów pośrednich zmienia dwie stałe główne, zmienia jedno powiązanie bufora wierzchołka i wykonuje jedną operację nieindeksowaną. Nie ma przestrzeni między strukturami.

Kod umożliwiający utworzenie opisu podpisu polecenia to:

D3D12_INDIRECT_ARGUMENT_DESC Args[4];
Args[0].Type = D3D12_INDIRECT_ARGUMENT_TYPE_CONSTANT;
Args[0].Constant.RootParameterIndex = 2;
Args[0].Constant.DestOffsetIn32BitValues = 0;
Args[0].Constant.Num32BitValuesToSet = 1;

Args[1].Type = D3D12_INDIRECT_ARGUMENT_TYPE_CONSTANT;
Args[1].Constant.RootParameterIndex = 6;
Args[1].Constant.DestOffsetIn32BitValues = 0;
Args[1].Constant.Num32BitValuesToSet = 1;

Args[2].Type = D3D12_INDIRECT_ARGUMENT_TYPE_VERTEX_BUFFER_VIEW;
Args[2].VertexBuffer.Slot = 3;

Args[3].Type = D3D12_INDIRECT_ARGUMENT_TYPE_DRAW;

D3D12_COMMAND_SIGNATURE_DESC ProgramDesc;
ProgramDesc.ByteStride = 40;
ProgramDesc.NumArgumentDescs = 4;
ProgramDesc.pArguments = Args;

Układ pojedynczej struktury w buforze argumentów pośrednich jest następujący:

Bajty Opis
0:3 Dane dla indeksu parametrów głównych 2
4:7 Dane dla indeksu parametrów głównych 6
8:15 Wirtualny adres VB w gnieździe 3 (64-bitowy)
16:19 Rozmiar VB
20:23 Krok VB
24:27 VertexCountPerInstance
28:31 LiczbaInstancji
32:35 StartVertexLocation
36:39 StartInstanceLocation

 

Zaawansowane samouczki wideo DirectX: realizacja pośredniego i asynchronicznego odcinania GPU

Rysowanie pośrednie i odrzucanie z użyciem GPU: przewodnik po kodzie

Renderowanie