Sdílet prostřednictvím


Použití barvy v Direct2D

Direct2D používá barevný model RGB, ve kterém se barvy vytvářejí kombinací různých hodnot červené, zelené a modré. Čtvrtá komponenta alfa měří průhlednost pixelu. V Direct2D je každá z těchto součástí hodnota s plovoucí desetinnou čárkou s rozsahem [0.0 1.0]. U tří barevných složek hodnota měří intenzitu barvy. Pro alfa komponentu znamená 0,0 zcela průhledné a 1,0 znamená zcela neprůhledné. Následující tabulka ukazuje barvy, které jsou výsledkem různých kombinací 100% intenzity.

Červený Zelený Modrý Barva
0 0 0 Černý
1 0 0 Červený
0 1 0 Zelený
0 0 1 Modrý
0 1 1 Azurová
1 0 1 Fialový
1 1 0 Žlutý
1 1 1 Bílý

obrázek, který zobrazuje barvy RGB.

Hodnoty barev mezi 0 a 1 mají za následek různé odstíny těchto čistých barev. Direct2D používá D2D1_COLOR_F strukturu k reprezentaci barev. Například následující kód určuje purpurové.

    // Initialize a magenta color.

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

Barvu můžete také zadat pomocí třídy D2D1::ColorF, která je odvozena ze struktury D2D1_COLOR_F.

    // Equivalent to the previous example.

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

Alfa Blending

Alfa prolnutí vytváří průsvitné oblasti prolnutím barvy popředí s barvou pozadí pomocí následujícího vzorce.

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

kde Cb je barva pozadí, Cf je barva popředí a af je alfa hodnota barvy popředí. Tento vzorec se použije ve dvojici pro každou barevnou komponentu. Předpokládejme například, že barva popředí je (R = 1,0, G = 0,4, B = 0,0), s alfa = 0,6a barva pozadí je (R = 0,0, G = 0,5, B = 1,0). Výsledná alfa-mixovaná barva je:

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

Následující obrázek ukazuje výsledek této operace kombinování.

obraz, který zobrazuje prolnutí alfa.

Formáty pixelů

Struktura D2D1_COLOR_F nepopisuje, jak je pixel reprezentován v paměti. Ve většině případů to nezáleží. Direct2D zpracovává všechny interní podrobnosti o převodu barevných informací na pixely. Pokud ale pracujete přímo s rastrovým obrázkem v paměti, nebo pokud zkombinujete Direct2D s Direct3D nebo GDI, možná budete potřebovat znát formát pixelů.

Výčet DXGI_FORMAT definuje seznam formátů pixelů. Seznam je poměrně dlouhý, ale jen několik z nich je relevantní pro Direct2D. (Ostatní používají Direct3D).

Formát pixelu Popis
DXGI_FORMAT_B8G8R8A8_UNORM
Toto je nejběžnější formát pixelů. Všechny součásti pixelů (červené, zelené, modré a alfa) jsou 8bitové celé číslo bez znaménka. Komponenty jsou uspořádány v BGRA pořadí v paměti. (Viz obrázek, který následuje.)
DXGI_FORMAT_R8G8B8A8_UNORM
Pixelové komponenty jsou 8bitové celé číslo bez znaménka v RGBA pořadí. Jinými slovy, červené a modré komponenty jsou prohozeny ve srovnání s DXGI_FORMAT_B8G8R8A8_UNORM. Tento formát je podporován pouze pro hardwarová zařízení.
DXGI_FORMAT_A8_UNORM
Tento formát obsahuje 8bitovou alfa komponentu bez komponent RGB. Je užitečné vytvářet neprůhledné masky. Další informace o použití neprůhledných masek v Direct2D najdete v tématu Přehled kompatibilních cílů vykreslování A8.

Následující obrázek znázorňuje rozložení pixelů BGRA.

diagram, který zobrazuje rozložení bgra pixelů.

Pokud chcete získat formát pixelů cíle vykreslení, zavolejte ID2D1RenderTarget::GetPixelFormat. Formát pixelů nemusí odpovídat rozlišení zobrazení. Zobrazení může být například nastaveno na 16bitovou barvu, i když cíl vykreslení používá 32bitovou barvu.

Alfa režim

Cíl vykreslení má také alfa režim, který definuje způsob zacházení s alfa hodnotami.

Alfa režim Popis
D2D1_ALPHA_MODE_IGNORE Neprovádí se žádné alfa prolnutí. Alfa hodnoty jsou ignorovány.
D2D1_ALPHA_MODE_STRAIGHT Rovnou alfa. Barevné součásti pixelu představují intenzitu barev před alfa prolnutím.
D2D1_ALPHA_MODE_PREMULTIPLIED Premultiplied alfa. Barevné komponenty pixelu představují intenzitu barev vynásobenou hodnotou alfa. Tento formát je efektivnější pro zobrazení než přímá alfa, protože výraz (af Cf) ze vzorce alfa-míchání je předem vypočítán. Tento formát ale není vhodný pro ukládání do souboru obrázku.

Tady je příklad rozdílu mezi rovným alfa a předmnoženým alfa. Předpokládejme, že požadovaná barva je čistě červená (100% intenzita) s 50% alfa. Jako typ Direct2D by byla tato barva reprezentována jako (1, 0, 0, 0,5). Při použití přímé alfa a předpokládáme-li 8bitové barevné komponenty, je červená komponenta pixelu 0xFF. Pomocí premultiplied alfa se červená komponenta škáluje o 50%, aby se rovnala 0x80.

Datový typ D2D1_COLOR_F vždy představuje barvy pomocí rovné alfa. Direct2D v případě potřeby převede pixely na přednásobený alfa formát.

Pokud víte, že váš program nebude provádět žádné alfa míchání, vytvořte cílový bod vykreslení s použitím alfa režimu D2D1_ALPHA_MODE_IGNORE. Tento režim může zvýšit výkon, protože Direct2D může přeskočit výpočty alfa. Další informace naleznete v tématu Zlepšení výkonu aplikací Direct2D.

Další

Použití transformací v Direct2D