Compartilhar 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, o ID2D1Bitmap e ID2D1ImageSource. Ele contém as seções a seguir.

Formatos YUV suportados para fonte de imagem DXGI

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

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

Além dos itens acima, um ID2D1ImageSource que é instanciado de IDXGISurface também é suportado com alguns formatos de pixel YUV, incluindo dados planos 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

 

Especificar 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 de Criação apropriado, como ID2D1Factory::CreateHwndRenderTarget.

A estrutura D2D1_PIXEL_FORMAT tem dois campos:

  • formato, um valor DXGI_FORMAT que descreve o tamanho e a disposiçã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 suportados para ID2D1HwndRenderTarget

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

Observação

Recomendamos que você use DXGI_FORMAT_B8G8R8A8_UNORM como formato de pixel para melhor 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.

 

Quando você cria um ID2D1HwndRenderTarget, você usa a estrutura D2D1_RENDER_TARGET_PROPERTIES para especificar as opções de renderização. As opções incluem o formato de pixel, conforme observado na seção anterior. O tipo de campo dessa estrutura habilita 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 o Direct2D para determinar se o destino de renderização usa 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 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 suportados para ID2D1DeviceContext

A partir do Windows 8, o contexto de dispositivo tira proveito dos formatos de cores altas 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 ID2D1HwndRenderTarget.

Esses formatos são adicionais aos formatos compatíveis com a interface ID2D1HwndRenderTarget no Windows 7. Consulte Dispositivos e contextos de dispositivo para mais informações.

Formatos suportados 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 com suporte e os modos alfa 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 que seu pai dá suporte.

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 suportados para o destino de renderização de superfície DXGI

Um destino de renderização DXGI é um ID2D1RenderTarget criado por um dos métodos ID2D1Factory::CreateDxgiSurfaceRenderTarget. Ele suporta as 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 para a qual o destino de renderização da superfície DXGI é desenhado.

 

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 valor padrão e fará com que a criação do destino de renderização de superfície DXGI falhe.

Formatos suportados para o destino de renderização de bitmap do WIC

Um destino de renderização WIC é um ID2D1RenderTarget criado por um dos métodos ID2D1Factory::CreateWicBitmapRenderTarget. Ele suporta as 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 do WIC deve corresponder ao formato de pixel do bitmap do WIC.

O formato DXGI_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 da WIC por padrão.

Formatos suportados 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 ID2D1DCRenderTarget. Ele não tem valor padrão e fará com que a criação de ID2D1DCRenderTarget falhe.

Especificar 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 (Windows 8.1 e posterior, apenas) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC1_UNORM (Windows 8.1 e posterior, apenas) D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_BC1_UNORM (Windows 8.1 e posterior, apenas) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC1_UNORM (Windows 8.1 e posterior, apenas) D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_BC2_UNORM (Windows 8.1 e posterior, apenas) D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_BC2_UNORM (Windows 8.1 e posterior, apenas) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC2_UNORM (Windows 8.1 e posterior, apenas) D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_BC3_UNORM (Windows 8.1 e posterior, apenas) D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_BC3_UNORM (Windows 8.1 e posterior, apenas) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC3_UNORM (Windows 8.1 e posterior, apenas) 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 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 de bitmap da WIC.

Observação

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

 

Formatos WIC suportados

Quando você usa o método CreateBitmapFromWicBitmap para criar um bitmap de um bitmap WIC ou quando 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 or D2D1_ALPHA_MODE_PREMULTIPLIED
GUID_WICPixelFormat32bppPRGBA DXGI_FORMAT_R8G8B8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED or 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 Como carregar um bitmap de um arquivo.

Usar um formato não suportado

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

Sobre os modos alfa

Sobre os modos alfa pré-multiplicado e direto

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

As cores são sempre tratadas como alfa direto por comandos de desenho e pincéis Direct2D, 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 origem sobreposta padrão criará uma mesclagem aditiva.

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

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

Ao descrever uma cor RGBA usando alfa direto, 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, valores D2D1_COLOR_F são sempre interpretados como alfa direto. 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 da mesma forma que faria se o destino de renderização usasse alfa direto. Quando você pinta com o pincel, Direct2D converte a cor para o 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 oferece 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 o plano de fundo for branco).

Se você desenhar um retângulo vermelho parcialmente transparente quando o modo alfa estiver D2D1_ALPHA_MODE_PREMULTIPLIED, o retângulo aparecerá rosa (supondo que o plano de fundo seja branco) e você poderá ver através dele o que estiver por trá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 serrilhado de texto mudará 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 serrilhado de texto de volta para D2D1_TEXT_ANTIALIAS_MODE CLEARTYPE mas renderizar 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 na área em que o texto será renderizado, chame o método Limpar e especifique uma cor opaca e, em seguida, 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