Sdílet prostřednictvím


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ří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.

průřezy polí podsourců

Ř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íce 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.

Následující struktury obsahují indexy ArraySlice, většina obsahuje indexy MipSlice indexy.

Následující struktury obsahují indexy MipSlice, ale ani ArraySlice ani PlaneSlice indexy.

Následující struktury také odkazují na dílčí zdroje:

Metody:

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 .

vazby prostředků