Partager via


Gamma (Direct3D 9)

Le contenu de texture est souvent stocké au format sRVB. Traditionnellement, les pipelines de pixels supposaient que les couleurs étaient linéaires. Les opérations de fusion étaient donc effectuées dans l’espace linéaire. Toutefois, étant donné que le contenu sRVB bénéficie d’une correction gamma, les opérations de fusion dans l’espace linéaire produisent des résultats incorrects. Les cartes vidéo peuvent maintenant résoudre ce problème en annulant la correction gamma lorsqu’elles lisent un contenu sRVB et en reconvertissant les données de pixel au format sRVB lors de l’écriture de pixels. Dans ce cas, toutes les opérations à l’intérieur du pipeline de pixels sont effectuées dans l’espace linéaire.

Gamma Correction

Direct3D 9 peut :

  • Indiquer si une texture bénéficie d’une correction gamma 2.2 ou non (sRVB ou non). Le pilote sera convertira en gamma linéaire pour les opérations de fusion au moment SetTexture, ou l’échantillonneur le convertira en données linéaires au moment de la recherche.
  • Indiquer si le pipeline de pixels doit effectuer une correction gamma pour revenir à l’espace sRVB lors de l’écriture dans la cible de rendu.

Toutes les autres couleurs (couleur claire, couleur de matériau, couleur de vertex, etc.) sont supposées être dans un espace linéaire. Les applications peuvent effectuer une correction gamma des couleurs écrites dans le tampon de trame à l’aide d’instructions de nuanceur de pixels. La linéarisation doit être appliquée uniquement aux canaux RVB et non au canal alpha.

Tous les formats de surface ne peuvent pas être linéarisés. Seuls les formats qui passent CheckDeviceFormat avec D3DUSAGE_QUERY_SRGBREAD peuvent être linéarisés. L’état d’échantillonneur D3DSAMP_SRGBTEXTURE est ignoré pour le reste. Seuls les formats de texture non signés sont censés prendre en charge cette conversion. Les formats de texture non signés incluent uniquement les composants R, V, B et L. Si le canal alpha est présent, il est ignoré. Si les formats mixtes prennent en charge la linéarisation sRVB, seuls les canaux non signés sont affectés. Dans l’idéal, le matériel doit effectuer la linéarisation avant le filtrage, mais dans Direct3D 9, le matériel est autorisé à effectuer la linéarisation après le filtrage.

Tous les formats de surface ne peuvent pas être écrits dans l’espace sRVB. Seuls les formats qui passent CheckDeviceFormat avec l’indicateur d’utilisation D3DUSAGE_QUERY_SRGBWRITE peuvent être linéarisés. L’état de rendu D3DRS_SRGBWRITEENABLE est ignoré pour le reste. Les formats RVB non signés à huit bits par canal sont censés exposer cette capacité.

Dans l’idéal, le matériel doit effectuer les opérations de fusion de tampon de trame dans l’espace linéaire, mais le matériel est autorisé à l’effectuer après le nuanceur de pixels, mais avant le mélangeur de tampon de trame. Cela signifie que les opérations de fusion de tampon de trame qui se produisent dans l’espace sRVB produisent des résultats incorrects. D3DRS_SRGBWRITEENABLE est honoré lors de l’exécution d’un vidage de la cible de rendu. Pour le matériel qui prend en charge plusieurs cibles de rendu (Direct3D 9) ou des textures à plusieurs éléments (Direct3D 9), seul le premier élément ou la première cible de rendu est écrit.

Modifications d’API

// New sampler state (DWORD)
// If this is nonzero, the texture is linearized on lookup.
D3DSAMP_SRGBTEXTURE       // Default FALSE

// New render state (DWORD)
D3DRS_SRGBWRITEENABLE     // Default FALSE

// New usage flags
D3DUSAGE_QUERY_SRGBWRITE
D3DUSAGE_QUERY_SRGBREAD

Chaînes d’échange fenêtrées

Il est utile pour les applications de conserver les mémoires tampons d’arrière-plan de leurs chaînes d’échange dans l’espace linéaire afin d’activer les opérations de fusion correctes. Étant donné que le bureau n’est généralement pas dans un espace linéaire, une correction gamma est requise avant que le contenu de la mémoire tampon d’arrière-plan puisse être présenté. L’application peut affecter cette correction elle-même en allouant une mémoire tampon supplémentaire et en effectuant sa propre copie de correction de la mémoire tampon linéaire vers la mémoire tampon d’arrière-plan. Cela nécessite une copie supplémentaire, ce qui peut être évité si le pilote effectue une correction gamma dans le cadre du blit de présentation.

Dans Direct3D 9, un nouvel indicateur, D3DPRESENT_LINEAR_CONTENT, est disponible pour Present qui permet à la présentation de convertir implicitement de l’espace linéaire en sRVB/gamma 2.2. Les applications doivent spécifier cet indicateur si le format backbuffer est à virgule flottante 16 bits afin de faire correspondre la présentation en mode fenêtré au comportement gamma plein écran, à condition que D3DCAPS3_LINEAR_TO_SRGB_PRESENTATION soit retourné pour les fonctionnalités d’appareil récupérées via GetDeviceCaps.

Tampon de trame