Formats de pixel et modes alpha pris en charge

Cette rubrique décrit les formats de pixels et les modes alpha pris en charge par les différentes parties de Direct2D, y compris chaque type cible de rendu, ID2D1Bitmap et ID2D1ImageSource. Elle contient les sections suivantes.

Formats YUV pris en charge pour la source d’image DXGI

Un ID2D1ImageSource est un fournisseur abstrait de pixels. Il peut être instancié à partir de WIC (CreateImageSourceFromWic ou d’un IDXGISurface (CreateImageSourceFromDxgi).

ID2D1ImageSourceFromWic prend en charge le même ensemble de formats de pixels et de modes alpha que ID2D1Bitmap.

En plus de ce qui précède, un ID2D1ImageSource instancié à partir d’IDXGISurface prend également en charge certains formats de pixels YUV, y compris les données planaires fractionnées en plusieurs surfaces. Pour plus d’informations sur la configuration requise pour chaque format de pixel, consultez CreateImageSourceFromDxgi .

Format
DXGI_FORMAT_AYUV
DXGI_FORMAT_NV12
DXGI_FORMAT_YUY2
DXGI_FORMAT_P208
DXGI_FORMAT_V208
DXGI_FORMAT_V408
DXGI_FORMAT_R8_UNORM
DXGI_FORMAT_R8G8_UNORM

 

Spécification d’un format de pixel pour une cible de rendu

Lorsque vous créez une cible de rendu, vous devez spécifier son format de pixel. Pour spécifier le format de pixel, vous utilisez une structure D2D1_PIXEL_FORMAT pour définir le membre pixelFormat d’une structure D2D1_RENDER_TARGET_PROPERTIES . Ensuite, vous transmettez cette structure à la méthode Create appropriée, telle que ID2D1Factory::CreateHwndRenderTarget.

La structure D2D1_PIXEL_FORMAT a deux champs :

  • format, valeur DXGI_FORMAT qui décrit la taille et la disposition des canaux dans chaque pixel, et
  • alpha, valeur D2D1_ALPHA_MODE qui décrit la façon dont les informations alpha sont interprétées.

L’exemple suivant crée une structure D2D1_PIXEL_FORMAT et l’utilise pour spécifier le format de pixel et le mode alpha d’un ID2D1HwndRenderTarget.

RECT rc;
GetClientRect(m_hwnd, &rc);

D2D1_SIZE_U size = D2D1::SizeU(
    rc.right - rc.left,
    rc.bottom - rc.top
    );

// Create a pixel format and initial its format
// and alphaMode fields.
D2D1_PIXEL_FORMAT pixelFormat = D2D1::PixelFormat(
    DXGI_FORMAT_B8G8R8A8_UNORM,
    D2D1_ALPHA_MODE_IGNORE
    );

D2D1_RENDER_TARGET_PROPERTIES props = D2D1::RenderTargetProperties();
props.pixelFormat = pixelFormat;

// Create a Direct2D render target.
hr = m_pD2DFactory->CreateHwndRenderTarget(
    props,
    D2D1::HwndRenderTargetProperties(m_hwnd, size),
    &m_pRT
    );

Différentes cibles de rendu prennent en charge différentes combinaisons de format et de mode alpha. Les sections suivantes répertorient les combinaisons de format et d’alpha prises en charge par chaque cible de rendu.

Formats pris en charge pour ID2D1HwndRenderTarget

Les formats pris en charge pour un ID2D1HwndRenderTarget varient selon qu’il effectue un rendu à l’aide d’un matériel ou d’un logiciel, ou que Direct2D gère automatiquement le mode de rendu par défaut.

Notes

Nous vous recommandons d’utiliser DXGI_FORMAT_B8G8R8A8_UNORM comme format de pixels pour de meilleures performances. Cela est particulièrement utile pour les cibles de rendu de logiciels. Les cibles de format BGRA fonctionnent mieux que les formats RVBA.

 

Lorsque vous créez un ID2D1HwndRenderTarget, vous utilisez la structure D2D1_RENDER_TARGET_PROPERTIES pour spécifier les options de rendu. Les options incluent le format de pixels, comme indiqué dans la section précédente. Le champ type de cette structure vous permet de spécifier si la cible de rendu s’affiche sur du matériel ou des logiciels, ou si Direct2D doit déterminer automatiquement le mode de rendu.

Pour permettre à Direct2D de déterminer si la cible de rendu utilise le rendu matériel ou logiciel, utilisez le paramètre D2D1_RENDER_TARGET_TYPE_DEFAULT .

Le tableau suivant répertorie les formats pris en charge pour les objets ID2D1HwndRenderTarget créés à l’aide du paramètre D2D1_RENDER_TARGET_TYPE_DEFAULT .

Format Mode alpha
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_UNKNOWN

 

Pour forcer une cible de rendu à utiliser le rendu matériel, utilisez le paramètre D2D1_RENDER_TARGET_TYPE_HARDWARE . Le tableau suivant répertorie les formats pris en charge pour les objets ID2D1HwndRenderTarget qui utilisent explicitement le rendu matériel.

Format Mode alpha
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_R8G8B8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_R8G8B8A8_UNORM D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_R8G8B8A8_UNORM D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_UNKNOWN

 

Pour forcer une cible de rendu à utiliser le rendu logiciel, utilisez le paramètre D2D1_RENDER_TARGET_TYPE_SOFTWARE . Le tableau suivant répertorie les formats pris en charge pour les objets ID2D1HwndRenderTarget qui utilisent explicitement le rendu logiciel.

Format Mode alpha
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_UNKNOWN

 

Que l’ID2D1HwndRenderTarget soit accéléré sur le matériel, le format DXGI_FORMAT_UNKNOWN utilise DXGI_FORMAT_B8G8R8A8 par défaut et le mode alpha D2D1_ALPHA_MODE_UNKNOWN utilise D2D1_ALPHA_MODE_IGNORE par défaut.

Formats pris en charge pour ID2D1DeviceContext

À compter de Windows 8 le contexte de l’appareil tire parti de plusieurs formats de couleur élevée Direct3D, comme :

  • DXGI_FORMAT_B8G8R8A8_UNORM_SRGB
  • DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
  • DXGI_FORMAT_R16G16B16A16_UNORM
  • DXGI_FORMAT_R16G16B16A16_FLOAT
  • DXGI_FORMAT_R32G32B32A32_FLOAT

Utilisez la méthode ID2D1DeviceContext::IsDxgiFormatSupported pour voir si un format fonctionne sur un contexte d’appareil particulier. Ces formats peuvent également fonctionner sur un ID2D1HwndRenderTarget.

Ces formats s’ajoutent aux formats pris en charge par l’interface ID2D1HwndRenderTarget dans Windows 7. Pour plus d’informations, consultez Appareils et contextes d’appareil.

Formats pris en charge pour la cible de rendu compatible

Une cible de rendu compatible ( id2D1BitmapRenderTarget créée par l’une des méthodes ID2D1RenderTarget::CreateCompatibleRenderTarget ) hérite des formats pris en charge et des modes alpha de la cible de rendu qui l’a créée. Une cible de rendu compatible prend également en charge les combinaisons de format et de mode alpha suivantes, quelle que soit la prise en charge de son parent.

Format Mode alpha
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_STRAIGHT
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_UNKNOWN

 

Le format DXGI_FORMAT_UNKNOWN utilise le format cible de rendu parent par défaut et le mode alpha D2D1_ALPHA_MODE_UNKNOWN utilise D2D1_ALPHA_MODE_PREMULTIPLIED par défaut.

Formats pris en charge pour la cible de rendu Surface DXGI

Une cible de rendu DXGI est un ID2D1RenderTarget créé par l’une des méthodes ID2D1Factory::CreateDxgiSurfaceRenderTarget . Il prend en charge les combinaisons de format et de mode alpha suivantes.

Format Mode alpha
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_R8G8B8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_R8G8B8A8_UNORM D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_STRAIGHT
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_IGNORE

 

Notes

Le format doit correspondre au format de la surface DXGI dans laquelle la cible de rendu de surface DXGI dessine.

 

Le format DXGI_FORMAT_UNKNOWN utilise le format surface DXGI par défaut. N’utilisez pas le mode alpha D2D1_ALPHA_MODE_UNKNOWN avec une cible de rendu de surface DXGI. Il n’a aucune valeur par défaut et entraîne l’échec de la création de la cible de rendu de surface DXGI.

Formats pris en charge pour la cible de rendu bitmap WIC

Une cible de rendu bitmap WIC est un ID2D1RenderTarget créé par l’une des méthodes ID2D1Factory::CreateWicBitmapRenderTarget . Il prend en charge les combinaisons de format et de mode alpha suivantes.

Format Mode alpha
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_STRAIGHT
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_UNKNOWN

 

Le format de pixels de la cible bitmap WIC doit correspondre au format de pixels de l’image bitmap WIC.

Le formatDXGI_FORMAT_UNKNOWN utilise le format bitmap WIC par défaut et le mode alpha D2D1_ALPHA_MODE_UNKNOWN utilise le mode alpha bitmap WIC par défaut.

Formats pris en charge pour ID2D1DCRenderTarget

Un ID2D1DCRenderTarget prend en charge les combinaisons de format et de mode alpha suivantes.

Format Mode alpha
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE

 

N’utilisez pas le format DXGI_FORMAT_UNKNOWN ou le mode alpha D2D1_ALPHA_MODE_UNKNOWN avec un ID2D1DCRenderTarget. Elle n’a aucune valeur par défaut et entraîne l’échec de la création d’ID2D1DCRenderTarget .

Spécification d’un format de pixel pour un ID2D1Bitmap

En règle générale, les objets ID2D1Bitmap prennent en charge les formats et modes alpha suivants (avec certaines restrictions, décrites dans les paragraphes qui suivent).)

Format Mode alpha
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_STRAIGHT
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_B8G8R8X8_UNORM (Windows 8.1 et versions ultérieures uniquement) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC1_UNORM (Windows 8.1 et versions ultérieures uniquement) D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_BC1_UNORM (Windows 8.1 et versions ultérieures uniquement) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC1_UNORM (Windows 8.1 et versions ultérieures uniquement) D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_BC2_UNORM (Windows 8.1 et versions ultérieures uniquement) D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_BC2_UNORM (Windows 8.1 et versions ultérieures uniquement) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC2_UNORM (Windows 8.1 et versions ultérieures uniquement) D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_BC3_UNORM (Windows 8.1 et versions ultérieures uniquement) D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_BC3_UNORM (Windows 8.1 et versions ultérieures uniquement) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC3_UNORM (Windows 8.1 et versions ultérieures uniquement) D2D1_ALPHA_MODE_UNKNOWN

 

Lorsque vous utilisez la méthode ID2D1RenderTarget::CreateSharedBitmap , vous utilisez le champ pixelFormat d’une structure D2D1_BITMAP_PROPERTIES pour spécifier le format de pixels de la nouvelle cible de rendu. Il doit correspondre au format de pixels de la source ID2D1Bitmap .

Lorsque vous utilisez la méthode CreateBitmapFromWicBitmap , vous utilisez le champ pixelFormat d’une structure de D2D1_BITMAP_PROPERTIES (au lieu du membre pixelFormat d’une structure D2D1_RENDER_TARGET_PROPERTIES ) pour spécifier le format de pixel de la nouvelle cible de rendu. Il doit correspondre au format de pixels de la source bitmap WIC.

Notes

Pour plus d’informations sur la prise en charge des formats de pixels compressés par blocs (BCn), consultez Bloquer la compression.

 

Formats WIC pris en charge

Lorsque vous utilisez la méthode CreateBitmapFromWicBitmap pour créer une image bitmap à partir d’un bitmap WIC, ou lorsque vous utilisez la méthode CreateSharedBitmap avec un IWICBitmapLock, la source WIC doit être dans un format pris en charge par Direct2D.

Format WIC Format DXGI correspondant Mode alpha correspondant
GUID_WICPixelFormat8bppAlpha DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_STRAIGHT ou D2D1_ALPHA_MODE_PREMULTIPLIED
GUID_WICPixelFormat32bppPRGBA DXGI_FORMAT_R8G8B8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED ou D2D1_ALPHA_MODE_IGNORE
GUID_WICPixelFormat32bppBGR DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE
GUID_WICPixelFormat32bppPBGRA DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED

 

Pour obtenir un exemple qui montre comment convertir une image bitmap WIC dans un format pris en charge, consultez Charger une bitmap à partir d’un fichier.

Utilisation d’un format non pris en charge

L’utilisation de toute combinaison autre que les formats de pixels et les modes alpha répertoriés dans les tableaux précédents entraîne une erreur de D2DERR_UNSUPPORTED_PIXEL_FORMAT ou de E_INVALIDARG .

À propos des modes alpha

À propos des modes Alpha prémultiplié et droit

L’énumération D2D1_ALPHA_MODE indique si le canal alpha utilise l’alpha prémultiplié, l’alpha droit ou doit être ignoré et considéré comme opaque. Avec l’alpha droit, le canal alpha indique une valeur qui correspond à la transparence d’une couleur.

Les couleurs sont toujours traitées en tant qu’alpha droit par les commandes de dessin direct2D et les pinceaux, quel que soit le format de destination.

Avec l’alpha prémultiplié, chaque canal de couleur est mis à l’échelle par la valeur alpha. En règle générale, aucune valeur de canal de couleur n’est supérieure à la valeur du canal alpha. Si la valeur d’un canal de couleur dans un format pré-multiplié est supérieure au canal alpha, la mathématique de fusion source-over standard crée un mélange additif.

La valeur du canal alpha lui-même est la même dans l’alpha droit et dans l’alpha pré-multiplié.

Les différences entre l’alpha droit et l’alpha prémultiplié

Lors de la description d’une couleur RVBA à l’aide d’un alpha droit, la valeur alpha de la couleur est stockée dans le canal alpha. Par exemple, pour décrire une couleur rouge opaque à 60 %, utilisez les valeurs suivantes : (255, 0, 0, 255 * 0,6) = (255, 0, 0, 153). La valeur 255 indique le rouge complet et 153 (soit 60 % de 255) indique que la couleur doit avoir une opacité de 60 %.

Lors de la description d’une couleur RVBA à l’aide de l’alpha prémultiplié, chaque couleur est multipliée par la valeur alpha : (255 * 0,6, 0 * 0,6, 0,6, 255 * 0,6) = (153, 0, 0, 153).

Quel que soit le mode alpha de la cible de rendu, D2D1_COLOR_F valeurs sont toujours interprétées comme alpha droite. Par exemple, lorsque vous spécifiez la couleur d’un ID2D1SolidColorBrush pour une utilisation avec une cible de rendu qui utilise le mode alpha prémultiplié, spécifiez la couleur comme vous le feriez si la cible de rendu utilisait l’alpha droit. Lorsque vous peignez avec le pinceau, Direct2D traduit la couleur au format de destination pour vous.

Mode Alpha pour les cibles de rendu

Quel que soit le paramètre de mode alpha, le contenu d’une cible de rendu prend en charge la transparence. Par exemple, si vous dessinez un rectangle rouge partiellement transparent avec une cible de rendu avec un mode alpha de D2D1_ALPHA_MODE_IGNORE, le rectangle apparaît en rose (si l’arrière-plan est blanc).

Si vous dessinez un rectangle rouge partiellement transparent lorsque le mode alpha est D2D1_ALPHA_MODE_PREMULTIPLIED, le rectangle apparaît en rose (en supposant que l’arrière-plan est blanc) et vous pouvez voir à travers lui ce qui se trouve derrière la cible de rendu. Cela est utile lorsque vous utilisez un ID2D1DCRenderTarget pour effectuer un rendu dans une fenêtre transparente ou lorsque vous utilisez une cible de rendu compatible (un rendu ciblé créé par la méthode CreateCompatibleRenderTarget ) pour créer une bitmap qui prend en charge la transparence.

Modes ClearType et Alpha

Si vous spécifiez un mode alpha autre que D2D1_ALPHA_MODE_IGNORE pour une cible de rendu, le mode anti-attirail de texte passe automatiquement de D2D1_TEXT_ANTIALIAS_MODE CLEARTYPE à D2D1_TEXT_ANTIALIAS_MODE GRAYSCALE. (Lorsque vous spécifiez un mode alpha de D2D1_ALPHA_MODE_UNKNOWN, Direct2D définit l’alpha pour vous, en fonction du type de cible de rendu.)

Vous pouvez utiliser la méthode SetTextAntialiasMode pour remplacer le mode anti-atalias de texte en D2D1_TEXT_ANTIALIAS_MODE CLEARTYPE, mais le rendu du texte ClearType sur une surface transparente peut créer des résultats imprévisibles. Si vous souhaitez restituer du texte ClearType sur une cible de rendu transparente, nous vous recommandons d’utiliser l’une des deux techniques suivantes.

  • Utilisez la méthode PushAxisAlignedClip pour couper la cible de rendu dans la zone où le texte sera rendu, puis appelez la méthode Clear et spécifiez une couleur opaque, puis affichez votre texte.
  • Utilisez DrawRectangle pour dessiner un rectangle opaque derrière la zone où le texte sera affiché.

D2D1_PIXEL_FORMAT

D2D1_ALPHA_MODE

DXGI_FORMAT