Partager via


Conversion de données pour l’espace de couleur

Pour composer à l’écran ou effectuer des opérations à virgule flottante, vous devez travailler dans l’espace de couleur approprié. Nous vous recommandons d’effectuer des opérations à virgule flottante dans un espace de couleur linéaire. Ensuite, pour présenter vos images à l’écran, convertissez les données en données RVB standard (sRVB, corrigées en gamma 2.2) espace de couleur. La présentation de l’écran dans l’espace de couleur sRVB est importante pour la précision des couleurs. Si les images ne sont pas corrigées en gamma 2.2, elles attribuent trop de bits ou trop de bande passante aux hautes lumières que les gens ne peuvent pas différencier, et trop peu de bits ou de bande passante aux valeurs d’ombre auxquelles les gens sont sensibles. Il faudrait donc plus de bits ou de bande passante pour maintenir la même qualité visuelle. Par conséquent, pour garantir la meilleure précision de couleur, présentez des images à l’écran qui sont corrigées gamma 2.2.

Strictement parlant, la fonction de transfert sRVB réelle est une formule de type fragmentaire (segment linéaire + puissance 2.4 puissance), qui est légèrement différente d’une puissance gamma brute de 2.2. Mais pour plus de simplicité, nous allons les utiliser de façon interchangeable.

Exactitude des couleurs

Pour la présentation, les formats d’affichage à valeur entière (tels que DXGI_FORMAT_B8G8R8A8_UNORM_SRVB, DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM, etc.) contiennent toujours des données corrigées par gamma sRVB. Les formats d’affichage à valeur flottante (actuellement seulement DXGI_FORMAT_R16G16B16A16_FLOAT) contiennent des données à valeur linéaire.

Le modificateur de format _SRVB indique au système d’exploitation pour aider l’application à placer des données sRVB sur l’écran. L’application doit toujours placer des données sRVB dans des mémoires tampons de retour avec des formats de valeur entière pour présenter les données sRVB à l’écran, même si les données n’ont pas ce modificateur de format dans leur nom de format. Pour une liste complète des formats d’acquisition d’affichage :

Lorsque vous écrivez des valeurs de sortie à virgule flottante à partir du shader de pixels dans des vues cibles de rendu (RenderTargetViews) avec le modificateur de format _SRVB lié au pipeline, vous les convertissez en espace colorimétrique avec correction gamma 2.2. De même, lorsque les vues shader-resource (ShaderResourceViews) avec le modificateur de format _SRVB sont liées au pipeline, vous convertissez les valeurs de l’espace de couleurs corrigé en gamma 2.2 en espace de couleurs linéaire lorsque vous les lisez à partir des ShaderResourceViews. Le nuanceur peut ensuite effectuer des opérations sur eux.

Par exemple, utilisez du code similaire à celui-ci pour écrire des valeurs de sortie à virgule flottante à partir d’un nuanceur dans un format RenderTargetView :

struct PSOut
{
    float4 color : SV_Target;
};

PSOut S( PSIn input )
{
    PSOut output;
    output.color = float4( 1.0, 0.0, 0.0, 1.0 );
    return output;
}

Lorsque la routine « S » retourne, les valeurs à virgule flottante (1, 0, 0, 1) sont converties au format RenderTargetView. Ensuite, si vous affectez le modificateur de format _SRVB à RenderTargetView, la conversion gamma se produit.

Voici les étapes à suivre pour vous assurer que le contenu affiché à l’écran a la meilleure exactitude de couleur.

Pour garantir l’exactitude des couleurs dans le pipeline

  1. Si une texture a un contenu sRVB, assurez-vous que le ShaderResourceView a le modificateur de format _SRVB de sorte que lorsque vous lisez à partir du ShaderResourceView dans le nuanceur, vous convertissez le contenu de texture de l’espace de couleurs corrigé par gamma 2.2 en espace de couleurs linéaire.
  2. Assurez-vous que le RenderTargetView dispose également du modificateur de format _SRVB afin que les valeurs de sortie du nuanceur soient converties en gamma.

Si vous suivez les étapes précédentes, lorsque vous appelez la méthode IDXGISwapChain1::Present1, le contenu affiché sur l’écran a la meilleure exactitude de couleur.

Vous pouvez utiliser la méthode ID3D11Device::CreateRenderTargetView pour créer des vues DXGI_FORMAT_*_SRVB sur les mémoires tampons arrière à partir d’une chaîne d’échange que vous créez uniquement avec un format DXGI_FORMAT_*_UNORM. Il s’agit d’une exception spéciale à la règle de création de vues de rendu-cible, qui stipule que vous pouvez utiliser un format différent avec ID3D11Device::CreateRenderTargetView uniquement si vous avez créé la ressource que vous souhaitez afficher avec DXGI_FORMAT_*_TYPELESS.

Pour plus d’informations sur les règles de conversion de données, consultez Règles de conversion de données.

Pour plus d’informations sur la lecture et l’écriture simultanées dans une texture, consultez Décompresser et empaqueter DXGI_FORMAT pour la modification d’images sur place.

Amélioration de la présentation avec le modèle de retournement, les rectangles sale et les zones défilées