Compartilhar via


Visão geral de destinos de renderização

Um destino 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 Direct2D renderizar destinos e como usá-los.

Renderizar destinos

Um destino 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:

  • Os objetos ID2D1HwndRenderTarget renderizam o conteúdo em uma janela.
  • Objetos ID2D1DCRenderTarget são renderizados em um contexto de dispositivo GDI.
  • Os objetos de destino de renderização de bitmap renderizam o conteúdo em um bitmap 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.

Renderizar recursos de destino

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 suavizada. Para renderizar cenas com um grande número de primitivos, um desenvolvedor também pode renderizar elementos gráficos 2D no modo alias e usar a suavização de várias camadas 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, essa pode ser uma alternativa útil para renderizar para um destino de renderização de bitmap e, em seguida, reutilizar o conteúdo de bitmap, pois os custos de alocação para camadas são menores do que para um ID2D1BitmapRenderTarget.

Os destinos de renderização podem criar novos destinos de renderização compatíveis com eles mesmos, o que é útil para renderização fora da tela intermediária, mantendo as várias propriedades de destino de renderização que foram definidas no original.

Também é possível renderizar usando GDI em um destino de renderização Direct2D chamando QueryInterface em um destino de renderização para ID2D1GdiInteropRenderTarget, que tem métodos GetDC e ReleaseDC que podem ser usados para recuperar um contexto de dispositivo GDI. A renderização via GDI só será 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 renderização com GDI. Para obter mais informações, consulte a Visão geral da interoperação de Direct2D e GDI.

Renderizar recursos de destino

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 o conteúdo, use os métodos de desenho de destino de renderização. Antes de começar a desenhar, você chama o método ID2D1RenderTarget::BeginDraw . Depois de concluir o desenho, você chama o método ID2D1RenderTarget::EndDraw . Entre essas chamadas, você usa os métodos Desenhar e Preencher para renderizar recursos de desenho. A maioria dos métodos Draw e Fill toma uma forma (um primitivo ou uma geometria) e um pincel para preencher ou delinear a forma.

Os destinos de renderização fornecem métodos para recorte, aplicação de máscaras de opacidade e transformação do espaço de coordenadas.

Direct2D usa um sistema de coordenadas canhoto: os valores positivos do eixo x prossseguem para a direita e os valores positivos do eixo y prossseguem para baixo.

Tratamento de erros

Os comandos de desenho de destino de renderização não indicam se a operação solicitada foi bem-sucedida. Para descobrir se há erros de desenho, chame o método Flush de destino de renderização ou o 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 o 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 neste exemplo.