Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Une cible de rendu est une ressource qui hérite de l’interface ID2D1RenderTarget. Une cible de rendu crée des ressources pour dessiner et effectue des opérations de dessin réelles. Cette rubrique décrit les différents types de cibles de rendu Direct2D et leur utilisation.
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 dessiner 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 de la manière suivante :
- Les objets ID2D1HwndRenderTarget restituent le contenu dans une fenêtre.
- Les objets ID2D1DCRenderTarget effectuent le rendu dans un contexte d’appareil GDI.
- Les objets cibles de rendu bitmap restituent du contenu dans une bitmap hors écran.
- Les objets cibles de rendu DXGI s’affichent sur une surface DXGI à utiliser avec Direct3D.
Étant donné qu’une cible de rendu est associée à un appareil 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 des cibles 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 un rendu avec ou sans crénelage (aliasing). Pour les scènes de rendu avec un grand nombre de primitives, un développeur peut également afficher des graphiques 2D en mode alias et utiliser l’anticrénelage multisample D3D 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 des opérations de dessin à compositer ensemble lors du rendu d’un cadre. Pour certains scénarios, cela peut être une alternative utile au rendu sur une cible de rendu bitmap et à la réutilisation des contenus 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 la cible de rendu 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 a des méthodes GetDC et ReleaseDC sur celle-ci qui peuvent être utilisées pour récupérer un contexte d’appareil GDI. Le rendu via GDI est possible uniquement 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 sont principalement rendues avec Direct2D, mais qui ont un modèle d’extensibilité ou d’autres contenus hérités qui nécessitent la possibilité de rendre avec GDI. Pour plus d’informations, consultez la vue d’ensemble de l’interopérabilité Direct2D et GDI.
Afficher les ressources cibles
Comme une usine, 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 (comme la cible de rendu). Une cible de rendu peut créer les types de ressources suivants :
- Bitmaps
- Pinceaux
- Calques
- Maillages
Commandes de dessin
Pour afficher du contenu, vous utilisez les méthodes de dessin des cibles 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 des méthodes Draw et Fill pour afficher les ressources de dessin. La plupart des méthodes Draw et Fill utilisent une forme (une primitive ou une géométrie) et un pinceau pour remplir ou dessiner 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 des x passent à droite et les valeurs positives de l’axe y se poursuivent vers le bas.
Gestion des erreurs
Les commandes de dessin des cibles de rendu n’indiquent pas si l’opération demandée a réussi. Pour déterminer s’il existe des erreurs de dessin, appelez la méthode Flush cible de rendu ou la méthode EndDraw pour obtenir un HRESULT.
Exemple : Afficher le 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 l’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 de cet exemple.