Share via


Formatos de pixel e modos alfa com suporte

Este tópico descreve os formatos de pixel e os modos alfa compatíveis com as várias partes do Direct2D, incluindo cada tipo de destino de renderização, ID2D1Bitmap e ID2D1ImageSource. Ele contém as seguintes seções:

Formatos YUV com suporte para fonte de imagem DXGI

Um ID2D1ImageSource é um provedor abstraído de pixels. Ele pode ser instanciado de WIC (CreateImageSourceFromWic ou IDXGISurface (CreateImageSourceFromDxgi).

ID2D1ImageSourceFromWic dá suporte ao mesmo conjunto de formatos de pixel e modos alfa que ID2D1Bitmap.

Além do indicado acima, um ID2D1ImageSource instanciado do IDXGISurface também dá suporte a alguns formatos de pixel YUV, incluindo dados planares divididos em várias superfícies. Consulte CreateImageSourceFromDxgi para obter mais informações sobre os requisitos para cada formato de pixel.

Formatar
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

 

Especificando um formato de pixel para um destino de renderização

Ao criar um destino de renderização, você deve especificar seu formato de pixel. Para especificar o formato de pixel, use uma estrutura D2D1_PIXEL_FORMAT para definir o membro pixelFormat de uma estrutura D2D1_RENDER_TARGET_PROPERTIES . Em seguida, você passa essa estrutura para o método Create apropriado, como ID2D1Factory::CreateHwndRenderTarget.

A estrutura D2D1_PIXEL_FORMAT tem dois campos:

  • format, um valor DXGI_FORMAT que descreve o tamanho e a organização dos canais em cada pixel e
  • alpha, um valor D2D1_ALPHA_MODE que descreve como as informações alfa são interpretadas.

O exemplo a seguir cria uma estrutura D2D1_PIXEL_FORMAT e a usa para especificar o formato de pixel e o modo alfa de um 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
    );

Diferentes destinos de renderização dão suporte a diferentes combinações de formato e modo alfa. As seções a seguir listam as combinações de formato e alfa compatíveis com cada destino de renderização.

Formatos com suporte para ID2D1HwndRenderTarget

Os formatos com suporte para um ID2D1HwndRenderTarget dependem se ele é renderizado usando hardware ou software ou se Direct2D manipula o modo de renderização automaticamente por padrão.

Observação

Recomendamos que você use DXGI_FORMAT_B8G8R8A8_UNORM como o formato de pixel para melhorar o desempenho. Isso é particularmente útil para destinos de renderização de software. Os destinos de formato BGRA têm um desempenho melhor do que os formatos RGBA.

 

Ao criar um ID2D1HwndRenderTarget, você usa a estrutura D2D1_RENDER_TARGET_PROPERTIES para especificar opções de renderização. As opções incluem o formato de pixel, conforme observado na seção anterior. O campo de tipo dessa estrutura permite que você especifique se o destino de renderização é renderizado em hardware ou software ou se Direct2D deve determinar automaticamente o modo de renderização.

Para habilitar Direct2D determinar se o destino de renderização usa a renderização de hardware ou software, use a configuração D2D1_RENDER_TARGET_TYPE_DEFAULT.

A tabela a seguir lista os formatos com suporte para objetos ID2D1HwndRenderTarget criados usando a configuração D2D1_RENDER_TARGET_TYPE_DEFAULT .

Formatar Modo alfa
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

 

Para forçar um destino de renderização a usar a renderização de hardware, use a configuração D2D1_RENDER_TARGET_TYPE_HARDWARE . A tabela a seguir lista os formatos com suporte para objetos ID2D1HwndRenderTarget que usam explicitamente a renderização de hardware.

Formatar Modo alfa
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

 

Para forçar um destino de renderização a usar a renderização de software, use a configuração D2D1_RENDER_TARGET_TYPE_SOFTWARE . A tabela a seguir lista os formatos com suporte para objetos ID2D1HwndRenderTarget que usam explicitamente a renderização de software.

Formatar Modo alfa
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

 

Independentemente de o ID2D1HwndRenderTarget ser acelerado por hardware, o formato DXGI_FORMAT_UNKNOWN usa DXGI_FORMAT_B8G8R8A8 por padrão e o modo alfa D2D1_ALPHA_MODE_UNKNOWN usa D2D1_ALPHA_MODE_IGNORE por padrão.

Formatos com suporte para ID2D1DeviceContext

Começando com Windows 8 o contexto do dispositivo aproveita mais dos formatos de alta cor do Direct3D, como:

  • DXGI_FORMAT_B8G8R8A8_UNORM_SRGB
  • DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
  • DXGI_FORMAT_R16G16B16A16_UNORM
  • DXGI_FORMAT_R16G16B16A16_FLOAT
  • DXGI_FORMAT_R32G32B32A32_FLOAT

Use o método ID2D1DeviceContext::IsDxgiFormatSupported para ver se um formato funciona em um contexto de dispositivo específico. Esses formatos também podem funcionar em um ID2D1HwndRenderTarget.

Esses formatos são além dos formatos compatíveis com a interface ID2D1HwndRenderTarget no Windows 7. Consulte Dispositivos e Contextos de Dispositivo para obter mais informações.

Formatos com suporte para destino de renderização compatível

Um destino de renderização compatível (um ID2D1BitmapRenderTarget criado por um dos métodos ID2D1RenderTarget::CreateCompatibleRenderTarget ) herda os formatos e modos alfa com suporte do destino de renderização que o criou. Um destino de renderização compatível também dá suporte às seguintes combinações de formato e modo alfa, independentemente do suporte de seu pai.

Formatar Modo alfa
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_STRAIGHT
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_UNKNOWN

 

O formato DXGI_FORMAT_UNKNOWN usa o formato de destino de renderização pai por padrão e o modo alfa D2D1_ALPHA_MODE_UNKNOWN usa D2D1_ALPHA_MODE_PREMULTIPLIED por padrão.

Formatos com suporte para destino de renderização do Surface Do DXGI

Um destino de renderização DXGI é um ID2D1RenderTarget criado por um dos métodos ID2D1Factory::CreateDxgiSurfaceRenderTarget . Ele dá suporte às seguintes combinações de formato e modo alfa.

Formatar Modo alfa
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

 

Observação

O formato deve corresponder ao formato da superfície DXGI ao qual a superfície DXGI renderiza o destino desenha.

 

O formato DXGI_FORMAT_UNKNOWN usa o formato de superfície DXGI por padrão. Não use o modo alfa D2D1_ALPHA_MODE_UNKNOWN com um destino de renderização de superfície DXGI. Ele não tem nenhum valor padrão e fará com que a criação do destino de renderização de superfície DXGI falhe.

Formatos com suporte para o destino de renderização de bitmap wic

Um destino de renderização de bitmap wic é um ID2D1RenderTarget criado por um dos métodos ID2D1Factory::CreateWicBitmapRenderTarget . Ele dá suporte às seguintes combinações de formato e modo alfa.

Formatar Modo alfa
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

 

O formato de pixel do destino de bitmap wic deve corresponder ao formato de pixel do bitmap WIC.

O formatoDXGI_FORMAT_UNKNOWN usa o formato de bitmap WIC por padrão e o modo alfa D2D1_ALPHA_MODE_UNKNOWN usa o modo alfa de bitmap WIC por padrão.

Formatos com suporte para ID2D1DCRenderTarget

Um ID2D1DCRenderTarget dá suporte às seguintes combinações de formato e modo alfa.

Formatar Modo alfa
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE

 

Não use o formato DXGI_FORMAT_UNKNOWN ou o modo alfa D2D1_ALPHA_MODE_UNKNOWN com um ID2D1DCRenderTarget. Ele não tem nenhum valor padrão e fará com que a criação de ID2D1DCRenderTarget falhe.

Especificando um formato de pixel para um ID2D1Bitmap

Geralmente, os objetos ID2D1Bitmap dão suporte aos seguintes formatos e modos alfa (com algumas restrições, descritas nos parágrafos a seguir.)

Formatar Modo alfa
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 (somente Windows 8.1 e posterior) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC1_UNORM (somente Windows 8.1 e posterior) D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_BC1_UNORM (somente Windows 8.1 e posterior) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC1_UNORM (somente Windows 8.1 e posterior) D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_BC2_UNORM (somente Windows 8.1 e posterior) D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_BC2_UNORM (somente Windows 8.1 e posterior) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC2_UNORM (somente Windows 8.1 e posterior) D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_BC3_UNORM (somente Windows 8.1 e posterior) D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_BC3_UNORM (somente Windows 8.1 e posterior) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC3_UNORM (somente Windows 8.1 e posterior) D2D1_ALPHA_MODE_UNKNOWN

 

Ao usar o método ID2D1RenderTarget::CreateSharedBitmap , você usa o campo pixelFormat de uma estrutura D2D1_BITMAP_PROPERTIES para especificar o formato de pixel do novo destino de renderização. Ele deve corresponder ao formato de pixel da origem ID2D1Bitmap .

Ao usar o método CreateBitmapFromWicBitmap , você usa o campo pixelFormat de uma estrutura de D2D1_BITMAP_PROPERTIES (em vez do membro pixelFormat de uma estrutura D2D1_RENDER_TARGET_PROPERTIES ) para especificar o formato de pixel do novo destino de renderização. Ele deve corresponder ao formato de pixel da origem do bitmap wic.

Observação

Para obter mais informações sobre o suporte para formatos de pixel compactados por bloco (BCn), consulte Compactação de bloco.

 

Formatos WIC com suporte

Quando você usa o método CreateBitmapFromWicBitmap para criar um bitmap de um bitmap wic ou quando você usa o método CreateSharedBitmap com um IWICBitmapLock, a origem wic deve estar em um formato compatível com Direct2D.

Formato WIC Formato DXGI correspondente Modo alfa correspondente
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

 

Para obter um exemplo que mostra como converter um bitmap WIC em um formato com suporte, consulte How to Load a Bitmap from a File.

Usando um formato sem suporte

Usar qualquer combinação diferente dos formatos de pixel e dos modos alfa listados nas tabelas anteriores resulta em um erro de D2DERR_UNSUPPORTED_PIXEL_FORMAT ou E_INVALIDARG .

Sobre modos alfa

Sobre os modos Alfa Retos e Pré-multiplicados

A enumeração D2D1_ALPHA_MODE indica se o canal alfa usa alfa pré-multiplicado, alfa reto ou deve ser ignorado e considerado opaco. Com alfa reto, o canal alfa indica um valor que corresponde à transparência de uma cor.

As cores são sempre tratadas como alfa retas Direct2D comandos e pincéis de desenho, independentemente do formato de destino.

Com alfa pré-multiplicado, cada canal de cor é dimensionado pelo valor alfa. Normalmente, nenhum valor de canal de cor é maior que o valor do canal alfa. Se um valor de canal de cor em um formato pré-multiplicado for maior que o canal alfa, a matemática de mesclagem de fonte padrão criará uma combinação aditiva.

O valor do canal alfa em si é o mesmo em alfa reto e pré-multiplicado.

As diferenças entre alfa reto e pré-multiplicado

Ao descrever uma cor RGBA usando alfa reto, o valor alfa da cor é armazenado no canal alfa. Por exemplo, para descrever uma cor vermelha que é 60% opaca, use os seguintes valores: (255, 0, 0, 255 * 0,6) = (255, 0, 0, 153). O valor 255 indica vermelho completo e 153 (que é 60% de 255) indica que a cor deve ter uma opacidade de 60%.

Ao descrever uma cor RGBA usando alfa pré-multiplicado, cada cor é multiplicada pelo valor alfa: (255 * 0,6, 0 * 0,6, 0 * 0,6, 255 * 0,6) = (153, 0, 0, 153).

Independentemente do modo alfa do destino de renderização, D2D1_COLOR_F valores são sempre interpretados como alfa retos. Por exemplo, ao especificar a cor de um ID2D1SolidColorBrush para uso com um destino de renderização que usa o modo alfa pré-multiplicado, especifique a cor exatamente como faria se o destino de renderização usasse alfa reto. Quando você pinta com o pincel, Direct2D converte a cor no formato de destino para você.

Modo Alfa para Destinos de Renderização

Independentemente da configuração do modo alfa, o conteúdo de um destino de renderização dá suporte à transparência. Por exemplo, se você desenhar um retângulo vermelho parcialmente transparente com um destino de renderização com um modo alfa de D2D1_ALPHA_MODE_IGNORE, o retângulo aparecerá rosa (se a tela de fundo for branca).

Se você desenhar um retângulo vermelho parcialmente transparente quando o modo alfa for D2D1_ALPHA_MODE_PREMULTIPLIED, o retângulo aparecerá rosa (supondo que a tela de fundo seja branca) e você poderá ver através dele o que estiver atrás do destino de renderização. Isso é útil quando você usa um ID2D1DCRenderTarget para renderizar em uma janela transparente ou quando você usa um destino de renderização compatível (um destino de renderização criado pelo método CreateCompatibleRenderTarget ) para criar um bitmap que dê suporte à transparência.

Modos ClearType e Alpha

Se você especificar um modo alfa diferente de D2D1_ALPHA_MODE_IGNORE para um destino de renderização, o modo de suavização de texto será alterado automaticamente de D2D1_TEXT_ANTIALIAS_MODE CLEARTYPE para D2D1_TEXT_ANTIALIAS_MODE GRAYSCALE. (Quando você especifica um modo alfa de D2D1_ALPHA_MODE_UNKNOWN, Direct2D define o alfa para você, dependendo do tipo de destino de renderização.)

Você pode usar o método SetTextAntialiasMode para alterar o modo de suavização de texto de volta para D2D1_TEXT_ANTIALIAS_MODE CLEARTYPE, mas renderizar o texto ClearType em uma superfície transparente pode criar resultados imprevisíveis. Se você quiser renderizar texto ClearType em um destino de renderização transparente, recomendamos que você use uma das duas técnicas a seguir.

  • Use o método PushAxisAlignedClip para recortar o destino de renderização para a área em que o texto será renderizado, depois chame o método Clear e especifique uma cor opaca e renderize o texto.
  • Use DrawRectangle para desenhar um retângulo opaco atrás da área em que o texto será renderizado.

D2D1_PIXEL_FORMAT

D2D1_ALPHA_MODE

DXGI_FORMAT