Partager via


Vue d’ensemble des cibles de rendu

Une cible de rendu est une ressource qui hérite de l’interface ID2D1RenderTarget . Une cible de rendu crée des ressources pour le dessin et effectue des opérations de dessin réelles. Cette rubrique décrit les différents types de cibles de rendu Direct2D et comment les utiliser.

Cibles de rendu

Une cible de rendu est une ressource qui hérite de l’interface ID2D1RenderTarget . Une cible de rendu crée des ressources pour le dessin et effectue des opérations de dessin réelles. Il existe plusieurs types de cibles de rendu qui peuvent être utilisées pour afficher des graphiques des manières suivantes :

  • Les objets ID2D1HwndRenderTarget restituent le contenu dans une fenêtre.
  • Les objets ID2D1DCRenderTarget s’affichent dans un contexte d’appareil GDI.
  • Les objets cibles de rendu bitmap restituent le contenu à une bitmap hors écran.
  • Les objets cibles de rendu DXGI s’affichent sur une surface DXGI pour une utilisation avec Direct3D.

Étant donné qu’une cible de rendu est associée à un périphérique de rendu particulier, il s’agit d’une ressource dépendante de l’appareil et cesse de fonctionner si l’appareil est supprimé.

Fonctionnalités de la cible de rendu

Vous pouvez spécifier si une cible de rendu utilise l’accélération matérielle et si l’affichage distant est rendu par un ordinateur local ou distant. Les cibles de rendu peuvent être configurées pour le rendu avec alias ou anticrénelage. Pour le rendu de scènes avec un grand nombre de primitives, un développeur peut également afficher des graphiques 2D en mode alias et utiliser l’anti-échantillonnage D3D multisample pour obtenir une plus grande scalabilité.

Les cibles de rendu peuvent également regrouper les opérations de dessin en couches représentées par l’interface ID2D1Layer . Les couches sont utiles pour collecter les opérations de dessin à combiner lors du rendu d’un cadre. Pour certains scénarios, il peut s’agir d’une alternative utile au rendu sur une cible de rendu bitmap, puis à la réutilisation du contenu bitmap, car les coûts d’allocation pour la superposition sont inférieurs à ceux d’un ID2D1BitmapRenderTarget.

Les cibles de rendu peuvent créer de nouvelles cibles de rendu compatibles avec elles-mêmes, ce qui est utile pour le rendu hors écran intermédiaire tout en conservant les différentes propriétés de cible de rendu qui ont été définies sur l’original.

Il est également possible d’effectuer un rendu à l’aide de GDI sur une cible de rendu Direct2D en appelant QueryInterface sur une cible de rendu pour ID2D1GdiInteropRenderTarget, qui contient des méthodes GetDC et ReleaseDC qui peuvent être utilisées pour récupérer un contexte d’appareil GDI. Le rendu via GDI n’est possible que si la cible de rendu a été créée avec l’indicateur D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE défini. Cela est utile pour les applications qui effectuent principalement un rendu avec Direct2D, mais qui ont un modèle d’extensibilité ou d’autres contenus hérités qui nécessitent la possibilité d’effectuer un rendu avec GDI. Pour plus d’informations, consultez Vue d’ensemble de l’interopérabilité direct2D et GDI.

Render Target Resources

Comme une fabrique, une cible de rendu peut créer des ressources de dessin. Toutes les ressources créées par une cible de rendu sont des ressources dépendantes de l’appareil (tout comme la cible de rendu). Une cible de rendu peut créer les types de ressources suivants :

  • Images bitmap
  • Pinceaux
  • Calques
  • Maillages

Commandes de dessin

Pour afficher le contenu, vous utilisez les méthodes de dessin de cible de rendu. Avant de commencer le dessin, vous appelez la méthode ID2D1RenderTarget::BeginDraw . Une fois le dessin terminé, vous appelez la méthode ID2D1RenderTarget::EndDraw . Entre ces appels, vous utilisez les méthodes Draw et Fill pour afficher les ressources de dessin. La plupart des méthodes Draw et Fill prennent une forme (primitive ou géométrique) et un pinceau pour le remplissage ou le plan de la forme.

Les cibles de rendu fournissent des méthodes de découpage, d’application de masques d’opacité et de transformation de l’espace de coordonnées.

Direct2D utilise un système de coordonnées gaucher : les valeurs positives de l’axe X passent à droite et les valeurs positives de l’axe Y descendent.

Gestion des erreurs

Les commandes de dessin cible de rendu n’indiquent pas si l’opération demandée a réussi. Pour savoir s’il existe des erreurs de dessin, appelez la méthode Flush de la cible de rendu ou la méthode EndDraw pour obtenir un HRESULT.

Exemple : Afficher du contenu dans une fenêtre

L’exemple suivant utilise la méthode CreateHwndRenderTarget pour créer un 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
    );

L’exemple suivant utilise id2D1HwndRenderTarget pour dessiner du texte dans la fenêtre.

//  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;
}

Le code a été omis dans cet exemple.