Efeitos
O que são efeitos Direct2D?
Pode utilizar o Direct2D para aplicar um ou mais efeitos de alta qualidade a uma imagem ou a um conjunto de imagens. As APIs de efeitos são criadas em Direct3D 11 e aproveitam os recursos da GPU para processamento de imagens. Você pode encadear efeitos em um gráfico de efeitos e compor ou misturar a saída de efeitos.
Um efeito Direct2D executa uma tarefa de criação de imagens, como alterar o brilho, dessaturar uma imagem ou criar uma sombra. Os efeitos podem aceitar zero ou mais imagens de entrada, expor várias propriedades que controlam sua operação e gerar uma única imagem de saída.
Cada efeito cria um gráfico de transformação interno composto de transformações individuais. Cada transformação representa uma única operação de imagem. O principal objetivo de uma transformação é abrigar os sombreadores que são executados para cada pixel de saída. Esses sombreadores podem incluir sombreadores de pixel, sombreadores de vértice, o estágio de mesclagem de uma GPU e sombreadores de computação.
Tanto o Direct2Defeitos internos e efeitos personalizados que você pode fazer usando a API de efeitos personalizados funcionam dessa maneira.
Há uma variedade de efeitos embutidos de categorias como as aqui. Consulte a seção Built-in Effects para obter uma lista completa.
- Filtragem
- Composição e mistura
- Transparência
- Cor
- Iluminação e Estilização
- Transformando e dimensionando
- Fontes
Você pode aplicar efeitos a qualquer bitmap, incluindo: imagens carregadas pelo Windows Imaging Component (WIC), primitivos desenhados por Direct2D, texto de DirectWrite ou cenas renderizadas por Direct3D.
Com efeitos Direct2D você pode escrever seus próprios efeitos que você pode usar para seus aplicativos. Uma estrutura de efeito personalizada permite que você use recursos de GPU, como sombreadores de pixel, sombreadores de vértice e a unidade de mistura. Você também pode incluir outros efeitos internos ou personalizados em seu efeito personalizado. A estrutura para criar efeitos personalizados é a mesma que foi usada para criar os efeitos internos do Direct2D. O de API de autor de efeitos Direct2D fornece um conjunto de interfaces para criar e registrar efeitos.
Mais tópicos de efeitos
O restante deste tópico explica os conceitos básicos dos efeitos Direct2D, como a aplicação de um efeito a uma imagem. A tabela aqui tem links para tópicos adicionais sobre efeitos.
Tópico | Descrição |
---|---|
Efeito Shader vinculando |
O Direct2D usa uma otimização chamada vinculação de sombreador de efeito, que combina várias passagens de renderização de gráfico de efeitos em uma única passagem. |
Efeitos personalizados |
Mostra como escrever seus próprios efeitos personalizados usando HLSL padrão. |
Como carregar uma imagem em efeitos Direct2D usando o FilePicker |
Mostra como usar o Windows::Storage::P ickers::FileOpenPicker para carregar uma imagem em efeitos Direct2D. |
Como salvar conteúdo Direct2D em um arquivo de imagem |
Este tópico mostra como usar IWICImageEncoder para salvar conteúdo na forma de um ID2D1Image em um arquivo de imagem codificado, como JPEG. |
Como aplicar efeitos a primitivos |
Este tópico mostra como aplicar uma série de efeitos a Direct2D e primitivas DirectWrite. |
Controle de precisão e recorte numérico em gráficos de efeito |
Os aplicativos que processam efeitos usando Direct2D devem ter o cuidado de alcançar o nível desejado de qualidade e previsibilidade em relação à precisão numérica. |
Aplicar um efeito a uma imagem
Você pode usar a API de efeitos Direct2D para aplicar transformações a imagens.
Observação
Este exemplo pressupõe que você já tenha ID2D1DeviceContext e IWICBitmapSource objetos criados. Para obter mais informações sobre como criar esses objetos, consulte Como carregar uma imagem em efeitos Direct2D usando o FilePicker e Devices and Device Contexts.
Declare uma variável ID2D1Effecte crie uma fonte de bitmap efeito usando o ID2DDeviceContext::CreateEffect método.
ComPtr<ID2D1Effect> bitmapSourceEffect; DX::ThrowIfFailed(m_d2dContext->CreateEffect(CLSID_D2D1BitmapSource, &bitmapSourceEffect));
Defina a propriedade BitmapSource como a fonte de bitmap WIC usando o ID2D1Effect::SetValue.
DX::ThrowIfFailed(m_bitmapSourceEffect->SetValue(D2D1_BITMAPSOURCE_PROP_WIC_BITMAP_SOURCE, m_wicBitmapSource.Get()));
Declare uma variável ID2D1Effecte crie o efeito de desfoque gaussiano.
ComPtr<ID2D1Effect> gaussianBlurEffect; DX::ThrowIfFailed(m_d2dContext->CreateEffect(CLSID_D2D1GaussianBlur, &gaussianBlurEffect));
Defina a entrada para receber a imagem do efeito de origem do bitmap. Defina a quantidade de desfoque, o métodoSetValuee a propriedade de desvio padrão.
gaussianBlurEffect->SetInputEffect(0, bitmapSourceEffect.Get()); DX::ThrowIfFailed(gaussianBlurEffect->SetValue(D2D1_GAUSSIANBLUR_PROP_STANDARD_DEVIATION, 6.0f));
Use o contexto do dispositivo para desenhar a saída de imagem resultante.
m_d2dContext->BeginDraw(); m_d2dContext->Clear(D2D1::ColorF(D2D1::ColorF::CornflowerBlue)); // Draw the blurred image. m_d2dContext->DrawImage(gaussianBlurEffect.Get()); HRESULT hr = m_d2dContext->EndDraw();
O método DrawImage deve ser chamado entre o ID2DDeviceContext::BeginDraw e chamadas EndDraw como outras operações de renderização Direct2D. DrawImage pode pegar uma imagem ou a saída de um efeito e renderizá-la para a superfície de destino.
Transformações espaciais
O Direct2D fornece efeitos internos que podem transformar imagens em espaço 2D e 3D, bem como dimensionamento. Os efeitos de escala e transformação oferecem vários níveis de qualidade como: vizinho mais próximo, linear, cúbico, linear de várias amostras, anisotrópico e cúbico de alta qualidade.
Observação
O modo anisotrópico gera mipmaps ao dimensionar, no entanto, se você definir a propriedade Cached como true nos efeitos que são inseridos para a transformação, os mipmaps não serão gerados sempre para imagens suficientemente pequenas.
ComPtr<ID2D1Effect> affineTransformEffect;
DX::ThrowIfFailed(m_d2dContext->CreateEffect(CLSID_D2D12DAffineTransform, &affineTransformEffect));
affineTransformEffect->SetInput(0, bitmap.Get());
D2D1_MATRIX_3X2_F matrix = D2D1::Matrix3x2F(0.9f, -0.1f, 0.1f, 0.9f, 8.0f, 45.0f);
DX::ThrowIfFailed(affineTransformEffect->SetValue(D2D1_2DAFFINETRANSFORM_PROP_TRANSFORM_MATRIX, matrix));
m_d2dContext->BeginDraw();
m_d2dContext->DrawImage(affineTransformEffect.Get());
m_d2dContext->EndDraw();
Esse uso do efeito de transformação afim 2D gira ligeiramente o bitmap no sentido anti-horário.
Antes |
---|
![]() |
Após |
![]() |
Composição de imagens
Alguns efeitos aceitam várias entradas e as compõem em uma imagem resultante.
Os efeitos compostos e aritméticos integrados fornecem vários modos, para obter mais informações, consulte o tópico composto Composite . A mistura efeito tem uma variedade de modos acelerados por GPU disponíveis.
ComPtr<ID2D1Effect> compositeEffect;
DX::ThrowIfFailed(m_d2dContext->CreateEffect(CLSID_D2D1Composite, &compositeEffect));
compositeEffect->SetInput(0, bitmap.Get());
compositeEffect->SetInput(1, bitmapTwo.Get());
m_d2dContext->BeginDraw();
m_d2dContext->DrawImage(compositeEffect.Get());
m_d2dContext->EndDraw();
O efeito composto combina imagens de várias maneiras diferentes de acordo com o modo especificado.
Ajustes de pixel
Existem alguns efeitos Direct2D incorporados que lhe permitem alterar os dados do pixel. Por exemplo, o efeito de matriz de cores pode ser usado para alterar a cor de uma imagem.
ComPtr<ID2D1Effect> colorMatrixEffect;
DX::ThrowIfFailed(m_d2dContext->CreateEffect(CLSID_D2D1ColorMatrix, &colorMatrixEffect));
colorMatrixEffect->SetInput(0, bitmap.Get());
D2D1_MATRIX_5X4_F matrix = D2D1::Matrix5x4F(0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0);
DX::ThrowIfFailed(colorMatrixEffect->SetValue(D2D1_COLORMATRIX_PROP_COLOR_MATRIX, matrix));
m_d2dContext->BeginDraw();
m_d2dContext->DrawImage(colorMatrixEffect.Get());
m_d2dContext->EndDraw();
Este código pega a imagem e altera a cor, conforme mostrado nas imagens de exemplo aqui.
Antes |
---|
![]() |
Após |
![]() |
Consulte a secção efeitos incorporados de cor para obter mais informações.
Construção de gráficos de efeitos
Você pode encadear efeitos juntos para transformar imagens. Por exemplo, o código aqui aplica uma sombra e uma transformação 2D e, em seguida, compõe os resultados juntos.
ComPtr<ID2D1Effect> shadowEffect;
ComPtr<ID2D1Effect> affineTransformEffect;
ComPtr<ID2D1Effect> compositeEffect;
DX::ThrowIfFailed(m_d2dContext->CreateEffect(CLSID_D2D1Shadow, &shadowEffect));
DX::ThrowIfFailed(m_d2dContext->CreateEffect(CLSID_D2D12DAffineTransform, &affineTransformEffect));
DX::ThrowIfFailed(m_d2dContext->CreateEffect(CLSID_D2D1Composite, &compositeEffect));
shadowEffect->SetInput(0, bitmap.Get());
affineTransformEffect->SetInputEffect(0, shadowEffect.Get());
D2D1_MATRIX_3X2_F matrix = D2D1::Matrix3x2F::Translation(20, 20));
affineTransformEffect->SetValue(D2D1_2DAFFINETRANSFORM_PROP_TRANSFORM_MATRIX, matrix);
compositeEffect->SetInputEffect(0, affineTransformEffect.Get());
compositeEffect->SetInput(1, bitmap.Get());
m_d2dContext->BeginDraw();
m_d2dContext->DrawImage(compositeEffect.Get());
m_d2dContext->EndDraw();
Eis o resultado.
Os efeitos usam ID2D1Image objetos como entrada. Você pode usar umID2D1Bitmapporque a interface é derivada de ID2D1Image. Você também pode usar o ID2D1Effect::GetOutput para obter a saída de um objetoID2D1Effectcomo um ID2D1Image ou usar o método SetInputEffect, que converte a saída para você. Na maioria dos casos, um gráfico de efeitos consiste em ID2D1Effect objetos diretamente encadeados, o que facilita a aplicação de vários efeitos a uma imagem para criar visuais atraentes.
Consulte Como aplicar efeitos a primitivos para obter mais informações.