支援的像素格式和 Alpha 模式

本主題描述 Direct2D 各部分支援的圖元格式和 Alpha 模式,包括每個轉譯目標類型、ID2D1BitmapID2D1ImageSource 其中包含下列各節。

DXGI 映像來源支援的 YUV 格式

ID2D1ImageSource 是像素的抽象提供者。 它可以從 WIC (CreateImageSourceFromWic IDXGISurfaceCreateImageSourceFromDxgi) 具現化。

ID2D1ImageSourceFromWic 支援與 ID2D1Bitmap相同的像素格式和Alpha模式。

除了上述屬性外,IDXGISurface具現化的ID2D1ImageSource也支援一些YUV像素格式,包括平面數據分割成多個表面。 如需每個像素格式需求的詳細資訊,請參閱 CreateImageSourceFromDxgi

格式
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

 

指定轉譯目標的像素格式

當您建立轉譯目標時,必須指定其像素格式。 若要指定圖元格式,您可以使用 D2D1_PIXEL_FORMAT 結構來設定D2D1_RENDER_TARGET_PROPERTIES結構的 pixelFormat 成員。 然後,您會將該結構傳遞至適當的 Create 方法,例如 ID2D1Factory::CreateHwndRenderTarget

D2D1_PIXEL_FORMAT 結構有兩個字段:

  • format,DXGI_FORMAT值,描述每個圖元中信道的大小和排列方式,以及
  • alpha,D2D1_ALPHA_MODE值,描述 Alpha 資訊的解譯方式。

下列範例會建立D2D1_PIXEL_FORMAT結構,並用它來指定ID2D1HwndRenderTarget像素格式和Alpha模式。

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
    );

不同的轉譯目標支援不同的格式和 Alpha 模式組合。 下列各節列出每個轉譯目標所支援的格式和 Alpha 組合。

ID2D1HwndRenderTarget 的支援格式

ID2D1HwndRenderTarget 支援的格式取決於它是否使用硬體或軟體轉譯,還是 Direct2D 預設會自動處理轉譯模式。

注意

建議您使用 DXGI_FORMAT_B8G8R8A8_UNORM 作為圖元格式,以提升效能。 這對軟體轉譯目標特別有説明。 BGRA 格式目標的執行效能優於 RGBA 格式。

 

當您建立 ID2D1HwndRenderTarget 時,您可以使用 D2D1_RENDER_TARGET_PROPERTIES 結構來指定轉譯 選項。 選項包含圖元格式,如上一節所述。 這個結構的型別欄位可讓您指定轉譯目標是否會轉譯為硬體或軟體,或 Direct2D 是否應該自動判斷轉譯模式。

若要讓 Direct2D 判斷轉譯目標是否使用硬體或軟體轉譯,請使用 D2D1_RENDER_TARGET_TYPE_DEFAULT 設定。

下表列出使用 D2D1_RENDER_TARGET_TYPE_DEFAULT 設定所建立之 ID2D1HwndRenderTarget 物件的支援格式。

格式 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

 

若要強制轉譯目標使用硬體轉譯,請使用 D2D1_RENDER_TARGET_TYPE_HARDWARE 設定。 下表列出明確使用硬體轉譯之 ID2D1HwndRenderTarget 對象的支援格式。

格式 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

 

若要強制轉譯目標使用軟體轉譯,請使用 D2D1_RENDER_TARGET_TYPE_SOFTWARE 設定。 下表列出明確使用軟體轉譯之 ID2D1HwndRenderTarget 對象的支援格式。

格式 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

 

不論ID2D1HwndRenderTarget是否為硬體加速,DXGI_FORMAT_UNKNOWN格式預設會使用DXGI_FORMAT_B8G8R8A8,而D2D1_ALPHA_MODE_UNKNOWN Alpha模式預設會使用 D2D1_ALPHA_MODE_IGNORE。

ID2D1DeviceContext 支援的格式

從 Windows 8 開始, 裝置內容 會利用更多 Direct3D 高色彩格式, 例如:

  • DXGI_FORMAT_B8G8R8A8_UNORM_SRGB
  • DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
  • DXGI_FORMAT_R16G16B16A16_UNORM
  • DXGI_FORMAT_R16G16B16A16_FLOAT
  • DXGI_FORMAT_R32G32B32A32_FLOAT

使用ID2D1DeviceContext::IsDxgiFormatSupported方法來查看格式是否在特定裝置內容上運作。 這些格式也可以在ID2D1HwndRenderTarget運作。

這些格式除了 Windows 7 中的 ID2D1HwndRenderTarget 介面所支援的格式之外。 如需詳細資訊,請參閱裝置和裝置內容。

相容的轉譯目標支援格式

相容的轉譯目標(ID2D1BitmapRenderTarget 是由其中一個 ID2D1RenderTarget::CreateCompatibleRenderTarget 方法所建立的 ID2D1BitmapRenderTarget 方法)繼承所建立之轉譯目標支援的格式和 Alpha 模式。 相容的轉譯目標也支援下列格式和 Alpha 模式組合,不論其父系支持什麼。

格式 Alpha 模式
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_STRAIGHT
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_UNKNOWN

 

DXGI_FORMAT_UNKNOWN格式預設會使用父轉譯目標格式,而D2D1_ALPHA_MODE_UNKNOWN Alpha 模式預設會使用D2D1_ALPHA_MODE_PREMULTIPLIED

DXGI Surface 轉譯目標支援的格式

DXGI 轉譯目標是由其中一個 ID2D1Factory::CreateDxgiSurfaceRenderTarget 方法所建立的 ID2D1RenderTarget。 它支援下列格式和 Alpha 模式組合。

格式 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

 

注意

格式必須符合 DXGI 表面轉譯目標繪製的 DXGI 表面格式。

 

DXGI_FORMAT_UNKNOWN格式預設會使用 DXGI 介面格式。 請勿將 D2D1_ALPHA_MODE_UNKNOWN Alpha 模式與 DXGI 表面轉譯 目標搭配使用。 它沒有預設值,而且會導致 DXGI 表面轉譯目標建立失敗。

WIC 位圖轉譯目標支援的格式

WIC 位圖轉譯目標是由其中一個 ID2D1Factory::CreateWicBitmapRenderTarget 方法所建立的 ID2D1RenderTarget。 它支援下列格式和 Alpha 模式組合。

格式 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

 

WIC 位圖目標的像素格式必須符合 WIC 位圖的像素格式。

DXGI_FORMAT_UNKNOWN格式預設會使用 WIC 位圖格式,而 D2D1_ALPHA_MODE_UNKNOWN Alpha 模式預設會使用 WIC 位圖 Alpha 模式。

ID2D1DCRenderTarget 支援的格式

ID2D1DCRenderTarget 支援下列格式和Alpha模式組合。

格式 Alpha 模式
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE

 

請勿搭配ID2D1DCRenderTarget使用DXGI_FORMAT_UNKNOWN格式或D2D1_ALPHA_MODE_UNKNOWN Alpha模式。 它沒有預設值,而且會導致 ID2D1DCRenderTarget 建立失敗。

指定ID2D1Bitmap的像素格式

一般而言, ID2D1Bitmap 物件支援下列格式和Alpha模式(有一些限制,如下文段落所述。

格式 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和更新版本,僅限) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC1_UNORM(Windows 8.1和更新版本,僅限) D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_BC1_UNORM(Windows 8.1和更新版本,僅限) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC1_UNORM(Windows 8.1和更新版本,僅限) D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_BC2_UNORM(Windows 8.1和更新版本,僅限) D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_BC2_UNORM(Windows 8.1和更新版本,僅限) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC2_UNORM(Windows 8.1和更新版本,僅限) D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_BC3_UNORM(Windows 8.1和更新版本,僅限) D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_BC3_UNORM(Windows 8.1和更新版本,僅限) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC3_UNORM(Windows 8.1和更新版本,僅限) D2D1_ALPHA_MODE_UNKNOWN

 

當您使用 ID2D1RenderTarget::CreateSharedBitmap 方法時,您可以使用D2D1_BITMAP_PROPERTIES結構的 pixelFormat 欄位來指定新轉譯目標的圖元格式。 它必須符合ID2D1Bitmap來源的像素格式。

當您使用 CreateBitmapFromWicBitmap 方法時,您可以使用D2D1_BITMAP_PROPERTIES結構的 pixelFormat 字段(而不是D2D1_RENDER_TARGET_PROPERTIES結構的 pixelFormat 成員)來指定新轉譯目標的像素格式。 它必須符合 WIC 位圖來源的像素格式。

注意

如需支援區塊壓縮 (BCn) 像素格式的詳細資訊,請參閱 區塊壓縮

 

支援的 WIC 格式

當您使用 CreateBitmapFromWicBitmap 方法從 WIC 位圖建立位圖時,或使用 CreateSharedBitmap 方法搭配 IWICBitmapLock,WIC 來源的格式必須是 Direct2D 支援的格式。

WIC 格式 對應的 DXGI 格式 對應的Alpha模式
GUID_WICPixelFormat8bppAlpha DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_STRAIGHT或D2D1_ALPHA_MODE_PREMULTIPLIED
GUID_WICPixelFormat32bppPRGBA DXGI_FORMAT_R8G8B8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED或D2D1_ALPHA_MODE_IGNORE
GUID_WICPixelFormat32bppBGR DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE
GUID_WICPixelFormat32bppPBGRA DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED

 

如需示範如何將 WIC 位圖轉換成支援格式的範例,請參閱 如何從檔案載入點陣圖。

使用不支援的格式

使用先前數據表中所列的圖元格式和 Alpha 模式以外的任何組合,會導致 D2DERR_UNSUPPORTED_PIXEL_FORMATE_INVALIDARG 錯誤。

關於Alpha模式

關於預乘和直 Alpha 模式

D2D1_ALPHA_MODE列舉指出Alpha色板是否使用預乘Alpha、直Alpha或應該忽略並視為不透明。 使用直 Alpha 時,Alpha 色板會指出對應至色彩透明程度的值。

不論目的地格式為何,Direct2D 繪圖命令和筆刷一律會將色彩視為直接 Alpha。

使用預乘 Alpha 時,每個色彩色板都會以 Alpha 值縮放。 一般而言,沒有色彩色板值大於Alpha色板值。 如果預先乘法格式的色彩色板值大於Alpha色板,標準來源過度混合數學會建立加法混合。

Alpha 色板本身的值在直線和預先乘法中都相同。

直線和預乘Alpha之間的差異

使用直 Alpha 描述 RGBA 色彩時,色彩的 Alpha 值會儲存在 Alpha 色板中。 例如,若要描述 60% 不透明的紅色,請使用下列值:(255、0、0、255 * 0.6) = (255、0、0、0、153)。 255 值表示全紅色,153(255% 為 60%)表示色彩應該不透明度為 60%。

使用預乘 Alpha 描述 RGBA 色彩時,每個色彩都會乘以 Alpha 值:(255 * 0.6、 0 * 0.6、0 * 0.6、255 * 0.6) = (153、0、0、153)。

不論轉譯目標的 Alpha 模式為何, D2D1_COLOR_F 值一律會解譯為直 Alpha。 例如,指定ID2D1SolidColorBrush色彩以搭配使用預乘Alpha模式的轉譯目標時,請指定色彩,就像轉譯目標使用直Alpha一樣。 當您使用筆刷繪製時,Direct2D 會將色彩轉譯為您的目的格式。

轉譯目標的Alpha模式

不論Alpha模式設定為何,轉譯目標的內容都支援透明度。 例如,如果您使用具有alpha模式 的轉譯目標繪製部分透明的紅色矩形D2D1_ALPHA_MODE_IGNORE,則矩形會顯示粉紅色(如果背景為白色)。

如果您在alpha模式 D2D1_ALPHA_MODE_PREMULTIPLIED時繪製部分透明的紅色矩形,則矩形會顯示粉紅色(假設背景為白色),而且您可以透過該矩形查看轉譯目標後方的任何專案。 當您使用ID2D1DCRenderTarget轉譯為透明視窗,或使用相容的轉譯目標(CreateCompatibleRenderTarget 方法所建立的轉譯目標)來建立支援透明度的點陣圖時,這會很有用。

ClearType 和 Alpha 模式

如果您指定轉譯目標D2D1_ALPHA_MODE_IGNORE以外的 Alpha 模式,文字反鋸齒模式會自動從 D2D1_TEXT_ANTIALIAS_MODE CLEARTYPE 變更為D2D1_TEXT_ANTIALIAS_MODE GRAYSCALE (當您指定 Alpha 模式時D2D1_ALPHA_MODE_UNKNOWN,Direct2D 會根據轉譯目標的種類,為您設定 Alpha。

您可以使用 SetTextAntialiasMode 方法將文字反鋸齒模式變更回 CLEARTYPE D2D1_TEXT_ANTIALIAS_MODE,但將 ClearType 文字轉譯為透明表面可能會產生無法預測的結果。 如果您想要將 ClearType 文字轉譯為透明轉譯目標,建議您使用下列兩種技術之一。

  • 使用 PushAxisAlignedClip 方法將轉譯目標裁剪到將轉譯文字的區域,然後呼叫 Clear 方法並指定不透明色彩,然後轉譯文字。
  • 使用 DrawRectangle 在文字呈現的區域後面繪製不透明的矩形。

D2D1_PIXEL_FORMAT

D2D1_ALPHA_MODE

DXGI_FORMAT