Udostępnij przez


Podźródła (grafika Direct3D 12)

Opisuje sposób dzielenia zasobu na podźródła oraz sposób odwołowania się do jednego, wielu lub fragmentów podźródła.

Przykładowe podźródła

Jeśli zasób zawiera bufor, po prostu zawiera jeden podźródło z indeksem 0. Jeśli zasób zawiera teksturę (lub tablicę tekstur), odwołanie do podźródła jest bardziej złożone.

Niektóre interfejsy API uzyskują dostęp do całego zasobu (na przykład ID3D12GraphicsCommandList::CopyResource method), inne uzyskują dostęp do części zasobu (na przykład ID3D12Resource::ReadFromSubresource). Metody, które uzyskują dostęp do części zasobu, zazwyczaj używają opisu widoku (takiego jak struktura D3D12_TEX2D_ARRAY_SRV), aby określić podźródła dostępu. Aby uzyskać pełną listę, zapoznaj się z sekcją interfejsów API subresource.

Indeksowanie podźródła

Aby zaindeksować określony podźródło, poziomy mip są indeksowane najpierw, gdy każdy wpis tablicy jest indeksowany.

indeksowania podźródła

Fragmentator mip

Wycinek mip zawiera jeden poziom mipmap dla każdej tekstury w tablicy, jak pokazano na poniższej ilustracji.

fragmentacje mip podźródła

Wycinek tablicy

Biorąc pod uwagę tablicę tekstur, każda tekstura z mipmapami, wycinek tablicy zawiera jedną teksturę i wszystkie jej poziomy mip, jak pokazano na poniższej ilustracji.

wycinki tablicy podrzędnej

Wycinek płaszczyzny

Zazwyczaj formaty planarne nie są używane do przechowywania danych RGBA, ale w przypadkach, w których jest to (być może 24bpp danych RGB), jedna płaszczyzna może reprezentować czerwony obraz, jeden zielony i jeden niebieski obraz. Jeden samolot nie musi mieć jednego koloru, dwa lub więcej kolorów można połączyć w jedną płaszczyznę. Bardziej typowe dane planarne są używane w przypadku danych YCbCr z pod próbkami i Depth-Stencil. Depth-Stencil jest jedynym formatem, który w pełni obsługuje mipmapy, tablice i wiele płaszczyzn (często płaszczyzna 0 dla głębokości i płaszczyzny 1 dla wzornika).

Poniżej przedstawiono indeksowanie podźródła dla tablicy dwóch obrazów Depth-Stencil, z których każdy ma trzy poziomy mip.

indeksowanie wzornika głębokości

Sub-sampled YCbCr obsługuje tablice i ma płaszczyzny, ale nie obsługuje map mip. Obrazy YCbCr mają dwa płaszczyzny, jeden dla luminance (Y), że ludzkie oko jest najbardziej wrażliwe na, a jeden dla chrominance (zarówno Cb, jak i Cr, przeplatane), do którego ludzkie oko jest mniej wrażliwe. Ten format umożliwia kompresję wartości chrominance w celu skompresowania obrazu bez wpływu na lumincję i jest typowym formatem kompresji wideo z tego powodu, chociaż jest używany do kompresowania obrazów nadal. Na poniższej ilustracji przedstawiono format NV12, zauważając, że chrominance został skompresowany do jednej czwartej rozdzielczości luminance, co oznacza, że szerokość każdej płaszczyzny jest taka sama, a płaszczyzna chrominance jest połowę wysokości płaszczyzny luminacji. Płaszczyzny będą indeksowane jako podźródła w identyczny sposób jak w powyższym przykładzie Depth-Stencil.

formatu nv12

Formaty planarne istniały w trybie Direct3D 11, ale poszczególne płaszczyzny nie mogły być rozwiązane indywidualnie, na przykład w przypadku operacji kopiowania lub mapowania. Ta zmiana została zmieniona w trybie Direct3D 12, tak aby każdy samolot otrzymał własny identyfikator podźródła. Porównaj następujące dwie metody obliczania identyfikatora podźródła.

Direct3D 11

inline UINT D3D11CalcSubresource( UINT MipSlice, UINT ArraySlice, UINT MipLevels )
{
    return MipSlice + (ArraySlice * MipLevels); 
}

Direct3D 12

inline UINT D3D12CalcSubresource( UINT MipSlice, UINT ArraySlice, UINT PlaneSlice, UINT MipLevels, UINT ArraySize )
{ 
    return MipSlice + (ArraySlice * MipLevels) + (PlaneSlice * MipLevels * ArraySize); 
}

Większość sprzętu zakłada, że pamięć dla płaszczyzny N jest zawsze natychmiast przydzielana po płaszczyźnie N-1.

Alternatywą dla używania podźródła jest to, że aplikacja może przydzielić całkowicie oddzielny zasób na płaszczyznę. W takim przypadku aplikacja rozumie, że dane są planarne i używa wielu zasobów do reprezentowania.

Wiele podźródła

Widok cieniowania zasobów może wybrać dowolny prostokątny region podźródła, używając jednego z wycinków opisanych powyżej i rozsądnego użycia pól w strukturach widoków (takich jak D3D12_TEX2D_ARRAY_SRV), jak pokazano na obrazie.

wyboru wielu podźródła

Widok elementu docelowego renderowania może używać tylko jednego podźródła lub fragmentatora mip i nie może zawierać podźródła z więcej niż jednego wycinka mip. Oznacza to, że każda tekstura w widoku render-target musi mieć taki sam rozmiar. Widok cieniowania zasobów może wybrać dowolny prostokątny region podźródła, jak pokazano na obrazie.

Interfejsy API podźródła

Następujące interfejsy API odwołują się do podźródła i pracują z podźródami:

Wyliczenia:

Poniższe struktury zawierają indeksy PlaneSlice, większość zawiera indeksy MipSlice.

Poniższe struktury zawierają indeksy ArraySlice, większość zawiera indeksy MipSlice.

Poniższe struktury zawierają indeksy mipSlice, ale ani ArraySlice, ani PlaneSlice indeksy.

Następujące struktury odwołują się również do podźródła:

Metody:

Tekstury muszą być w stanie D3D12_RESOURCE_STATE_COMMON, aby dostęp do procesora CPU za pośrednictwem WriteToSubresource i ReadFromSubresource być legalne; ale nie. Dostęp procesora CPU do zasobu jest zwykle wykonywany za pośrednictwem Mapowanie/Unmap.

powiązania zasobów