TakéColour space, Barevný model, Color gamutPokročilý
Definice
Barevný prostor je definice toho, jakou skutečnou barvu představují číselné hodnoty v obrázku nebo na displeji. Určuje tři věci: primární barvy (rozsah zobrazitelných odstínů), bílý bod a přenosovou funkci mezi uloženým číslem a jasem. Bez této definice je trojice čísel jako 255,128,0 jen bezvýznamný údaj.
Než se na to spolehnete: Údaj o tom, že Display P3 má zhruba o čtvrtinu větší gamut než sRGB, je běžně uváděná přibližná hodnota (cca 25 % objemu); přesné číslo závisí na metodice měření. Wikidata QID pro „color space“ jsem uvedl podle paměti, doporučuji ověřit.
Proč tři čísla samy o sobě nic neznamenají
Hodnota pixelu rgb(255, 0, 0) neříká, jaká červená to je. Teprve barevný prostor přiřadí číslům konkrétní místo v lidsky vnímatelném spektru. Stejná trojice vykreslená v sRGB a v Display P3 vypadá jinak: v P3 je červená výrazně sytější, protože jeho primární barvy leží dál od bílého bodu. Proto se soubory doplňují o ICC profil nebo o metadata, která prostor pojmenují.
Ze čeho se barevný prostor skládá
Primární barvy a gamut
Primární barvy jsou tři body v diagramu chromatičnosti CIE 1931. Trojúhelník, který mezi sebou vytvoří, je gamut, tedy množina barev, kterou lze v daném prostoru vyjádřit. sRGB má gamut poměrně malý, Display P3 zhruba o čtvrtinu větší a Rec. 2020 pokrývá podstatnou část viditelného spektra.
Bílý bod
Bílý bod říká, jaká chromatičnost se považuje za neutrální bílou. Většina počítačových prostorů používá D65, tiskové workflow často D50. Rozdílný bílý bod je důvod, proč se stejná fotografie na dvou kalibrovaných zařízeních liší v tónu.
Přenosová funkce
Přenosová funkce (často zjednodušeně gama) mapuje uloženou hodnotu na světelný výkon. Není lineární, protože lidské oko je citlivější na rozdíly v tmavých tónech, a nelineární kódování tak lépe využívá dostupné bity. Pro HDR se používají křivky PQ nebo HLG s mnohem větším rozsahem jasů.
Kde vzniká problém v praxi
Nejčastější chybou je míchání barev přímo v sRGB hodnotách. Průměr rgb(255,0,0) a rgb(0,0,255) vypadá tmavší, než by měl, protože se sčítají čísla po gama křivce, nikoli fyzikální světlo. Renderery a shadery proto pracují v lineárním prostoru a do sRGB převádějí až na výstupu. Podobný důvod má mip-mapping textur: filtrování nelineárních hodnot dává příliš tmavý výsledek.
Druhý typický problém je chybějící deklarace. Fotka z telefonu ve wide gamut zobrazená bez profilu se prohlížeč pokusí interpretovat jako sRGB a barvy se přesytí. CSS proto od Color Level 4 umožňuje zapsat barvu s explicitním prostorem přes funkci color() a doptat se na možnosti displeje mediálním dotazem.
Jak se prostory převádějí
Převod probíhá přes zařízením nezávislý referenční prostor, typicky CIE XYZ. Postup má tři kroky: zrušit přenosovou funkci (linearizace), aplikovat maticovou transformaci mezi primárními barvami, znovu zakódovat cílovou křivkou. Pokud zdrojová barva leží mimo gamut cíle, musí se ořezat nebo namapovat podle zvoleného renderovacího záměru. Perceptuální záměr komprimuje celý rozsah a zachová vztahy mezi odstíny, relativní kolorimetrický ponechá barvy uvnitř gamutu beze změny a jen ořízne ty vně.
Pro úpravy jasu a míchání se dnes doporučují percepčně uniformní prostory jako CIELAB nebo novější Oklab, kde stejná číselná změna odpovídá zhruba stejně velké vnímané změně. To je také důvod, proč gradienty v Oklab nevykazují šedé „mrtvé místo“ uprostřed. Souvislost s UV mapováním je nepřímá, ale u textur se oba pojmy potkávají: barevná mapa musí být v sRGB, normálová mapa naopak vždy lineární.
Příklady z praxe
Web s wide gamut fotografiemi
E-shop s produktovými fotkami chce na moderních displejích ukázat sytější barvy, ale zachovat správný vzhled na starších monitorech. V CSS se hodí zápis přes funkci color() v Display P3 s fallbackem v sRGB. Prohlížeče, které P3 neznají, použijí první deklaraci, ostatní přepíší druhou.
.badge { background: rgb(230 40 20); /* fallback sRGB */ background: color(display-p3 0.92 0.16 0.08); } @media (color-gamut: p3) { .hero { --accent: color(display-p3 0 0.6 0.4); } }Tmavé okraje textur ve hře
Textura načtená jako lineární data, přestože byla uložena v sRGB, vypadá po vykreslení vybledle a osvětlení sedí špatně. Řešení je označit sampler formátem se sRGB, aby grafická karta provedla dekódování při čtení a míchání probíhalo ve fyzikálně lineárním prostoru. Normálové a roughness mapy se naopak nahrávají bez sRGB, protože nenesou barvu.
// barevná (albedo) mapa: sRGB -> GPU dekóduje při čtení glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB8_ALPHA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, albedo); // normálová mapa: čistě lineární data glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, normals);
Časté omyly
- MýtusRGB je barevný prostor.
- Ve skutečnostiRGB je barevný model, tedy způsob zápisu barvy třemi složkami. Barevným prostorem se stane teprve tehdy, když se doplní primární barvy, bílý bod a přenosová funkce: sRGB, Adobe RGB a Display P3 jsou různé prostory nad stejným modelem.
- MýtusVětší gamut je vždy lepší, takže je nejlepší pracovat rovnou v Rec. 2020.
- Ve skutečnostiVětší gamut při stejné bitové hloubce znamená hrubší kvantizaci, takže v 8 bitech vznikne pásování v přechodech. Široké prostory dávají smysl až od 10 bitů na kanál a při správně deklarovaných metadatech.
- MýtusGama korekce je jen zesvětlení obrazu.
- Ve skutečnostiPřenosová funkce je kódovací mechanismus, který nelineárně rozděluje dostupné bity ve prospěch tmavých tónů. Displej ji na výstupu ruší, takže výsledný jas odpovídá záměru; nejde o kosmetickou úpravu jasu.
Časté dotazy
- Jaký barevný prostor zvolit pro obrázky na web?
- Pro běžnou webovou grafiku zůstává sRGB bezpečnou volbou, protože prohlížeče i starší displeje ho předpokládají jako výchozí. Fotografie s výraznými sytými odstíny má smysl exportovat v Display P3 s vloženým ICC profilem a nechat prohlížeč provést převod. Klíčové je profil skutečně vložit nebo alespoň nastavit metadata v PNG či AVIF: nedeklarovaný wide gamut obrázek se zobrazí přesycený. U ikon a UI prvků naopak profily jen zvětšují soubor a nic nepřinášejí.
- Proč gradient mezi modrou a žlutou obsahuje šedý pás?
- Šedé místo uprostřed gradientu vzniká interpolací v sRGB, kde se míchají nelineární kódované hodnoty. Cesta mezi dvěma komplementárními odstíny prochází blízko neutrální osy a výsledek působí vybledle. Interpolace v percepčně uniformním prostoru, například Oklab nebo LCH, vede přechod po hraně barevného kruhu a šedé místo zmizí. Moderní CSS to umožňuje zápisem interpolačního prostoru přímo v deklaraci gradientu, takže není potřeba generovat mezikroky ručně.
- Co dělá ICC profil a kdy ho potřebuji?
- ICC profil je soubor s popisem barevného chování konkrétního zařízení nebo prostoru: obsahuje primární barvy, bílý bod a tónovou křivku, případně převodní tabulky. Systém správy barev podle něj počítá převod mezi vstupem a výstupem. Profil je potřeba všude, kde obrázek putuje mezi zařízeními s odlišnými vlastnostmi, tedy při tisku, fotografické retuši nebo publikaci wide gamut materiálu. U interní grafiky, která nikdy neopustí sRGB workflow, přidaná hodnota profilu klesá.
- Jak souvisí HDR s barevným prostorem?
- HDR rozšiřuje barevný prostor o rozsah jasu. Vedle širších primárních barev, obvykle Rec. 2020, mění hlavně přenosovou funkci: místo klasické gama křivky se používá PQ (SMPTE ST 2084) nebo HLG, které kódují jas v absolutních nitech až do řádu tisíců. Proto nelze HDR obraz jen tak zobrazit na SDR displeji; potřebuje tone mapping, který vysoké jasy stlačí do dostupného rozsahu, a zároveň mapování gamutu.
Zdroje
- CSS Color Module Level 4(otevře se v novém okně)
- Applying color: HTML, CSS and SVG(otevře se v novém okně)
- Color space(otevře se v novém okně)
- OpenGL Registry(otevře se v novém okně)