Udostępnij przez


Używanie koloru w trybie Direct2D

Funkcja Direct2D używa modelu kolorów RGB, w którym kolory są tworzone przez połączenie różnych wartości czerwonego, zielonego i niebieskiego. Czwarty składnik alfa mierzy przezroczystość piksela. W trybie Direct2D każdy z tych składników jest wartością zmiennoprzecinkową z zakresem [0.0 1.0]. W przypadku trzech składników kolorów wartość mierzy intensywność koloru. W przypadku składnika alfa wartość 0.0 oznacza całkowicie przezroczyste, a wartość 1.0 oznacza całkowicie nieprzezroczyste. W poniższej tabeli przedstawiono kolory uzyskane z różnych kombinacji intensywności 100%.

Czerwony Zielony Niebieski Kolor
0 0 0 Czarny
1 0 0 Czerwony
0 1 0 Zielony
0 0 1 Niebieski
0 1 1 Błękitny
1 0 1 Purpurowy
1 1 0 Żółty
1 1 1 Biały

obraz przedstawiający kolory rgb.

Wartości kolorów z zakresu od 0 do 1 powodują różne odcienie tych czystych kolorów. Funkcja Direct2D używa struktury D2D1_COLOR_F do reprezentowania kolorów. Na przykład poniższy kod określa magenta.

    // Initialize a magenta color.

    D2D1_COLOR_F clr;
    clr.r = 1;
    clr.g = 0;
    clr.b = 1;
    clr.a = 1;  // Opaque.

Można również określić kolor przy użyciu klasy D2D1::ColorF, która pochodzi ze struktury D2D1_COLOR_F.

    // Equivalent to the previous example.

    D2D1::ColorF clr(1, 0, 1, 1);

Mieszanie alfa

Mieszanie alfa tworzy przezroczyste obszary przez połączenie koloru pierwszego planu z kolorem tła przy użyciu poniższej formuły.

kolor = af * Cf + (1 - af) * Cb

gdzie Cb jest kolorem tła, Cf jest kolorem pierwszego planu, a af jest wartością alfa koloru pierwszego planu. Ta formuła jest stosowana parowo do każdego składnika koloru. Załóżmy na przykład, że kolor pierwszego planu to (R = 1,0, G = 0,4, B = 0,0), z alfa = 0,6, a kolor tła jest (R = 0,0, G = 0,5, B = 1,0). Kolor wynikowy po mieszaniu alfa to:

R = (1,0 * 0,6 + 0 * 0,4) = .6
G = (0,4 * 0,6 + 0,5 * 0,4) = .44
B = (0 * 0,6 + 1,0 * 0,4) = .40

Na poniższej ilustracji przedstawiono wynik tej operacji łączenia.

obraz przedstawiający mieszanie alfa.

Formaty pikseli

Struktura D2D1_COLOR_F nie opisuje sposobu, w jaki piksel jest reprezentowany w pamięci. W większości przypadków nie ma to znaczenia. Funkcja Direct2D obsługuje wszystkie wewnętrzne szczegóły tłumaczenia informacji o kolorze na piksele. Może jednak być konieczne zapoznanie się z formatem pikseli, jeśli pracujesz bezpośrednio z mapą bitową w pamięci lub w przypadku łączenia funkcji Direct2D z funkcją Direct3D lub GDI.

Wyliczenie DXGI_FORMAT definiuje listę formatów pikseli. Lista jest dość długa, ale tylko kilka z nich ma zastosowanie do Direct2D. (Pozostałe są używane przez direct3D).

Format pikseli Opis
DXGI_FORMAT_B8G8R8A8_UNORM
Jest to najbardziej typowy format pikseli. Wszystkie składniki pikseli (czerwony, zielony, niebieski i alfa) to 8-bitowe liczby całkowite bez znaku. Składniki są rozmieszczone w kolejności BGRA w pamięci. (Zobacz ilustrację poniżej).
DXGI_FORMAT_R8G8B8A8_UNORM
Składniki pikseli to 8-bitowe liczby całkowite bez znaku w kolejności RGBA. Innymi słowy, czerwone i niebieskie składniki są zamieniane względem DXGI_FORMAT_B8G8R8A8_UNORM. Ten format jest obsługiwany tylko w przypadku urządzeń sprzętowych.
DXGI_FORMAT_A8_UNORM
Ten format zawiera 8-bitowy składnik alfa bez składników RGB. Jest to przydatne w przypadku tworzenia masek nieprzezroczystości. Aby dowiedzieć się więcej na temat używania masek przezroczystości w trybie Direct2D, zobacz Omówienie zgodnych z A8 celów renderowania.

Na poniższej ilustracji przedstawiono układ pikseli BGRA.

diagram przedstawiający układ pikseli bgra.

Aby uzyskać format pikseli obiektu docelowego renderowania, wywołaj ID2D1RenderTarget::GetPixelFormat. Format pikseli może nie być zgodny z rozdzielczością ekranu. Na przykład ekran może być ustawiony na 16-bitowy kolor, mimo że obiekt docelowy renderowania używa koloru 32-bitowego.

Tryb alfa

Element docelowy renderowania ma również tryb alfa, który definiuje sposób traktowania wartości alfa.

Tryb alfa Opis
D2D1_ALPHA_MODE_IGNORE Nie jest wykonywane łączenie alfa. Wartości alfa są ignorowane.
D2D1_ALPHA_MODE_STRAIGHT Prosta alfa. Składniki kolorów piksela reprezentują intensywność koloru przed mieszaniem alfa.
D2D1_ALPHA_MODE_PREMULTIPLIED Przemnożona alfa. Składniki koloru piksela reprezentują intensywność koloru pomnożona przez wartość alfa. Ten format jest bardziej wydajny do renderowania niż prosty alfa, ponieważ termin (af Cf) z formuły łączenia alfa jest wstępnie obliczany. Jednak ten format nie jest odpowiedni do przechowywania w pliku obrazu.

Oto przykład różnicy między prostym alfa a przedmnożonym alfa. Załóżmy, że żądany kolor jest czysty czerwony (100% intensywności) z 50% alfa. Jako typ Direct2D ten kolor będzie reprezentowany jako (1, 0, 0, 0,0,5). Przy użyciu prostych alfa i przy założeniu 8-bitowych składników kolorów czerwony składnik piksela jest 0xFF. Przy użyciu premnożonej alfy, czerwony składnik jest skalowany tak, aby 50% z% równało się 0x80.

Typ danych D2D1_COLOR_F zawsze reprezentuje kolory przy użyciu prostej alfa. Direct2D konwertuje piksele na wstępnie sformatowany format alfa w razie potrzeby.

Jeśli wiesz, że program nie będzie obsługiwał mieszania alfa, utwórz docelowy obiekt renderowania przy użyciu trybu D2D1_ALPHA_MODE_IGNORE alfa. Ten tryb może zwiększyć wydajność, ponieważ funkcja Direct2D może pominąć obliczenia alfa. Aby uzyskać więcej informacji, zobacz Poprawianie wydajności aplikacji Direct2D.

Następny

Stosowanie przekształceń w Direct2D