Udostępnij przez


Omówienie interfejsu API Direct2D

Direct2D udostępnia interfejs API podobny do Direct3D do użycia z językiem C lub C++. Interfejs API uwidacznia różne funkcje związane z rysunkiem:

  • Renderuj cele renderowania na potrzeby wyświetlania i renderowania poza ekranem z użyciem Direct2D, Direct3D lub GDI.
  • Obiekty do zarządzania stanem rysunku, takie jak przekształcenia przestrzeni współrzędnych i tryby antyaliasingowe.
  • Reprezentacje danych geometrycznych i funkcji przetwarzania geometrii.
  • Funkcje renderowania map bitowych, geometrii i tekstu.
  • Zasady korzystania z zawartości graficznej utworzonej przy użyciu GDI lub Direct3D.

Ten temat zawiera omówienie obiektów tworzących interfejs API Direct2D. Zawiera on następujące sekcje:

Pliki nagłówka Direct2D

Interfejs API Direct2D jest definiowany przez następujące pliki nagłówkowe.

Plik nagłówka Description
d2d1.h Definiuje wersje C i C++ podstawowego interfejsu API Direct2D.
d2d1helper.h Definiuje funkcje, klasy i struktury pomocnika języka C++.
d2dbasetypes.h Definiuje elementy pierwotne rysunku dla direct2D, takie jak punkty i prostokąty. Nagłówek ten jest zawarty w d2d1.h.
d2derr.h Definiuje kody błędów direct2D. Ten plik nagłówkowy jest dołączony z d2d1.h.
d2d1_1.h Definiuje wersje C i C++ podstawowego interfejsu API Direct2D dla systemu Windows 8 i nowszych.
d2d1_1helper.h Definiuje funkcje, klasy i struktury pomocnika języka C++ dla systemu Windows 8 i nowszych.
d2d1effects.h Definiuje część API Direct2D dla efektów obrazu w wersjach C i C++ dla systemu Windows 8 i nowszych.
d2d1effecthelpers.h Definiuje pomocnicze funkcje, klasy i struktury w ramach części efektów obrazu interfejsu API Direct2D dla systemu Windows 8 i nowszych.

 

Aby użyć funkcji Direct2D, aplikacja powinna zawierać plik nagłówka d2d1.h.

Aby skompilować aplikację Direct2D, dodaj bibliotekę d2d1.lib do listy bibliotek. Pliki d2d1.h i d2d1.lib można znaleźć w zestawie Sdk (Software Development Kit) systemu Windows dla systemu Windows 7.

W poniższych sekcjach opisano niektóre typowe interfejsy udostępniane przez interfejs API Direct2D.

Interfejsy Direct2D

U podstaw interfejsu API Direct2D znajdują się interfejsy ID2D1Factory i ID2D1Resource. Obiekt ID2D1Factory tworzy obiekty ID2D1Resource i służy jako punkt wyjścia do używania direct2D. Wszystkie inne obiekty Direct2D dziedziczą z interfejsu ID2D1Resource . Istnieją dwa typy zasobów Direct2D: zasoby niezależne od urządzenia i zasoby zależne od urządzenia.

  • Zasoby niezależne od urządzenia nie są skojarzone z określonym urządzeniem renderowania i mogą być utrwalane przez okres życia aplikacji.
  • Zasoby zależne od urządzenia są skojarzone z konkretnym urządzeniem renderowania i przestaną działać, jeśli to urządzenie zostanie usunięte.

(Aby uzyskać więcej informacji na temat zasobów i udostępniania zasobów, zobacz Omówienie zasobów).

Interfejs ID2D1Factory

Interfejs ID2D1Factory jest punktem wyjścia do korzystania z direct2D. Do tworzenia wystąpień zasobów Direct2D służy ID2D1Factory. Aby utworzyć element ID2D1Factory, należy użyć jednej z metod CreateFactory .

Fabryka definiuje zestaw metod Create* (gdzie * jest symbolem zastępczym nazwy zasobu), który może tworzyć następujące zasoby rysunkowe:

  • Obiekty docelowe renderowania to obiekty renderujące polecenia rysunku.
  • Bloki stanu rysunku to obiekty, które przechowują informacje o stanie rysunku, takie jak bieżąca transformacja i tryb antyaliasingowy.
  • Geometrie to obiekty reprezentujące proste i potencjalnie złożone kształty.

Jednym z najbardziej przydatnych obiektów, które może utworzyć fabryka, jest ID2D1RenderTarget, opisany w poniższej sekcji.

Renderuj obiekty docelowe

Obiekt docelowy renderowania to zasób dziedziczony z interfejsu ID2D1RenderTarget . Obiekt docelowy renderowania tworzy zasoby do rysowania i wykonuje operacje rysowania. 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ść w oknie.
  • Obiekty ID2D1DCRenderTarget renderują do kontekstu urządzenia GDI.
  • Obiekty renderowania na mapę bitową renderują zawartość do mapy bitowej poza ekranem.
  • Obiekty renderujące DXGI są renderowane na powierzchnię DXGI do użycia z 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 powinien używać przyspieszania sprzętowego i czy ekran zdalny powinien być 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ą prymitywów deweloper może również renderować grafikę 2-D w trybie z aliasingiem i używać D3D z wielokrotnym próbkowaniem antyaliasingu w celu uzyskania większej skalowalności.

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ć złożone razem podczas renderowania ramki. 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ć za pomocą GDI na docelowym obiekcie renderującym Direct2D, wywołując interfejs QueryInterface na docelowym obiekcie renderującym ID2D1GdiInteropRenderTarget, który oferuje metody GetDC i ReleaseDC używane do uzyskiwania kontekstu urządzenia GDI. Renderowanie za pośrednictwem interfejsu GDI jest możliwe tylko wtedy, gdy element renderowania został utworzony z ustawioną flagą D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE. Jest to przydatne w przypadku aplikacji renderowanych głównie w trybie 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 współdziałania 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żyć metod rysowania celu 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, aby wyświetlić zasoby graficzne. Większość metod Draw i Fill przyjmuje kształt (zarówno prymitywny, jak i geometrię) oraz pędzel do wypełniania lub obrysowywania kształtu.

Obiekty docelowe renderowania udostępniają również 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ąpiły błędy rysunku, wywołaj docelową metodę Flush renderowania lub metodę EndDraw , aby uzyskać hrESULT.

Zasoby rysunku

W poniższych sekcjach opisano niektóre zasoby, które można utworzyć za pomocą interfejsów docelowych renderowania i fabrycznych.

Pędzle

Interfejs ID2D1Brush reprezentuje szczotkę, która jest zasobem zależnym od urządzenia, utworzonym przez docelowy obszar renderowania, i maluje obszar swoim efektem. Różne szczotki/prędzle mają różne rodzaje wyników. Niektóre pędzle malują obszar o stałym kolorze, a inne z gradientem lub obrazem. Direct2D oferuje cztery typy pędzli:

Aby utworzyć pędzel, należy użyć jednej z metod ID2D1RenderTarget::Create*Brush (gdzie * jest symbolem zastępczym nazwy pędzla), takiego jak CreateRadialGradientBrush. Pędzle mogą być używane z metodami rysowania i wypełniania docelowego obiektu renderowania, aby malować obrys kształtu lub kontur lub jako maskę nieprzezroczystości.

Aby uzyskać więcej informacji na temat pędzli, zobacz Przegląd pędzli.

Geometrii

Oprócz podstawowych prymitywów rysunkowych, takich jak punkty, prostokąty i elipsy, Direct2D udostępnia interfejs ID2D1Geometry do opisywania prostych i złożonych kształtów. Interfejsy dziedziczone z id2D1Geometry definiują różne typy kształtów, takie jak ID2D1RectangleGeometry do reprezentowania prostokątów, ID2D1RoundedRectangleGeometry do reprezentowania zaokrąglonych prostokątów i ID2D1EllipseGeometry do reprezentowania wielokropka.

Bardziej złożone kształty można tworzyć przy użyciu interfejsu ID2D1GeometrySink w celu określenia serii rysunków składających się z linii, krzywych i łuków. ID2D1GeometrySink jest przekazywany do metody Open ID2D1PathGeometry w celu wygenerowania złożonej geometrii. ID2D1SimplifiedGeometrySink może być również używany z interfejsem DirectWrite API do wyodrębniania konturów ścieżki sformatowanego tekstu na potrzeby renderowania artystycznego.

Interfejsy geometryczne zapewniają metody manipulowania kształtami przez rozszerzanie lub upraszczanie istniejących geometrii albo generowanie przecięcia lub unii wielu geometrii. Zapewniają one również metody określania, czy geometrie przecinają się, czy nakładają się, pobierają informacje o granicach, obliczają obszar lub długość geometrii oraz interpolują lokalizacje wzdłuż geometrii. Direct2D zapewnia również możliwość tworzenia siatki trójkątów, które powstały w wyniku tesselacji geometrii.

Aby utworzyć geometrię, należy użyć jednej z metod ID2D1Factory::Create*Geometry (gdzie * jest symbolem zastępczym dla jakiejś nazwy geometrii), takim jak CreatePathGeometry. Geometria to zasób niezależny od urządzenia.

Aby renderować geometrię, należy użyć metod DrawGeometry i FillGeometry obiektu docelowego renderowania.

Aby uzyskać więcej informacji na temat geometrii, zobacz Geometries Overview (Omówienie geometrii).

Mapy bitowe

Funkcja Direct2D nie zapewnia metod ładowania ani przechowywania map bitowych; zamiast tego umożliwia tworzenie map bitowych przy użyciu składnika Windows Imaging (WIC). Zasoby mapy bitowej można załadować przy użyciu usługi WIC, a następnie użyć jej do utworzenia mapy ID2D1Bitmap za pośrednictwem metody ID2D1RenderTarget::CreateBitmapFromWicBitmap .

Mapy bitowe można również tworzyć na podstawie danych w pamięci, które zostały skonfigurowane za pomocą innych środków. Po utworzeniu mapy bitowej można ją narysować za pomocą docelowej metody DrawBitmap renderowania lub pędzla mapy bitowej.

Ponieważ tworzenie zasobów mapy bitowej na obiektach renderowania sprzętowego jest często kosztowną operacją, funkcja Direct2D może zaktualizować zawartość mapy bitowej (lub część mapy bitowej) przy użyciu metod CopyFromBitmap, CopyFromRenderTarget i CopyFromMemory . Użycie tych metod może potencjalnie obniżyć koszty związane z dodatkowymi alokacjami tekstur procesora GPU.

Tekst rysunku

Direct2D został zaprojektowany do pracy z operacjami tekstowymi nowego interfejsu API tekstu DirectWrite. Aby ułatwić korzystanie z interfejsu API DirectWrite, obiekty docelowe renderowania udostępniają trzy metody renderowania zasobów tekstowych DirectWrite: DrawText, DrawTextLayout i DrawGlyphRun. Ponieważ funkcja Direct2D używa procesora GPU w procesie renderowania tekstu ClearType, funkcja Direct2D zapewnia mniejsze użycie procesora CPU niż GDI dla operacji tekstowych i lepszą skalowalność, ponieważ dostępna jest większa moc obliczeniowa procesora GPU.

ID2D1RenderTarget::DrawText jest przeznaczony do najprostszych scenariuszy związanych z renderowaniem ciągu tekstu Unicode z minimalnym formatowaniem. Bardziej złożony układ i elastyczność typograficzna są zapewniane za pośrednictwem metody ID2D1RenderTarget::DrawTextLayout, która używa obiektu IDWriteTextLayout w celu określenia zawartości i formatowania do renderowania. IdWriteTextLayout umożliwia określenie indywidualnego formatowania podciągów tekstu i innych zaawansowanych opcji typografii.

W przypadku scenariuszy, w których wymagana jest dokładna kontrola układu na poziomie glifu, można użyć metody ID2D1RenderTarget::DrawGlyphRun w połączeniu z możliwościami pomiarowymi dostarczonymi przez DirectWrite.

Aby użyć interfejsu API DirectWrite, dołącz nagłówek dwrite.h. Podobnie jak Direct2D, DirectWrite używa fabryki IDWriteFactory do tworzenia obiektów tekstowych. Użyj funkcji DWriteCreateFactory , aby utworzyć fabrykę, a następnie użyj jej metod Create do utworzenia zasobów DirectWrite (takich jak IDWriteTextFormat).

Aby uzyskać więcej informacji na temat funkcji DirectWrite, zobacz temat Wprowadzenie do funkcji DirectWrite .

Elementy pierwotne Direct2D

Direct2D definiuje zestaw elementów pierwotnych, które są podobne do tych udostępnianych przez inne interfejsy API rysunku. Zapewnia strukturę kolorów, strukturę macierzy do wykonywania przekształceń oraz zmiennoprzecinkowe i całkowite wersje punktów, prostokątów, wielokropków i struktur rozmiarów. Zazwyczaj używa się wersji zmiennoprzecinkowych tych struktur.

Nie używasz fabryki ani obiektu docelowego renderowania do instancjonowania prymitywów Direct2D. Można je utworzyć bezpośrednio lub użyć metod pomocnika zdefiniowanych w pliku d2d1helper.h, aby je utworzyć.

Dokumentacja Direct2D

DirectWrite HelloWorld

Wprowadzenie do funkcji DirectWrite

Omówienie zasobów

Składnik Windows Imaging (WIC)