Overzicht van renderdoelen
Een renderdoel is een resource die wordt overgenomen van de ID2D1RenderTarget interface. Een renderdoel creëert middelen voor het tekenen en voert feitelijke tekenoperaties uit. In dit onderwerp worden de verschillende typen Direct2D-renderdoelen beschreven en hoe u deze kunt gebruiken.
Doelen weergeven
Een renderdoel is een resource die wordt overgenomen van de ID2D1RenderTarget interface. Een renderdoel creëert resources voor het tekenen en voert daadwerkelijke tekenbewerkingen uit. Er zijn verschillende soorten renderdoelen die kunnen worden gebruikt om afbeeldingen op de volgende manieren weer te geven:
- ID2D1HwndRenderTarget objecten inhoud weergeven in een venster.
- ID2D1DCRenderTarget objecten worden weergegeven in een GDI-apparaatcontext.
- Doelobjecten van bitmapweergave weergeven inhoud naar een bitmap buiten het scherm.
- DXGI-renderdoelobjecten worden weergegeven op een DXGI-oppervlak voor gebruik met Direct3D.
Omdat een renderdoel is gekoppeld aan een bepaald renderingapparaat, is het een apparaatafhankelijke resource en werkt het niet meer als het apparaat wordt verwijderd.
Doelfuncties weergeven
U kunt opgeven of een renderdoel hardwareversnelling gebruikt en of extern beeldscherm wordt weergegeven door een lokale of externe computer. Renderdoelen kunnen worden ingesteld voor alias- of antialiased weergave. Voor het weergeven van scènes met een groot aantal primitieven kan een ontwikkelaar ook 2D-afbeeldingen weergeven in de aliasmodus en D3D multisample antialiasing gebruiken om grotere schaalbaarheid te bereiken.
Renderdoelen kunnen ook tekenbewerkingen groeperen in lagen die worden vertegenwoordigd door de ID2D1Layer interface. Lagen zijn handig voor het verzamelen van tekenbewerkingen die samen moeten worden samengesteld bij het weergeven van een frame. Voor sommige scenario's kan dit een nuttig alternatief zijn voor het renderen naar een bitmapweergavedoel en vervolgens het opnieuw gebruiken van de bitmapinhoud, omdat de toewijzingskosten voor lagen lager zijn dan voor een ID2D1BitmapRenderTarget.
Renderdoelen kunnen nieuwe renderdoelen maken die compatibel zijn met zichzelf, wat handig is voor tussenliggend renderen buiten het scherm terwijl tegelijkertijd de verschillende renderdoeleigenschappen behouden blijven, zoals ingesteld op het origineel.
Het is ook mogelijk om te renderen met GDI op een Direct2D-renderdoel door QueryInterface- aan te roepen op een renderdoel voor ID2D1GdiInteropRenderTarget, die GetDC- en ReleaseDC methoden bevat die kunnen worden gebruikt om een GDI-apparaatcontext op te halen. Rendering via GDI is alleen mogelijk als het renderdoel is gemaakt met de D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE vlag ingesteld. Dit is handig voor toepassingen die voornamelijk worden weergegeven met Direct2D, maar een uitbreidbaarheidsmodel of andere verouderde inhoud hebben waarvoor de mogelijkheid is vereist om met GDI weer te geven. Zie de Direct2D en GDI Interoperation Overviewvoor meer informatie.
Doelbronnen weergeven
Net als een fabriek kan een renderdoelwit tekenbronnen creëren. Alle resources die door een renderdoel zijn gemaakt, zijn apparaatafhankelijke resources (net als het renderdoel). Een renderdoel kan de volgende typen resources maken:
- Bitmaps
- Borstels
- Lagen
- Netten
Tekenopdrachten
Als u inhoud wilt weergeven, gebruikt u de methoden voor het renderen van doeltekeningen. Voordat u begint met tekenen, roept u de methode ID2D1RenderTarget::BeginDraw aan. Nadat u klaar bent met tekenen, roept u de methode ID2D1RenderTarget::EndDraw aan. Tussen deze aanroepen gebruikt u teken- en opvulmethoden om tekenbronnen weer te geven. De meeste teken- en opvulmethoden nemen een vorm (een primitieve vorm of geometrische figuur) en een borstel voor het vullen of omtrekken van de vorm.
Renderdoelen bieden methoden voor het knippen, toepassen van dekkingsmaskers en het transformeren van de coördinaatruimte.
Direct2D maakt gebruik van een linkshandig coördinaatsysteem: positieve x-aswaarden gaan verder naar rechts en positieve y-aswaarden gaan omlaag.
Foutafhandeling
Opdrachten voor doeltekeningen weergeven geven niet aan of de aangevraagde bewerking is geslaagd. Als u wilt weten of er tekenfouten zijn, roept u het renderdoel aan methode Flush of EndDraw methode om een HRESULT-te verkrijgen.
Voorbeeld: Inhoud weergeven in een venster
In het volgende voorbeeld wordt de methode CreateHwndRenderTarget gebruikt om een ID2D1HwndRenderTargette maken.
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
);
In het volgende voorbeeld wordt de ID2D1HwndRenderTarget- gebruikt om tekst naar het venster te tekenen.
// 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 is weggelaten uit dit voorbeeld.