Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Obiekt docelowy renderowania to zasób dziedziczony z interfejsu ID2D1RenderTarget . Obiekt docelowy renderowania tworzy zasoby do rysowania i wykonuje rzeczywiste operacje na rysunku. W tym temacie opisano różne typy obiektów docelowych renderowania Direct2D i sposób ich używania.
Renderuj obiekty docelowe
Obiekt docelowy renderowania to zasób dziedziczony z interfejsu ID2D1RenderTarget . Obiekt docelowy renderowania tworzy zasoby do rysowania i wykonuje rzeczywiste operacje na rysunku. Istnieje kilka rodzajów obiektów docelowych renderowania, których można użyć do renderowania grafiki w następujący sposób:
- ID2D1HwndRenderTarget obiekty renderują zawartość do okna.
- OBIEKTY ID2D1DCRenderTarget są renderowane w kontekście urządzenia GDI.
- Mapa bitowa renderuje obiekty docelowe renderowania zawartości na mapę bitową poza ekranem.
- Obiekty docelowe renderowania DXGI renderują na powierzchni DXGI, aby można je było wykorzystać w Direct3D.
Ponieważ element docelowy renderowania jest skojarzony z konkretnym urządzeniem renderowania, jest to zasób zależny od urządzenia i przestaje działać, jeśli urządzenie zostanie usunięte.
Renderowanie funkcji docelowych
Można określić, czy element docelowy renderowania używa przyspieszania sprzętowego i czy ekran zdalny jest renderowany przez komputer lokalny lub zdalny. Obiekty docelowe renderowania można skonfigurować na potrzeby renderowania aliasów lub antyaliased. W przypadku renderowania scen z dużą liczbą elementów pierwotnych, deweloper może również renderować grafikę 2D w trybie z aliasowaniem i używać antyaliasingu D3D z wieloma próbkami, aby osiągnąć większą skalowalność.
Obiekty docelowe renderowania mogą również grupować operacje rysowania na warstwy reprezentowane przez interfejs ID2D1Layer . Warstwy są przydatne do zbierania operacji rysowania, które mają być komponowane razem podczas renderowania klatki. W niektórych scenariuszach może to być przydatna alternatywa dla renderowania elementu docelowego renderowania mapy bitowej, a następnie ponowne wykorzystanie zawartości mapy bitowej, ponieważ koszty alokacji warstwy są niższe niż w przypadku elementu ID2D1BitmapRenderTarget.
Obiekty docelowe renderowania mogą tworzyć nowe obiekty docelowe renderowania zgodne z samymi sobą, co jest przydatne w przypadku renderowania pośredniego poza ekranem przy zachowaniu różnych właściwości elementu docelowego renderowania ustawionych na oryginalnym ekranie.
Można również renderować przy użyciu GDI na obiekcie docelowym renderowania Direct2D, wywołując QueryInterface na obiekcie docelowym renderowania ID2D1GdiInteropRenderTarget, który ma metody GetDC i ReleaseDC, umożliwiające pobieranie kontekstu urządzenia GDI. Renderowanie za pośrednictwem interfejsu GDI jest możliwe tylko wtedy, gdy element docelowy renderowania został utworzony z ustawioną flagą D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE. Jest to przydatne w przypadku aplikacji, które są głównie renderowane z funkcją Direct2D, ale mają model rozszerzalności lub inną starszą zawartość, która wymaga możliwości renderowania za pomocą interfejsu GDI. Aby uzyskać więcej informacji, zobacz Omówienie międzyoperacyjności direct2D i GDI.
Renderowanie zasobów docelowych
Podobnie jak w przypadku fabryki obiekt docelowy renderowania może tworzyć zasoby rysunkowe. Wszystkie zasoby utworzone przez element docelowy renderowania to zasoby zależne od urządzenia (podobnie jak obiekt docelowy renderowania). Obiekt docelowy renderowania może utworzyć następujące typy zasobów:
- Mapy bitowe
- Pędzle
- Warstwy
- Siatki
Polecenia rysowania
Aby renderować zawartość, należy używać docelowych metod renderowania. Przed rozpoczęciem rysowania wywołasz metodę ID2D1RenderTarget::BeginDraw . Po zakończeniu rysowania wywołasz metodę ID2D1RenderTarget::EndDraw . Między tymi wywołaniami użyjesz metod Draw i Fill do renderowania zasobów rysunkowych. Większość metod Draw i Fill przyjmuje kształt (prymityw lub geometria) oraz pędzel do wypełniania lub obrysowania kształtu.
Obiekty docelowe renderowania udostępniają metody wycinania, stosowania masek nieprzezroczystości i przekształcania przestrzeni współrzędnych.
Direct2D używa układu współrzędnych leworęcznych: dodatnie wartości osi x przebiegają w prawo, a dodatnie wartości osi y w dół.
Obsługa błędów
Polecenia renderowania rysunku docelowego nie wskazują, czy żądana operacja zakończyła się pomyślnie. Aby dowiedzieć się, czy występują błędy rysunku, wywołaj docelową metodę Flush renderowania lub metodę EndDraw , aby uzyskać hrESULT.
Przykład: renderowanie zawartości w oknie
W poniższym przykładzie użyto metody CreateHwndRenderTarget w celu utworzenia obiektu 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
);
W następnym przykładzie użyto ID2D1HwndRenderTarget, aby narysować tekst w oknie.
// 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;
}
Kod został pominięty w tym przykładzie.