Sous-ressources (graphismes Direct3D 12)

Décrit comment une ressource est divisée en sous-ressources et comment référencer une seule, plusieurs ou tranches de sous-ressources.

Exemples de sous-ressources

Si une ressource contient une mémoire tampon, elle contient simplement une sous-ressource avec un index de 0. Si la ressource contient une texture (ou un tableau de textures), le référencement des sous-ressources est plus complexe.

Certaines API accèdent à une ressource entière (par exemple, la méthode ID3D12GraphicsCommandList::CopyResource ), d’autres accèdent à une partie d’une ressource (par exemple la méthode ID3D12Resource::ReadFromSubresource ). Les méthodes qui accèdent à une partie d’une ressource utilisent généralement une description d’affichage (telle que la structure D3D12_TEX2D_ARRAY_SRV ) pour spécifier les sous-ressources auxquelles accéder. Pour obtenir la liste complète, reportez-vous à la section API de sous-ressources .

Indexation des sous-ressources

Pour indexer une sous-ressource particulière, les niveaux mip sont indexés en premier à mesure que chaque entrée de tableau est indexée.

indexation des sous-ressources

Tranche Mip

Une tranche mip comprend un niveau de mipmap pour chaque texture d’un tableau, comme illustré dans l’image suivante.

tranches de sous-ressource mip

Tranche de tableau

Étant donné un tableau de textures, chaque texture avec des mipmaps, une tranche de tableau comprend une texture et tous ses niveaux mip, comme illustré dans l’image suivante.

tranches de tableau de sous-ressources

Tranche de plan

En règle générale, les formats planaires ne sont pas utilisés pour stocker des données RVBA, mais dans les cas où elles sont (peut-être des données RVB de 24 bpp), un plan peut représenter l’image rouge, l’un le vert et l’autre l’image bleue. Toutefois, un plan n’est pas nécessairement une couleur, deux couleurs ou plus peuvent être combinées en un seul plan. Plus généralement, les données planaires sont utilisées pour les données YCbCr et Depth-Stencil sous-échantillonnées. Depth-Stencil est le seul format qui prend entièrement en charge les mipmaps, les tableaux et plusieurs plans (souvent le plan 0 pour Depth et le plan 1 pour Stencil).

L’indexation des sous-ressources pour un tableau de deux images Depth-Stencil, chacune avec trois niveaux mip, est illustrée ci-dessous.

indexation du gabarit de profondeur

YCbCr sous-échantillonné prend en charge les tableaux et a des plans, mais ne prend pas en charge les mipmaps. Les images YCbCr ont deux plans, l’un pour la luminance (Y) à laquelle l’œil humain est le plus sensible, et l’autre pour la chrominance (à la fois Cb, et Cr, entrelacé) à laquelle l’œil humain est moins sensible. Ce format permet la compression des valeurs de chrominance afin de compresser une image sans affecter la luminosité. Il s’agit d’un format de compression vidéo courant pour cette raison, bien qu’il soit utilisé pour compresser des images fixes. L’image ci-dessous montre le format NV12, notant que la chrominance a été compressée à un quart de la résolution de la luminance, ce qui signifie que la largeur de chaque plan est identique et que le plan de chrominance est la moitié de la hauteur du plan de luminance. Les plans sont indexés en tant que sous-ressources d’une manière identique à l’exemple Depth-Stencil ci-dessus.

format nv12

Les formats planaires existaient dans Direct3D 11, mais les plans individuels ne pouvaient pas être traités individuellement, par exemple pour les opérations de copie ou de mappage. Cela a été modifié dans Direct3D 12 afin que chaque plan reçoive son propre ID de sous-ressource. Comparez les deux méthodes suivantes pour calculer l’ID de sous-ressource.

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); 
}

La plupart du matériel suppose que la mémoire du plan N est toujours allouée immédiatement après le plan N-1.

Une alternative à l’utilisation de sous-ressources est qu’une application peut allouer une ressource complètement distincte par plan. Dans ce cas, l’application comprend que les données sont planaires et utilise plusieurs ressources pour les représenter.

Plusieurs sous-ressources

Une vue nuanceur-ressource peut sélectionner n’importe quelle région rectangulaire de sous-ressources, à l’aide de l’une des tranches décrites ci-dessus et de l’utilisation judicieuse des champs dans les structures d’affichage (telles que D3D12_TEX2D_ARRAY_SRV), comme illustré dans l’image.

sélection de plusieurs sous-ressources

Une vue de cible de rendu ne peut utiliser qu’une seule sous-ressource ou tranche mip et ne peut pas inclure de sous-ressources de plusieurs tranches mip. Autrement dit, chaque texture d’une vue de cible de rendu doit avoir la même taille. Une vue nuanceur-ressource peut sélectionner n’importe quelle région rectangulaire de sous-ressources, comme illustré dans l’image.

API de sous-ressource

Les API suivantes référencent et fonctionnent avec des sous-ressources :

Énumérations :

Les structures suivantes contiennent des index PlaneSlice , la plupart contiennent des index MipSlice .

Les structures suivantes contiennent des index ArraySlice , la plupart contiennent des index MipSlice .

Les structures suivantes contiennent des index MipSlice , mais ni arraySlice ni des index PlaneSlice .

Les structures suivantes font également référence à des sous-ressources :

Méthodes :

Les textures doivent être à l’état D3D12_RESOURCE_STATE_COMMON pour que l’accès au processeur via WriteToSubresource et ReadFromSubresource soit légal ; mais pas les mémoires tampons. L’accès du processeur à une ressource s’effectue généralement via Map/Unmap.

Liaison de ressources