Partager via


Étape Output Merger (OM)

L’étape de fusion de sortie (OM) combine différents types de données de sortie (valeurs de nuanceur de pixels, informations de profondeur et de gabarit) avec le contenu de la cible de rendu et des mémoires tampons de profondeur/gabarit pour générer le résultat final du pipeline.

Objectif et utilisations

L’étape de fusion de sortie (OM) est l’étape finale permettant de déterminer quels pixels sont visibles (avec des tests de profondeur et de gabarit) et de fusionner les couleurs des pixels finaux.

L’étape om génère la couleur de pixel rendue finale à l’aide d’une combinaison des éléments suivants :

  • État du pipeline
  • Données de pixels générées par les nuanceurs de pixels
  • Contenu des cibles de rendu
  • Contenu des mémoires tampons de profondeur/gabarit.

Vue d’ensemble de la fusion

La fusion combine une ou plusieurs valeurs de pixels pour créer une couleur de pixel finale. Le diagramme suivant montre le processus impliqué dans la fusion des données de pixels.

diagramme du fonctionnement de la fusion des données

D’un point de vue conceptuel, vous pouvez visualiser cet organigramme implémenté deux fois à l’étape de fusion de sortie : le premier fusionne des données RVB, tandis qu’en parallèle, un second fusionne des données alpha. Pour savoir comment utiliser l’API pour créer et définir l’état de fusion, consultez Configuration des fonctionnalités de fusion.

Le mélange de fonction fixe peut être activé indépendamment pour chaque cible de rendu. Toutefois, il n’existe qu’un seul ensemble de contrôles de fusion, de sorte que le même mélange est appliqué à tous les renderTargets avec la fusion activée. Les valeurs de fusion (y compris BlendFactor) sont toujours limitées à la plage du format de cible de rendu avant la fusion. Le serrage est effectué par cible de rendu, en respectant le type de cible de rendu. La seule exception concerne les formats float16, float11 ou float10 qui ne sont pas limités afin que les opérations de fusion sur ces formats puissent être effectuées avec au moins la même précision/plage que le format de sortie. Les zéros signés et naN sont propagés pour tous les cas (y compris les pondérations de mélange de 0,0).

Lorsque vous utilisez des cibles de rendu sRGB, le runtime convertit la couleur de la cible de rendu en espace linéaire avant d’effectuer le fusion. Le runtime reconvertit la valeur fusionnée finale en espace sRGB avant d’enregistrer la valeur dans la cible de rendu.

Fusion de couleurs double source

Cette fonctionnalité permet à l’étape de fusion de sortie d’utiliser simultanément les deux sorties de nuanceur de pixels (o0 et o1) comme entrées d’une opération de fusion avec la cible de rendu unique à l’emplacement 0. Les opérations de fusion valides incluent : ajouter, soustraire et revsubtract. L’équation de fusion et le masque d’écriture de sortie spécifient les composants que le nuanceur de pixels sort. Les composants supplémentaires sont ignorés.

L’écriture dans d’autres sorties de nuanceur de pixels (o2, o3, etc.) n’est pas définie ; vous ne pouvez pas écrire dans une cible de rendu si elle n’est pas liée à l’emplacement 0. L’écriture d’oDepth est valide lors du mélange de couleurs double source.

Vue d’ensemble des tests de profondeur-gabarit

Une mémoire tampon de profondeur-gabarit, qui est créée en tant que ressource de texture, peut contenir à la fois des données de profondeur et des données de gabarit. Les données de profondeur sont utilisées pour déterminer les pixels les plus proches de l’appareil photo, et les données de gabarit sont utilisées pour masquer les pixels qui peuvent être mis à jour. Au final, les données de valeurs de profondeur et de gabarit sont utilisées par l’étape de fusion de sortie pour déterminer si un pixel doit être dessiné ou non. Le diagramme suivant montre la façon dont le test de profondeur-gabarit est effectué d’un point de vue conceptuel.

diagramme du fonctionnement des tests de profondeur-gabarit

Pour configurer le test de profondeur de gabarit, consultez Configuration des fonctionnalités de Depth-Stencil. Un objet depth-stencil encapsule l’état profondeur-gabarit. Une application peut spécifier l’état profondeur-gabarit, ou la phase om utilise les valeurs par défaut. Les opérations de fusion sont effectuées par pixel si l’échantillonnage multiple est désactivé. Si l’échantillonnage multiple est activé, le mélange se produit sur une base par échantillon multiple.

Le processus d’utilisation de la mémoire tampon de profondeur pour déterminer quel pixel doit être dessiné est appelé mise en mémoire tampon de profondeur, également appelée z-buffering.

Une fois que les valeurs de profondeur atteignent l’étape sortie-fusion (qu’elles proviennent de l’interpolation ou d’un nuanceur de pixels), elles sont toujours limitées : z = min(Viewport.MaxDepth,max(Viewport.MinDepth,z)) en fonction du format/précision de la mémoire tampon de profondeur, à l’aide de règles à virgule flottante. Après le serrage, la valeur de profondeur est comparée (à l’aide de DepthFunc) à la valeur de mémoire tampon de profondeur existante. Si aucune mémoire tampon de profondeur n’est liée, le test de profondeur réussit toujours.

S’il n’existe aucun composant de gabarit dans le format de mémoire tampon de profondeur, ou s’il n’y a pas de limite de mémoire tampon de profondeur, le test de gabarit réussit toujours.

Une seule mémoire tampon de profondeur/gabarit peut être active à la fois ; toute vue de ressource liée doit correspondre (même taille et dimensions) à la vue profondeur/gabarit. Cela ne signifie pas que la taille de la ressource doit correspondre, mais simplement que la taille de l’affichage doit correspondre.

Vue d’ensemble de l’exemple de masque

Un exemple de masque est un masque de couverture multi-échantillonnage 32 bits qui détermine quels exemples sont mis à jour dans les cibles de rendu actives. Un seul exemple de masque est autorisé. Le mappage des bits d’un exemple de masque aux exemples d’une ressource est défini par un utilisateur. Pour le rendu n-sample, les n premiers bits (à partir du LSB) du masque d’exemple sont utilisés (32 bits sont le nombre maximal de bits).

Entrée

L’étape Fusion de sortie (OM) génère la couleur de pixel rendue finale à l’aide d’une combinaison des éléments suivants :

  • État du pipeline
  • Données de pixels générées par les nuanceurs de pixels
  • Contenu des cibles de rendu
  • Contenu des mémoires tampons de profondeur/gabarit.

Sortie

Vue d’ensemble du masque d’écriture de sortie

Utilisez un masque d’écriture de sortie pour contrôler (par composant) les données pouvant être écrites sur une cible de rendu.

Vue d’ensemble de plusieurs cibles de rendu

Un nuanceur de pixels peut être utilisé pour effectuer le rendu vers au moins 8 cibles de rendu distinctes, qui doivent toutes être du même type (buffer, Texture1D, Texture1DArray, etc.). En outre, toutes les cibles de rendu doivent avoir la même taille dans toutes les dimensions (largeur, hauteur, profondeur, taille de tableau, nombre d’échantillons). Chaque cible de rendu peut avoir un format de données différent.

Vous pouvez utiliser n’importe quelle combinaison d’emplacements de cibles de rendu (jusqu’à 8). Toutefois, une vue de ressources ne peut pas être liée à plusieurs emplacements de cible de rendu simultanément. Une vue peut être réutilisée tant que les ressources ne sont pas utilisées simultanément.

Dans cette section

Rubrique Description

Configuration de la fonctionnalité de profondeur-gabarit

Cette section décrit les étapes de configuration de la mémoire tampon profondeur-gabarit et l’état profondeur-gabarit pour l’étape de fusion de sortie.

 

Pipeline graphique