支援的像素格式和 Alpha 模式
本主題描述 Direct2D 各部分支援的圖元格式和 Alpha 模式,包括每個轉譯目標類型、ID2D1Bitmap 和 ID2D1ImageSource。 其中包含下列各節。
- DXGI 映像來源支援的 YUV 格式
- 指定轉譯目標的像素格式
- ID2D1HwndRenderTarget 的支援格式
- ID2D1DeviceContext 支援的格式
- 相容的轉譯目標支援格式
- DXGI Surface 轉譯目標支援的格式
- WIC 位圖轉譯目標支援的格式
- ID2D1DCRenderTarget 支援的格式
- 指定ID2D1Bitmap的像素格式
- 使用不支援的格式
- 關於Alpha模式
- 相關主題
DXGI 映像來源支援的 YUV 格式
ID2D1ImageSource 是像素的抽象提供者。 它可以從 WIC (CreateImageSourceFromWic 或 IDXGISurface (CreateImageSourceFromDxgi) 具現化。
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結構,並用它來指定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_FORMAT 或 E_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 在文字呈現的區域後面繪製不透明的矩形。