Partager via


Formats de pixel et modes alpha pris en charge

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

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

Un ID2D1ImageSource est un fournisseur de pixels abstrait. 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 de IDXGISurface prend également en charge certains formats de pixel YUV, y compris les données planaires réparties sur plusieurs surfaces. Veuillez consulter la section CreateImageSourceFromDxgi pour plus d’informations sur les exigences de chaque format de pixel.

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 passez cette structure à la méthode de création appropriée, telle que ID2D1Factory::CreateHwndRenderTarget.

La structure D2D1_PIXEL_FORMAT comporte deux champs :

  • format, une valeur DXGI_FORMAT qui décrit la taille et la disposition des canaux dans chaque pixel, et
  • alpha, une valeur D2D1_ALPHA_MODE qui décrit comment 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
    );

Les différentes cibles de rendu prennent en charge différentes combinaisons de formats et de modes alpha. Les sections suivantes répertorient les combinaisons de formats et de modes alpha prises en charge par chaque cible de rendu.

Formats pris en charge pour ID2D1HwndRenderTarget

Les formats pris en charge pour un ID2D1HwndRenderTarget dépendent de s’il rend avec du matériel ou des logiciels, ou si Direct2D gère le mode de rendu automatiquement par défaut.

Remarque

Nous recommandons d’utiliser DXGI_FORMAT_B8G8R8A8_UNORM comme format de pixel pour de meilleures performances. Cela est particulièrement utile pour les cibles de rendu logiciel. Les cibles au format BGRA sont plus performantes que les formats RGBA.

 

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 pixel, comme indiqué dans la section précédente. Le champ type de cette structure vous permet de spécifier si la cible de rendu utilise un rendu matériel ou logiciel, 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 en utilisant le 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 le ID2D1HwndRenderTarget soit accéléré par le matériel ou non, le format DXGI_FORMAT_UNKNOWN utilise par défaut DXGI_FORMAT_B8G8R8A8 et le mode alpha D2D1_ALPHA_MODE_UNKNOWN utilise par défaut D2D1_ALPHA_MODE_IGNORE.

Formats pris en charge pour ID2D1DeviceContext

À partir de Windows 8, le device context tire parti de davantage de formats haute couleur Direct3D tels que :

  • 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 de périphérique 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. Veuillez consulter la section Appareils et contextes de périphériques pour plus d’informations.

Formats pris en charge pour une cible de rendu compatible

Une cible de rendu compatible (un ID2D1BitmapRenderTarget créé par l’une des méthodes ID2D1RenderTarget::CreateCompatibleRenderTarget) hérite des formats et des modes alpha pris en charge de la cible de rendu qui l’a créé. Une cible de rendu compatible prend également en charge les combinaisons de formats et de modes alpha suivantes, indépendamment de ce que prend en charge 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 par défaut le format de la cible de rendu parente et le mode alpha D2D1_ALPHA_MODE_UNKNOWN utilise par défaut D2D1_ALPHA_MODE_PREMULTIPLIED.

Formats pris en charge pour une cible de rendu de surface DXGI

Une cible de rendu DXGI est un ID2D1RenderTarget créé par l’une des méthodes ID2D1Factory::CreateDxgiSurfaceRenderTarget. Elle prend en charge les combinaisons de formats et de modes 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

 

Remarque

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

 

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

Formats pris en charge pour une cible de rendu de bitmap WIC

Une cible de rendu bitmap WIC est un ID2D1RenderTarget créé par l’une des méthodes ID2D1Factory::CreateWicBitmapRenderTarget. Elle prend en charge les combinaisons de formats et de modes 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 pixel de la cible de rendu bitmap WIC doit correspondre au format de pixel du bitmap WIC.

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

Formats pris en charge pour ID2D1DCRenderTarget

Un ID2D1DCRenderTarget prend en charge les combinaisons de formats et de modes 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. Il n’a pas de valeur par défaut et entraînera l’échec de la création de ID2D1DCRenderTarget.

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

En général, les objets ID2D1Bitmap prennent en charge les formats et les modes alpha suivants (avec quelques restrictions, décrites dans les paragraphes suivants).

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 pixel de la nouvelle cible de rendu. Il doit correspondre au format de pixel de la source ID2D1Bitmap.

Lorsque vous utilisez la méthode CreateBitmapFromWicBitmap, vous utilisez le champ pixelFormat d’une structure 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 pixel de la source bitmap WIC.

Remarque

Pour plus d’informations sur la prise en charge des formats de pixels compressés en blocs (BCₙ), consultez la section Compression de blocs.

 

Formats WIC pris en charge

Lorsque vous utilisez la méthode CreateBitmapFromWicBitmap pour créer un 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 un exemple montrant comment convertir un bitmap WIC dans un format pris en charge, veuillez consulter la section Comment charger un 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 D2DERR_UNSUPPORTED_PIXEL_FORMAT ou une erreur E_INVALIDARG.

À propos des modes alpha

À propos des modes alpha prémultipliés et directs

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

Les couleurs sont toujours traitées comme de l’alpha direct par les commandes de dessin et les pinceaux Direct2D, 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 général, aucune valeur de canal de couleur n’est supérieure à la valeur du canal alpha. Si une valeur de canal de couleur dans un format prémultiplié est supérieure à celle du canal alpha, les mathématiques standard de fusion source-over créent une fusion additive.

La valeur du canal alpha elle-même est identique dans l’alpha direct et dans l’alpha prémultiplié.

Les différences entre les modes alpha direct et prémultiplié

Lorsque vous décrivez une couleur RGBA en utilisant l’alpha direct, la valeur alpha de la couleur est stockée dans le canal alpha. Par exemple, pour décrire une couleur rouge avec 60 % d’opacité, utilisez les valeurs suivantes : (255, 0, 0, 255 * 0,6) = (255, 0, 0, 153). La valeur 255 indique un rouge complet, et 153 (qui correspond à 60 % de 255) indique que la couleur doit avoir une opacité de 60 %.

Lorsque vous décrivez une couleur RGBA en utilisant l’alpha prémultiplié, chaque couleur est multipliée par la valeur alpha : (255 * 0,6, 0 * 0,6, 0 * 0,6, 255 * 0,6) = (153, 0, 0, 153).

Quel que soit le mode alpha de la cible de rendu, les valeurs D2D1_COLOR_F sont toujours interprétées comme de l’alpha direct. Par exemple, lorsque vous spécifiez la couleur d’un ID2D1SolidColorBrush pour l’utiliser avec une cible de rendu qui utilise le mode alpha prémultiplié, spécifiez la couleur comme si la cible de rendu utilisait l’alpha direct. 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 réglage du 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 ayant un mode alpha D2D1_ALPHA_MODE_IGNORE, le rectangle apparaîtra en rose (si l’arrière-plan est blanc).

Si vous dessinez un rectangle rouge partiellement transparent alors que le mode alpha est D2D1_ALPHA_MODE_PREMULTIPLIED, le rectangle apparaîtra en rose (en supposant que l’arrière-plan soit blanc) et vous pourrez voir à travers lui ce qu’il y a derrière la cible de rendu. Cela est utile lorsque vous utilisez un ID2D1DCRenderTarget pour rendre à une fenêtre transparente ou lorsque vous utilisez une cible de rendu compatible (une cible de rendu créée par la méthode CreateCompatibleRenderTarget) pour créer un bitmap qui prend en charge la transparence.

ClearType et modes alpha

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

Vous pouvez utiliser la méthode SetTextAntialiasMode pour rétablir le mode d’antialiasing du texte à D2D1_TEXT_ANTIALIAS_MODE CLEARTYPE, mais le rendu du texte ClearType sur une surface transparente peut produire des résultats imprévisibles. Si vous souhaitez rendre le 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 découper la cible de rendu à la zone où le texte sera rendu, puis appelez la méthode Clear et spécifiez une couleur opaque, puis rendez votre texte.
  • Utilisez DrawRectangle pour dessiner un rectangle opaque derrière la zone où le texte sera rendu.

D2D1_PIXEL_FORMAT

D2D1_ALPHA_MODE

DXGI_FORMAT