Partager via


Sous-ressources (Graphiques 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, il 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 à accéder. Reportez-vous à la section API de sous-ressource pour obtenir une liste complète.

Indexation de 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.

l’indexation de sous-ressources

Tranche Mip

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

tranches mip de sous-ressource

Tranche de tableau

Compte tenu d’un tableau de textures, chaque texture avec mipmaps, une tranche de tableau inclut 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 les données RVBA, mais dans les cas où il s’agit (peut-être 24bpp de données RVB), un plan peut représenter l’image rouge, l’un le vert et l’autre l’image bleue. 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 sous-échantillonées et Depth-Stencil donné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 la profondeur et le plan 1 pour le gabarit).

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

d’indexation de gabarit de profondeur

YCbCr sous-échantillonné prend en charge les tableaux et comporte des plans, mais ne prend pas en charge les mipmaps. Les images YCbCr ont deux plans, un pour la luminance (Y) auquel l’œil humain est le plus sensible, et un pour la chrominance (cb, et cr, entrelacé) dont l’œil humain est moins sensible. Ce format permet la compression des valeurs de chrominance afin de compresser une image sans affecter la luminosité et est un format de compression vidéo courant pour cette raison, bien qu’il soit utilisé pour compresser des images toujours. 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 de moitié la hauteur du plan de luminance. Les plans sont indexés sous forme de sous-ressources de manière identique à l’exemple de Depth-Stencil ci-dessus.

le 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 ait reçu son propre ID de sous-source. 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 immédiatement allouée 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 d’une 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 être de 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 font référence et fonctionnent avec les sous-ressources :

Énumérations:

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

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

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

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

Méthode:

Les textures doivent être dans l’état de D3D12_RESOURCE_STATE_COMMON pour l’accès au processeur via writeToSubresource et ReadFromSubresource être légales ; mais les mémoires tampons ne le font pas. L’accès au processeur à une ressource est généralement effectué via Map/Unmap.

de liaison de ressources