Freigeben über


Übersicht über Renderziele

Ein Renderziel 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. In diesem Thema werden die verschiedenen Typen von Direct2D-Renderzielen und deren Verwendung beschrieben.

Renderziele

Ein Renderziel 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 werden in einem GDI-Gerätekontext gerendert.
  • Bitmaprenderungszielobjekte rendern Inhalt in einer Bitmap außerhalb des Bildschirms.
  • DXGI-Renderzielobjekte werden zur Verwendung mit Direct3D auf einer DXGI-Oberfläche gerendert.

Da ein Renderziel einem bestimmten Renderinggerät zugeordnet ist, ist es eine geräteabhängige Ressource und funktioniert nicht mehr, wenn das Gerät entfernt wird.

Rendern von Zielfeatures

Sie können angeben, ob ein Renderziel die Hardwarebeschleunigung verwendet und ob die Remoteanzeige von einem lokalen oder einem Remotecomputer gerendert wird. Renderziele können für Alias- oder Antialiased-Rendering eingerichtet werden. Für Renderingszenen mit einer großen Anzahl von Primitiven 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 von der ID2D1Layer-Schnittstelle dargestellt werden. Ebenen sind nützlich für das Sammeln von Zeichnungsvorgängen, die beim Rendern eines Frames zusammengesetzt werden sollen. In einigen Szenarien kann dies eine nützliche Alternative zum Rendern in einem Bitmaprenderingziel und dann zum erneuten Verwenden des Bitmapinhalts sein, da die Zuordnungskosten für layering niedriger sind als für ein ID2D1BitmapRenderTarget.

Renderziele können neue Renderziele erstellen, die mit sich selbst kompatibel sind. Dies ist nützlich für zwischengeschaltetes Offscreenrendering, während die verschiedenen Renderzieleigenschaften beibehalten werden, die für das Original festgelegt wurden.

Es ist auch möglich, GDI auf einem Direct2D-Renderziel zu rendern, indem QueryInterface für ein Renderziel für ID2D1GdiInteropRenderTarget aufgerufen wird, das über GetDC - und ReleaseDC-Methoden verfügt, 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-Flags erstellt wurde. Dies ist nützlich für Anwendungen, die hauptsächlich mit Direct2D rendern, aber über ein Erweiterbarkeitsmodell oder andere Legacyinhalte verfügen, die die Möglichkeit erfordern, mit GDI zu rendern. Weitere Informationen finden Sie in der Übersicht über die Direct2D- und GDI-Interoperabilität.

Rendern von Zielressourcen

Wie eine Factory kann ein Renderziel Zeichnungsressourcen erstellen. Alle von einem Renderziel erstellten Ressourcen sind geräteabhängige Ressourcen (genau wie das Renderziel). Ein Renderziel kann die folgenden Ressourcentypen erstellen:

  • Bitmaps
  • Pinsel
  • Ebenen
  • Gittermodelle

Zeichenbefehle

Zum Rendern von Inhalten verwenden Sie die Zeichnungsmethoden des Renderziels. Bevor Sie mit dem Zeichnen beginnen, rufen Sie die ID2D1RenderTarget::BeginDraw-Methode auf. Nachdem Sie das Zeichnen abgeschlossen haben, rufen Sie die ID2D1RenderTarget::EndDraw-Methode auf. Zwischen diesen Aufrufen verwenden Sie die Draw- und Fill-Methoden, um Zeichnungsressourcen zu rendern. Die meisten Draw- und Fill-Methoden nehmen eine Form (entweder eine primitive oder eine Geometrie) und einen Pinsel zum Ausfüllen oder Skizzieren der Form an.

Renderziele bieten Methoden zum Ausschneiden, Anwenden von Deckkraftmasken und Transformieren des Koordinatenraums.

Direct2D verwendet ein linkshändiges Koordinatensystem: Positive x-Achsenwerte gehen nach rechts und positive y-Achsenwerte gehen nach unten.

Fehlerbehandlung

Renderbefehle für die Zielzeichnung geben nicht an, ob der angeforderte Vorgang erfolgreich war. Um herauszufinden, ob Zeichnungsfehler vorliegen, rufen Sie die Renderziel-Flush-Methode 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 ein 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 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.