Conversion de données pour l’espace de couleurs

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

Précision des couleurs

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

Le modificateur de format _SRGB indique au système d’exploitation d’aider l’application à placer les données sRGB à l’écran. L’application doit toujours placer les données sRGB dans des mémoires tampons arrière avec des formats entiers pour présenter les données sRGB à l’écran, même si les données n’ont pas ce modificateur de format dans leur nom de format. Pour obtenir la liste complète des formats d’analyse d’affichage :

Lorsque vous écrivez des valeurs de sortie à virgule flottante à partir du nuanceur de pixels dans des vues cibles de rendu (RenderTargetViews) avec le modificateur de format _SRGB lié au pipeline, vous les convertissez en espace de couleur gamma 2.2 corrigé. De même, lorsque les affichages de ressources de nuanceur (ShaderResourceViews) avec le modificateur de format _SRGB sont liés au pipeline, vous convertissez les valeurs de l’espace de couleur corrigé gamma 2.2 en espace de couleurs linéaire lorsque vous les lisez à partir de ShaderResourceView. Le nuanceur peut ensuite effectuer des opérations sur ceux-ci.

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 _SRGB au RenderTargetView, la conversion gamma se produit.

Il s’agit des étapes à suivre pour vous assurer que le contenu affiché à l’écran a la meilleure précision des couleurs.

Pour garantir l’exactitude des couleurs dans le pipeline

  1. Si une texture a du contenu sRGB, assurez-vous que shaderResourceView a le modificateur de format _SRGB. Lorsque vous lisez à partir de ShaderResourceView dans le nuanceur, vous convertissez le contenu de texture de l’espace de couleur corrigé gamma 2.2 en espace de couleurs linéaire.
  2. Vérifiez que RenderTargetView possède également le modificateur de format _SRGB 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::P resent1 , le contenu affiché à l’écran présente la meilleure précision des couleurs.

Vous pouvez utiliser la méthode ID3D11Device::CreateRenderTargetView pour créer des vues DXGI_FORMAT_*_SRGB sur des 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 cibles de rendu, qui indique que vous pouvez utiliser un autre format 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 des données, consultez Règles de conversion de données.

Pour plus d’informations sur la façon de lire et d’écrire simultanément à partir d’une texture, consultez Décompresser et emballer DXGI_FORMAT pour In-Place modification d’image.

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