Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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ý |
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í.
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.
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