Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Um alvo de renderização é um recurso que herda da interface ID2D1RenderTarget. Um destino de renderização cria recursos para desenho e executa operações de desenho reais. Este tópico descreve os diferentes tipos de destinos de renderização Direct2D e como usá-los.
Destinos de Renderização
Um alvo de renderização é um recurso que herda da interface ID2D1RenderTarget. Um destino de renderização cria recursos para desenho e executa operações de desenho reais. Há vários tipos de destinos de renderização que podem ser usados para renderizar gráficos das seguintes maneiras:
- ID2D1HwndRenderTarget objetos renderizam conteúdo para uma janela.
- ID2D1DCRenderTarget objetos são renderizados para um contexto de dispositivo GDI.
- Os objetos de destino de renderização de bitmap renderizam o conteúdo para um bitmap que está fora da tela.
- Os objetos de destino de renderização DXGI são renderizados em uma superfície DXGI para uso com Direct3D.
Como um destino de renderização está associado a um dispositivo de renderização específico, ele é um recurso dependente do dispositivo e deixa de funcionar se o dispositivo for removido.
Funcionalidades do Alvo de Renderização
Você pode especificar se um destino de renderização usa aceleração de hardware e se a exibição remota é renderizada por um computador local ou remoto. Os destinos de renderização podem ser configurados para renderização com alias ou suavização. Para renderizar cenas com um grande número de primitivos, um desenvolvedor também pode renderizar gráficos 2D no modo de aliasing e usar antialiasing de múltiplas amostras D3D para obter maior escalabilidade.
Os destinos de renderização também podem agrupar operações de desenho em camadas representadas pela interface ID2D1Layer. As camadas são úteis para coletar operações de desenho a serem compostas juntas ao renderizar um quadro. Para alguns cenários, isto pode ser uma alternativa útil à renderização num destino de renderização de bitmap, e, depois, à reutilização do conteúdo de bitmap, pois os custos de alocação para camadas de renderização são menores do que para um ID2D1BitmapRenderTarget.
Os destinos de renderização podem criar novos destinos de renderização que são compatíveis com eles mesmos, o que é útil para renderização intermediária fora da tela, mantendo as várias propriedades de destino de renderização que foram definidas no original.
Também é possível renderizar usando GDI num alvo de renderização Direct2D chamando QueryInterface num alvo de renderização para ID2D1GdiInteropRenderTarget, que tem os métodos GetDC e ReleaseDC, que podem ser usados para recuperar um contexto de dispositivo GDI. A renderização via GDI só é possível se o destino de renderização tiver sido criado com o sinalizador D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE definido. Isso é útil para aplicativos que são renderizados principalmente com Direct2D, mas têm um modelo de extensibilidade ou outro conteúdo herdado que requer a capacidade de renderizar com GDI. Para obter mais informações, consulte a Visão geral da interoperação entre Direct2D e GDI.
Recursos de destino de renderização
Como uma fábrica, um destino de renderização pode criar recursos de desenho. Todos os recursos criados por um destino de renderização são recursos dependentes do dispositivo (assim como o destino de renderização). Um destino de renderização pode criar os seguintes tipos de recursos:
- Bitmaps
- Pincéis
- Camadas
- Malhas
Comandos de desenho
Para renderizar conteúdo, use os métodos de desenho do alvo de renderização. Antes de começar a desenhar, você chama o ID2D1RenderTarget::BeginDraw método. Depois de terminar de desenhar, você chama o ID2D1RenderTarget::EndDraw método. Entre essas chamadas, você usa os métodos Draw e Fill para renderizar recursos de desenho. A maioria dos métodos Draw e Fill tem uma forma (primitiva ou geometria) e um pincel para preencher ou delinear a forma.
Os destinos de renderização oferecem métodos para recorte, aplicação de máscaras de opacidade e transformação do espaço de coordenadas.
O Direct2D utiliza um sistema de coordenadas à esquerda: os valores positivos do eixo x avançam para a direita e os valores positivos do eixo y descem.
Tratamento de erros
Os comandos de desenho do alvo de renderização não indicam se a operação solicitada foi bem-sucedida. Para descobrir se há erros de desenho, chame o destino de renderização método Flush ou método EndDraw para obter um HRESULT.
Exemplo: renderizar conteúdo em uma janela
O exemplo a seguir usa o método CreateHwndRenderTarget para criar um ID2D1HwndRenderTarget.
RECT rc;
GetClientRect(m_hwnd, &rc);
D2D1_SIZE_U size = D2D1::SizeU(
rc.right - rc.left,
rc.bottom - rc.top
);
// Create a Direct2D render target.
hr = m_pD2DFactory->CreateHwndRenderTarget(
D2D1::RenderTargetProperties(),
D2D1::HwndRenderTargetProperties(m_hwnd, size),
&m_pRenderTarget
);
O próximo exemplo usa o ID2D1HwndRenderTarget para desenhar texto para a janela.
// Called whenever the application needs to display the client
// window. This method writes "Hello, World"
//
// Note that this function will automatically discard device-specific
// resources if the Direct3D device disappears during function
// invocation, and will recreate the resources the next time it's
// invoked.
//
HRESULT DemoApp::OnRender()
{
HRESULT hr;
hr = CreateDeviceResources();
if (SUCCEEDED(hr))
{
static const WCHAR sc_helloWorld[] = L"Hello, World!";
// Retrieve the size of the render target.
D2D1_SIZE_F renderTargetSize = m_pRenderTarget->GetSize();
m_pRenderTarget->BeginDraw();
m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity());
m_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White));
m_pRenderTarget->DrawText(
sc_helloWorld,
ARRAYSIZE(sc_helloWorld) - 1,
m_pTextFormat,
D2D1::RectF(0, 0, renderTargetSize.width, renderTargetSize.height),
m_pBlackBrush
);
hr = m_pRenderTarget->EndDraw();
if (hr == D2DERR_RECREATE_TARGET)
{
hr = S_OK;
DiscardDeviceResources();
}
}
return hr;
}
O código foi omitido deste exemplo.