Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Ein Renderziel ist eine Ressource, die von der Schnittstelle ID2D1RenderTarget erbt. Ein Renderziel erstellt Ressourcen für das Zeichnen und führt tatsächliche Zeichnungsvorgänge aus. In diesem Thema werden die verschiedenen Typen von Direct2D-Renderzielen und deren Verwendung beschrieben.
Renderziele
Ein Render-Target ist eine Ressource, die von der ID2D1RenderTarget-Schnittstelle erbt. Ein Renderziel erstellt Ressourcen für das Zeichnen und führt tatsächliche Zeichnungsvorgänge aus. Es gibt verschiedene Arten von Renderzielen, die zum Rendern von Grafiken auf folgende Weise verwendet werden können:
- ID2D1HwndRenderTarget-Objekte rendern Inhalt in einem Fenster.
- ID2D1DCRenderTarget-Objekte rendern in einem GDI-Gerätekontext.
- Bitmap-Rendering-Zielobjekte rendern Inhalte in eine Bitmap außerhalb des Bildschirms.
- DXGI-Rendering-Zielobjekte rendern auf eine DXGI-Oberfläche zur Verwendung mit Direct3D.
Da ein Renderziel einem bestimmten Renderinggerät zugeordnet ist, handelt es sich um eine geräteabhängige Ressource und funktioniert nicht mehr, wenn das Gerät entfernt wird.
Renderziel-Funktionen
Sie können angeben, ob ein Renderziel Hardwarebeschleunigung verwendet und ob die Remoteanzeige von einem lokalen oder einem Remotecomputer gerendert wird. Renderziele können für aliasiertes oder antialiasiertes Rendering eingerichtet werden. Für das Rendern von Szenen mit einer großen Anzahl von Grundtypen kann ein Entwickler auch 2D-Grafiken im Aliasmodus rendern und D3D-Multisample-Antialiasing verwenden, um eine höhere Skalierbarkeit zu erzielen.
Renderziele können auch Zeichnungsvorgänge in Ebenen gruppieren, die durch die ID2D1Layer-Schnittstelle dargestellt werden. Ebenen sind nützlich, um Zeichenvorgänge zu sammeln, die beim Rendern eines Rahmens zusammengesetzt werden sollen. Für einige Szenarien kann dies eine nützliche Alternative sein: Statt in ein Bitmap-Renderziel zu rendern und danach dessen Inhalt erneut zu verwenden, lassen sich durch Schichtung niedrigere Zuordnungskosten erzielen als bei einem ID2D1BitmapRenderTarget.
Renderziele können neue Renderziele erstellen, die mit sich selbst kompatibel sind. Dies ist nützlich für zwischengeschaltetes Offscreen-Rendering, während die verschiedenen Renderzieleigenschaften beibehalten werden, die für das Original festgelegt wurden.
Es ist auch möglich, mithilfe von GDI auf einem Direct2D-Renderziel zu rendern, indem QueryInterface für ein Renderziel für ID2D1GdiInteropRenderTarget aufgerufen wird, das GetDC - und ReleaseDC-Methoden enthält, die zum Abrufen eines GDI-Gerätekontexts verwendet werden können. Das Rendern über GDI ist nur möglich, wenn das Renderziel mit dem D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE Flag-Satz erstellt wurde. Dies ist nützlich für Anwendungen, die hauptsächlich mit Direct2D gerendert werden, aber über ein Erweiterbarkeitsmodell oder andere Ältere Inhalte verfügen, die die Möglichkeit zum Rendern mit GDI erfordern. Weitere Informationen finden Sie in der Übersicht über die Direct2D- und GDI-Interoperabilität.
Renderziel-Ressourcen
Wie eine Factory kann ein Renderziel Zeichenressourcen erstellen. Alle von einem Renderziel erstellten Ressourcen sind geräteabhängige Ressourcen (genau wie das Renderziel). Ein Render-Ziel kann die folgenden Ressourcentypen erstellen:
- Bitmaps
- Bürsten
- Schichten
- Gittermodelle
Zeichnungsbefehle
Zum Rendern von Inhalten verwenden Sie die Renderzielzeichnungsmethoden. Bevor Sie mit dem Zeichnen beginnen, rufen Sie die ID2D1RenderTarget::BeginDraw-Methode auf. Nachdem Sie die Zeichnung abgeschlossen haben, rufen Sie die ID2D1RenderTarget::EndDraw-Methode auf. Zwischen diesen Aufrufen verwenden Sie Draw- und Fill-Methoden, um Zeichnungsressourcen zu rendern. Bei den meisten Zeichen- und Füllmethoden wird die Füllung oder Kontur einer Form mithilfe einer Form (einem Grundtyp oder einer Geometrie) und einem Pinsel erstellt.
Renderziele stellen Methoden zum Beschneiden, Anwenden von Deckkraftmasken und zur Transformation des Koordinatenraums bereit.
Direct2D verwendet ein linkshändiges Koordinatensystem: Positive x-Achsenwerte gehen nach rechts und positive y-Achsenwerte werden nach unten verschoben.
Fehlerbehandlung
Renderzielzeichnungsbefehle geben nicht an, ob der angeforderte Vorgang erfolgreich war. Um herauszufinden, ob Zeichnungsfehler vorhanden sind, rufen Sie die Flush-Methode des Renderziels oder die EndDraw-Methode auf, um ein HRESULT abzurufen.
Beispiel: Rendern von Inhalten in einem Fenster
Im folgenden Beispiel wird die CreateHwndRenderTarget-Methode verwendet, um eine ID2D1HwndRenderTarget zu erstellen.
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
);
Im nächsten Beispiel wird der ID2D1HwndRenderTarget verwendet, um Text in das Fenster zu zeichnen.
// 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;
}
Code wurde aus diesem Beispiel weggelassen.