Podsourcy (grafika Direct3D 12)
Popisuje, jak je prostředek rozdělený do podsourců a jak odkazovat na jeden, více nebo řez dílčích zdrojů.
-
příkladu podsourců
- indexování subresource
- průřez mip
- průřez pole
- průřez roviny
- více podsourců
- rozhraní API dílčího zdroje
- související témata
Příklady podsourců
Pokud prostředek obsahuje vyrovnávací paměť, jednoduše obsahuje jeden dílčí zdroj s indexem 0. Pokud prostředek obsahuje texturu (nebo pole textury), je odkazování na dílčí zdroje složitější.
Některá rozhraní API přistupují k celému prostředku (například ID3D12GraphicsCommandList::CopyResource metoda), jiní přistupují k části prostředku (například ID3D12Resource::ReadFromSubresource metoda). Metody, které přistupují k části prostředku, obvykle používají popis zobrazení (například strukturu D3D12_TEX2D_ARRAY_SRV) k určení dílčích zdrojů pro přístup. Úplný seznam najdete v části rozhraní API subresource.
Indexování podsourců
Pokud chcete indexovat konkrétní dílčí zdroj, úrovně mip se indexují jako první, protože každá položka pole je indexována.
indexování dílčího zdroje
Řez mip
Řez mip zahrnuje jednu úroveň mapy mipmap pro každou texturu v poli, jak je znázorněno na následujícím obrázku.
dílčích zdrojů průřezů mip
Maticový řez
Vzhledem k poli textur, každá textura s mipmapami, maticový řez obsahuje jednu texturu a všechny její úrovně mip, jak je znázorněno na následujícím obrázku.
Řez roviny
Obvykle se k ukládání dat RGBA nepoužívají planární formáty, ale v případech, kdy se jedná (třeba 24bpp data RGB), jedna rovina může představovat červený obrázek, jeden zelený a jeden modrý obrázek. Jedna rovina sice nemusí být nutně jedna barva, dvě nebo více barev by se daly zkombinovat do jedné roviny. Pro data YCbCr a Depth-Stencil se obvykle používají planární data. Depth-Stencil je jediný formát, který plně podporuje mipmapy, pole a více rovin (často rovina 0 pro hloubku a rovinu 1 pro vzorník).
Níže je znázorněno indexování podsourcu pro pole dvou Depth-Stencil obrázků, z nichž každý má tři úrovně mip.
indexování vzorníku hloubky
Sub-sampled YCbCr podporuje pole a má roviny, ale nepodporuje mipmapy. Obrázky YCbCr mají dvě roviny, jednu pro světelnost (Y), na kterou je lidské oko nejcitlivější, a jeden pro chrominance (jak Cb, tak Cr, prokládání), na které je lidské oko méně citlivé. Tento formát umožňuje kompresi hodnot chrominance, aby bylo možné komprimovat obrázek, aniž by to mělo vliv na světelnost, a je to běžný formát komprese videa z tohoto důvodu, i když se používá ke komprimaci obrázků. Následující obrázek ukazuje formát NV12, který označuje, že chrominance byl komprimován na jednu čtvrtinu rozlišení světelnosti, což znamená, že šířka každé roviny je stejná a rovina chrominance je poloviční výškou roviny světelnosti. Roviny by se indexovaly jako dílčí zdroje stejným způsobem jako Depth-Stencil příklad výše.
formátu nv12
V Direct3D 11 existovaly planární formáty, ale jednotlivé roviny nelze řešit jednotlivě, například pro operace kopírování nebo mapování. To se změnilo v Direct3D 12 tak, aby každá rovina přijala vlastní ID podsourcu. Porovnejte následující dvě metody výpočtu ID podsourcu.
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);
}
Většina hardwaru předpokládá, že paměť pro rovinu N je vždy okamžitě přidělena po rovině N-1.
Alternativou k použití dílčích zdrojů je, že aplikace může přidělit zcela samostatný prostředek na každou rovinu. V tomto případě aplikace chápe, že data jsou planar a používá k reprezentaci více prostředků.
Více podsourců
Zobrazení shaderu prostředků může vybrat libovolnou obdélníkovou oblast podsourců, a to pomocí jednoho z výsečí popsaných výše a uvážlivého použití polí ve strukturách zobrazení (například D3D12_TEX2D_ARRAY_SRV), jak je znázorněno na obrázku.
výběru podsourcu
Zobrazení cíle vykreslování může používat pouze jeden dílčí zdroj nebo řez mip a nemůže obsahovat podsourcy z více než jednoho řezu mip. To znamená, že každá textura v zobrazení cíle vykreslování musí mít stejnou velikost. Zobrazení shaderu prostředků může vybrat libovolnou obdélníkovou oblast podsourců, jak je znázorněno na obrázku.
Rozhraní API pro podsourcové zdroje
Následující rozhraní API odkazují na dílčí zdroje a pracují s těmito zdroji:
Vyčíslení:
Následující struktury obsahují indexy PlaneSlice, většina obsahuje indexy MipSlice.
- D3D12_TEX2D_RTV
- D3D12_TEX2D_ARRAY_RTV
- D3D12_TEX2D_SRV
- D3D12_TEX2D_ARRAY_SRV
- D3D12_TEX2D_UAV
- D3D12_TEX2D_ARRAY_UAV
Následující struktury obsahují indexy ArraySlice, většina obsahuje indexy MipSlice indexy.
- D3D12_TEX1D_ARRAY_DSV
- D3D12_TEX2D_ARRAY_DSV
- D3D12_TEX2DMS_ARRAY_DSV
- D3D12_TEX1D_ARRAY_RTV
- D3D12_TEX2D_ARRAY_RTV
- D3D12_TEX2DMS_ARRAY_RTV
- D3D12_TEX1D_ARRAY_SRV
- D3D12_TEX2D_ARRAY_SRV
- D3D12_TEX2DMS_ARRAY_SRV
- D3D12_TEX1D_ARRAY_UAV
- D3D12_TEX2D_ARRAY_UAV
Následující struktury obsahují indexy MipSlice, ale ani ArraySlice ani PlaneSlice indexy.
Následující struktury také odkazují na dílčí zdroje:
- D3D12_DISCARD_REGION: struktura použitá při přípravě na zahození prostředku.
- D3D12_PLACED_SUBRESOURCE_FOOTPRINT: přidá posun do prostředku do základní stopy.
- D3D12_RESOURCE_TRANSITION_BARRIER : popisuje přechod podsourců mezi různými použitími (prostředek shaderu, cíl vykreslení atd.).
- D3D12_SUBRESOURCE_DATA: data podsourcu zahrnují samotná data a rozteč řádků a řezů.
- D3D12_SUBRESOURCE_FOOTPRINT: Stopa zahrnuje formát, šířku, výšku, hloubku a výšku řádku podsourcu.
- D3D12_SUBRESOURCE_INFO : obsahuje posun, výšku řádku a hloubku rozteče podsourcu.
- D3D12_SUBRESOURCE_TILING: popisuje svazek podsítě dlaždic (viz prostředky s dlaždicemi svazku).
- D3D12_TEXTURE_COPY_LOCATION : popisuje část textury pro účely kopírování.
- D3D12_TILED_RESOURCE_COORDINATE : popisuje souřadnice dlaždicového prostředku.
Metody:
- ID3D12Device::GetCopyableFootprints: získá informace o prostředku, aby bylo možné vytvořit kopii.
- ID3D12Device::GetResourceTiling: získá informace o tom, jak je dlaždicový prostředek rozdělený na dlaždice.
- ID3D12GraphicsCommandList::ResolveSubresource: zkopíruje vícevláknový dílčí zdroj do jiného než multi-sampled subresource.
- ID3D12Resource::Map: vrátí ukazatel na zadaná data v prostředku a odmítne přístup GPU k podsourcu.
- ID3D12Resource::ReadFromSubresource: kopíruje data z podsourcu nebo obdélníkovou oblast podsourcu.
- ID3D12Resource::Unmap: zruší mapování zadaného rozsahu paměti a zruší platnost ukazatele na prostředek. Obnoví přístup GPU k podsourcu.
- ID3D12Resource::WriteToSubresource: zkopíruje data do podsourcu nebo obdélníkové oblasti podsourcu.
Textury musí být v D3D12_RESOURCE_STATE_COMMON stavu pro přístup k procesoru prostřednictvím WriteToSubresource a ReadFromSubresource být legální; ale vyrovnávací paměti ne. Přístup procesoru k prostředku se obvykle provádí prostřednictvím map/Unmap .
Související témata