Fonctionnalités d’échantillonnage de texture des ressources de diffusion en continu

Les fonctionnalités d’échantillonnage de texture des ressources de diffusion en continu incluent l’obtention de nuanceurs status des commentaires sur les zones mappées, la vérification si toutes les données consultées ont été mappées dans la ressource, le verrouillage pour aider les nuanceurs à éviter les zones des ressources de diffusion en continu mipmappées qui sont connues pour être non mappées, et la découverte du LOD minimal entièrement mappé pour une empreinte de filtre de texture entière.

Exigences des fonctionnalités d’échantillonnage de texture des ressources de streaming

Les fonctionnalités d’échantillonnage de texture décrites ici nécessitent la prise en charge des ressources de streaming de niveau 2 .

Commentaires de nuanceur status sur les zones mappées

Toute instruction de nuanceur qui lit et/ou écrit dans une ressource de streaming entraîne l’enregistrement des 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 (par exemple, 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 que sur l’utilisation de l’instruction LOD ; par exemple, tex2Dlod) retourne 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 des ressources de diffusion en continu mipmapped qui sont connues pour être non mappées, la plupart des instructions du nuanceur qui impliquent l’utilisation d’un échantillonneur (filtrage) ont un 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 s’exécutemax(fShaderMinLODClamp,fComputedLOD)au même endroit dans le calcul LOD où la pince MinLOD par ressource se produit, 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 de streaming. Par exemple, une surface contenant un texel pour contenir des informations pour chaque vignette d’une ressource de diffusion en continu. Vous pouvez stocker le premier LOD mappé à un emplacement de vignette donné. En échantillonnant soigneusement cette structure de données de la même façon que la ressource de streaming 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 échantillon linéaire avec des coordonnées de texture qui tombent directement sur un centre de texel ; dans ce cas, 3 autres texels (dont ils sont peuvent varier selon le matériel) contribuent au filtre, mais avec un poids 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 prise en charge de cette fonctionnalité dépend de la prise en charge de niveau 2 pour les ressources de streaming.

Accès du pipeline aux ressources de diffusion en continu