Fonctionnalités d’échantillonnage de texture de ressources en mosaïques
Cette section décrit les fonctionnalités d’échantillonnage de texture des ressources en mosaïques.
Exigences des fonctionnalités d’échantillonnage de texture de ressources en mosaïques
Les fonctionnalités d’échantillonnage de texture décrites ici nécessitent le niveau 2 de prise en charge des ressources en mosaïques.
Commentaires du nuanceur sur les zones mappées
Toute instruction de nuanceur qui lit et/ou écrit dans une ressource en mosaïque entraîne l’enregistrement d’informations status. Cette status est exposée en tant que valeur de retour supplémentaire facultative sur chaque instruction d’accès aux ressources qui entre dans un registre temporaire 32 bits. Le contenu de la valeur de retour est opaque. Autrement dit, la lecture directe par le programme de nuanceur est interdite. Toutefois, vous pouvez utiliser la fonction CheckAccessFullyMapped pour extraire les informations status.
Case activée entièrement mappés
La fonction CheckAccessFullyMapped interprète les status retournées à partir d’un accès à la mémoire et indique si toutes les données consultées ont été mappées dans la ressource. CheckAccessFullyMapped retourne true (0xFFFFFFFF) si les données ont été mappées ou false (0x00000000) si les données ont été non mappées.
Pendant les opérations de filtre, parfois le poids d’un texel donné finit par être de 0,0. Par exemple, un exemple linéaire avec des coordonnées de texture qui tombent directement sur un centre de texel : 3 autres texels (lesquels peuvent varier selon le matériel) contribuent au filtre, mais avec une pondération de 0. Ces texels de poids 0 ne contribuent pas du tout au résultat du filtre. Par conséquent, s’ils tombent sur des vignettes NULL , ils ne sont pas comptabilisés comme un accès non mappé. Notez que la même garantie s’applique aux filtres de texture qui incluent plusieurs niveaux mip ; si les texels de l’un des mipmaps ne sont pas mappés, mais que le poids sur ces texels est de 0, ces texels ne sont pas comptabilisés comme un accès non mappé.
Lors de l’échantillonnage à partir d’un format qui a moins de 4 composants (comme DXGI_FORMAT_R8_UNORM), les texels qui tombent sur des vignettes NULL entraînent la création d’un accès mappé NULL , quels que soient les composants que le nuanceur examine réellement dans le résultat. Par exemple, la lecture à partir de R8_UNORM et le masquage du résultat de lecture dans le nuanceur avec .gba/.yzw ne semblent pas avoir besoin de lire la texture du tout. Toutefois, si l’adresse texel est une vignette mappée NULL , l’opération compte toujours comme un accès à la carte NULL .
Le nuanceur peut case activée l’status et suivre la ligne de conduite souhaitée en cas de défaillance. Par exemple, un plan d’action peut être la journalisation des « échecs » (par exemple via l’écriture UAV) et/ou l’émission d’une autre lecture limitée à un LOD plus grossi connu pour être mappé. Une application peut également souhaiter suivre les accès réussis afin d’avoir une idée de la partie du jeu de vignettes mappé qui a été consultée.
Une complication de la journalisation est qu’il n’existe aucun mécanisme pour signaler l’ensemble exact des vignettes qui auraient été consultées. L’application peut effectuer des estimations conservatrices basées sur la connaissance des coordonnées qu’elle a utilisées pour l’accès, ainsi qu’à l’aide de l’instruction LOD (par exemple, tex2Dlod) qui retourne ce qu’est le calcul LOD matériel.
Une autre complication est qu’un grand nombre d’accès seront aux mêmes vignettes, donc beaucoup de journalisation redondante se produira et éventuellement une contention sur la mémoire. Il peut être pratique si le matériel peut avoir la possibilité de ne pas prendre la peine de signaler les accès aux vignettes s’ils ont été signalés ailleurs auparavant. Peut-être que l’état d’un tel suivi pourrait être réinitialisé à partir de l’API (probablement aux limites de l’image).
Pince MinLOD par échantillon
Pour aider les nuanceurs à éviter les zones dans les ressources en mosaïques mipmapped qui sont connues pour être non mappées, la plupart des instructions de nuanceur qui impliquent l’utilisation d’un échantillonneur (filtrage) ont un nouveau mode qui permet au nuanceur de passer un paramètre de pince minLOD float32 supplémentaire à l’exemple de texture. Cette valeur se trouve dans l’espace numérique mipmap de la vue, par opposition à la ressource sous-jacente.
Le matériel effectue max(fShaderMinLODClamp,fComputedLOD) au même endroit dans le calcul LOD où se produit la pince MinLOD par ressource, qui est également un max().
Si le résultat de l’application de la pince LOD par échantillon et de toute autre pince LOD définie dans l’échantillonneur est un jeu vide, le résultat est le même résultat d’accès hors limites que la pince minLOD par ressource : 0 pour les composants au format surface et les valeurs par défaut pour les composants manquants.
L’instruction LOD (par exemple, tex2Dlod), qui précède la pince minLOD par échantillon décrite ici, retourne à la fois un LOD serré et un LOD non sélectionné. Le LOD serré retourné par cette instruction LOD reflète tous les serrages, y compris la pince par ressource, mais pas une pince par échantillon. La pince par échantillon est de toute façon contrôlée et connue par le nuanceur, de sorte que l’auteur du nuanceur peut appliquer manuellement cette pince à la valeur de retour de l’instruction LOD si vous le souhaitez.
Filtrage de réduction minimale/maximale
Les applications peuvent choisir de gérer leurs propres structures de données qui les informent de ce à quoi ressemblent les mappages pour une ressource en mosaïque. Par exemple, une surface contenant un texel pour contenir des informations pour chaque vignette d’une ressource en mosaïque. Vous pouvez stocker le premier LOD mappé à un emplacement de vignette donné. En échantillonnant soigneusement cette structure de données de la même manière que la ressource en mosaïque est destinée à être échantillonnées, vous pouvez découvrir ce que sera le LOD minimal entièrement mappé pour l’ensemble de l’empreinte du filtre de texture. Pour faciliter ce processus, Direct3D 11.2 introduit un nouveau mode d’échantillonnage à usage général, le filtrage min/max.
L’utilité du filtrage min/max pour le suivi LOD peut être utile à d’autres fins, par exemple, le filtrage des surfaces de profondeur.
Le filtrage de réduction min/max est un mode sur les échantillonneurs qui extrait le même ensemble de texels qu’un filtre de texture normal. Mais au lieu de fusionner les valeurs pour produire une réponse, il retourne le min() ou max() des texels extraits, sur une base par composant (par exemple, le min de toutes les valeurs R, séparément de la min de toutes les valeurs G, etc.).
Les opérations min/max suivent les règles de précision arithmétique Direct3D. L’ordre des comparaisons n’a pas d’importance.
Pendant les opérations de filtre qui ne sont pas min/max, parfois le poids d’un texel donné finit par être de 0,0. Par exemple, un exemple linéaire avec des coordonnées de texture qui tombent directement sur un centre de texel - 3 autres texels (dont ceux-ci peuvent varier selon le matériel) contribuent au filtre, mais avec une pondération de 0. Pour l’un de ces texels qui aurait un poids de 0 sur un filtre non min/max, si le filtre est min/max, ces texels ne contribuent toujours pas au résultat (et les pondérations n’affectent pas l’opération de filtre min/max).
La liste complète des modes de filtre s’affiche dans l’énumération D3D11_FILTER avec MINIMUM et MAXIMUM dans les valeurs d’énumération.
La prise en charge de cette fonctionnalité dépend de la prise en charge de niveau 2 pour les ressources en mosaïques.
Rubriques connexes