Sdílet prostřednictvím


Použití rozhraní DirectX s rozšířenou barvou na displejích s vysokým nebo standardním dynamickým rozsahem

V tomto tématu se dozvíte, jak používat DirectX ve scénářích s pokročilými barvami, včetně vysokého dynamického rozsahu (HDR), širokého barevného gamutu (WCG), automatické správy barev systému a vysoké bitové hloubky. Displeje osobního počítače (PC) úrovně Premium s alespoň jedním z výše uvedených vylepšení se rozšiřují a poskytují výrazně vyšší přesnost barev než tradiční standardní dynamické zobrazení (SDR).

V tomto tématu získáte přehled klíčových technických konceptů podpory rozšířené barvy Windows. Naučíte se požadavky a pokyny pro vykreslování obsahu HDR, WCG a DirectX s vysokou bitovou hloubkou na některém z těchto displejů. Pokud máte aplikaci spravovanou barvou (například pomocí profilů ICC), dozvíte se, jak automatická správa barev umožňuje lepší přesnost barev pro vaše scénáře.

Úvod do rozšířené barvy ve Windows

advanced color je zastřešující termín technologií operačního systému (OS) pro displeje s výrazně vyšší přesností barev než standardní displeje. Převládající rozšířené schopnosti jsou popsány v následujících částech. Rozšířené možnosti barev byly poprvé zavedeny pro displeje HDR s Windows 10, verze 1709 (Fall Creators Update) a speciálně zřízených displejů SDR s Windows 11 verze 22H2 (10.0; Verze buildu 22621)

Vysoký dynamický rozsah

Dynamický rozsah odkazuje na rozdíl mezi maximálním a minimálním světelností ve scéně; to se často měří v nitech (candelas na čtvereční centimetr). Skutečné scény, jako je například západ slunce, často mají dynamické rozsahy 10 řádů světelnosti; lidské oko dokáže rozpoznat ještě větší rozsah po adaptaci.

obrázek západu slunce s jasem a nejtmavšími body ve scéně označené

Od technologie Direct3D 9 byly grafické moduly schopny interně vykreslit své scény s touto úrovní fyzicky přesné přesnosti. Displej s typickým standardním dynamickým rozsahem však může reprodukovat pouze o něco více než 3 řády jasnosti, a proto musel být veškerý obsah vykreslený v HDR tonemappován do omezeného rozsahu displeje. Nové displeje HDR, včetně těch, které splňují standard HDR10 (BT.2100), prolomí toto omezení; například vysoce kvalitní samostatně vyzařující displeje mohou dosáhnout více než 6 řádů magnitudy.

Široký barevný gamut

Barevný gamut odkazuje na rozsah a sytost odstínů, které může zobrazení reprodukovat. Nejsycenější přírodní barvy, které lidské oko může vnímat z čistého monochromaticního světla, jako je například to, které vyrábí lasery. Standardní spotřebitelé však mohou často reprodukovat barvy pouze v gamutu sRGB, který představuje pouze asi 35% všech lidských barev. Následující diagram je znázornění lidského "spektrálního diagramu" nebo všech perceivovatelných barev (na dané úrovni světelnosti), kde menší trojúhelník je gamut sRGB.

diagramu loci lidského spektra a gamutu sRGB

High-end, profesionální pc displeje mají dlouho podporované barevné gamuty, které jsou výrazně širší než sRGB, jako je Adobe RGB a DCI-P3, které pokrývají přibližně polovinu lidských barev. A tyto široké gamut displeje jsou stále častější.

Automatická správa barev systému

Správa barev je technologie a postup, jak zajistit přesnou a konzistentní reprodukci barev na různých zařízeních. Pokud jste tvůrcem digitálního obsahu, má zásadní význam pro barvy vašeho vizuálního obsahu, jako je fotka, obrázek produktu nebo logo, aby se na displeji zobrazoval stejně jako na široké škále digitálních zařízení vaší cílové skupiny.

Systém Windows poskytuje rozhraní API pro správu barev už od verze Windows 2000, které zahrnují Image Color Management (ICM) a později rozhraní API systému Windows Color System (WCS). Tato rozhraní API však byla pouze pomocníky pro aplikace, které si přály nebo vyžadovaly správu barev; zatímco většina aplikací a digitálního obsahu jednoduše předpokládala standardní barevný prostor sRGB a operační systém nikdy nespravoval barvy. To byl rozumný předpoklad v minulosti, ale vysoce kvalitní širokoúhlé displeje jsou mnohem častější.

Nové verze Windows podporují automatickou správu barev systému; to zajišťuje, že všechny barvy ve všech aplikacích pro Windows, bez ohledu na to, zda si barvy uvědomují nebo ne, se zobrazují přesně a konzistentně na každém podporovaném displeji.

Poznámka

Automatická správa barev není vlastností hardwaru zobrazení; je to funkce Systému Windows, která správně podporuje displeje s větší barevnou gamuty než sRGB.

Hloubka bitové přesnosti

Číselná přesnost nebo hloubka bitu odkazuje na množství informací použitých k jedinečné identifikaci barev. Větší bitová hloubka znamená, že můžete rozlišovat mezi velmi podobnými barvami bez artefaktů, jako je pruhování. Běžné počítačové monitory podporují 8 bitů na barevný kanál, zatímco lidské oko vyžaduje alespoň 10-12 bitů přesností, aby se zabránilo viditelnému zkreslení.

obrázek větrných mlýnů se simulovanými 2 bity na barevný kanál vs. 8 bitů na barevný kanál

Před rozšířenou barvou omezil Správce oken plochy (DWM) aplikace s okny na výstup obsahu pouze 8 bitů na barevný kanál, a to i v případě, že zobrazení podporovalo větší bitovou hloubku. Pokud je povolena pokročilá barva, DWM provádí své složení pomocí plovoucí desetinné čárky IEEE s poloviční přesností (FP16), čímž eliminuje jakákoli úzká místa a umožňuje použití plné přesnosti displeje.

Architektura systému Windows Advanced Color

Informace v této části jsou volitelné pro vytváření aplikací Advanced Color; je ale užitečné pochopit, jak technologie funguje, aby se optimalizovalo vykreslování a chování vaší aplikace.

V této části použijeme zjednodušený diagram k popisu relevantních součástí grafického zásobníku Windows:

diagram bloku grafického zásobníku Windows: aplikace přes DWM k jádru displeje

Existující Windows: 8bitová / sRGB displeje

Po celá desetiletí byly uživatelské displeje a grafický zásobník Windows založeny na přibližně 8 bitech na kanál (24 bitů na pixel) sRGB obsahu. Aplikace využívající grafická rozhraní API, jako je DirectX, můžou provádět interní vykreslování s použitím velkých bitových hloubk a rozšířených barevných prostorů; Operační systém však podporuje pouze 8bitové celé číslo s implicitní sRGB a bez správy barev systému:

blokový diagram zásobníku zobrazení SDR: omezený na sRGB, 8bitovou, bez správy barev

To znamená, že jakákoli další barevná data vykreslená aplikací by se při zobrazení ztratila; a že aplikace musela provádět správu barev, aby zajistila přesnou reprodukci na displeji.

Windows 10 verze 1703: HDR displeje s rozšířenou barvou

Windows 10 verze 1703 představila první verzi funkcí Advanced Color pro displeje HDR. To vyžadovalo několik významných pokroků v grafickém zásobníku operačního systému:

  • Podpora signalizace pro HDR displeje
  • Složení systému s použitím vysokého bitového a kanonického barevného prostoru
  • Automatická správa barev systému

blokový diagram HDR zobrazovacího zásobníku: FP16, scRGB, s automatickou správou barev

Každý postup je popsaný v následujících dílčích částech. Čistým výsledkem je, že rozšířená data barev aplikace jsou nyní správně zachována operačním systémem a přesně reprodukována na displejích HDR.

Podpora signalizace displeje HDR

HDR signál přes displejové konektory, jako jsou DisplayPort a HDMI, primárně používá 10 bitů na kanál (nebo vyšší) a barevný prostor BT.2100 ST.2084. Jádro zobrazení, ovladač displeje a základní hardware GPU musí podporovat detekci, výběr a řízení tohoto signalizačního režimu.

Složení systému s použitím vysokého bitového a kanonického barevného prostoru

Barevný prostor BT.2100 ST.2084 je efektivní standard pro kódování barev HDR, ale není vhodný pro mnoho operací vykreslování a složení (mixování). Chceme také zajistit, aby operační systém podporoval technologie a barevné prostory nad rámec BT.2100, který pokrývá méně než 2/3 barev, které lidské oko vnímá. Nakonec, pokud je to možné, chceme minimalizovat spotřebu prostředků GPU, aby se zlepšil výkon a výkon.

V režimu HDR používá Správce oken plochy (DWM) kanonický barevný prostor složení (CCCS) definovaný takto:

  • barevný prostor scRGB (primární barvy BT.709/sRGB s lineární gama)
  • Poloviční přesnost IEEE (16bitová hloubka FP)

To poskytuje dobrou rovnováhu mezi všemi výše uvedenými cíli. CCCS umožňuje hodnoty barev mimo číselný rozsah [0, 1]. vzhledem k rozsahu platných hodnot FP16 může představovat řádově více barev, než je rozsah přirozeného lidského vizuálu, včetně hodnot světelnosti nad 5 milionů nitů. FP16 má vynikající přesnost pro operace s lineárním gama mísením, ale spotřebuje poloviční paměť GPU a šířku pásma oproti tradiční jednoduché přesnosti (FP32) bez znatelné ztráty kvality.

Automatická správa barev systému

Windows je prostředí pro multitasking, ve kterém uživatel může současně spouštět libovolný počet aplikací SDR a HDR s překrývajícími se okny. Proto je důležité, aby všechny typy obsahu při zobrazení na displeji vypadaly správně a při maximální kvalitě: například aplikace pro produktivitu sRGB (SDR) s přehrávaným oknem videa BT.2100 ST.2084 (HDR).

V režimu HDR systém Windows provádí operace správy barev ve dvou fázích:

  1. DWM převede každou aplikaci z nativního barevného prostoru na CCCS před prolnutím.
  2. Jádro zobrazení převede framebuffer operačního systému z CCCS do barevného prostoru přenosového formátu (BT.2100 ST.2084).
    • Volitelně zobrazovací jádro spolupracuje s ovladačem zobrazení k provedení dodatečné kalibrace barev displeje. Další informace naleznete v sekci o hardwarovém kalibračním procesu barev zobrazení Windows.

blokový diagram automatické správy barev v DWM a jádře zobrazení blokový diagram automatické správy barev vyskytující se v DWM a jádře zobrazení, část 2

Poznámka

V obou fázích se operace správy barev skládá z konverze barevného prostoru (matice a 1DLUT). Barvy, které překračují cílovou barevnou gamutu zobrazení, jsou číselně oříznuté.

Windows 11 verze 22H2: Zobrazení SDR s rozšířenou barvou

Zatímco rozšíření HDR displejů rychle roste, displeje SDR zůstanou důležité i v následujících letech. Podpora HDR ve Windows 10 verze 1703 položila většinu základů potřebných k vylepšení zobrazení SDR. Windows 11 verze 22H2 rozšiřuje rozšířené možnosti barev a automatickou správu barev na určitá displeje SDR. Diagram grafického bloku pro zobrazení SDR s pokročilou barvou vypadá velmi podobně jako HDR:

diagram bloku zásobníku zobrazení SDR AC: FP16, scRGB, s automatickou správou barev

Podpora signalizace zobrazení SDR s vysokou bitovou hloubkou

Základní signál pro zobrazení SDR se nemění, i když verze Windows 11 verze 22H2 podporuje 10 bitů na kanál a vyšší v závislosti na možnostech zobrazení.

Kompozice systému s použitím vysoké bitové hloubky a standardního barevného prostoru

Funkce rozšířené barvy DWM, včetně prolnutí v CCCS, se téměř úplně nezměnila od displejů HDR. Hlavní rozdíl spočívá v tom, že DWM používá světelnost vztaženou k zobrazení s displeji SDR a světelnost vztaženou k scéně s HDR displeji. Tím se změní způsob, jakým je obsah vykreslený rozšířenými barvami interpretován operačním systémem:

Druh zobrazení Chování světelnosti Jak se interpretuje verze 1.0f
SDR Vztaženo k zobrazení Jako referenční bílá úroveň displeje
HDR Odkazovaná scéna Jako 80 nitů (nominální referenční bílá)

Automatická správa barev systému

Možnosti správy barev systému operačního systému jsou také většinou beze změny oproti displejům HDR. Hlavní rozdíl spočívá v tom, že jádro zobrazení převádí do barevného prostoru odvozeného od zobrazení, jak je definováno kolorimetrickými a kalibračními daty displeje, namísto standardního barevného prostoru BT.2100 ST.2084 pro displeje HDR.

Je vyžadováno zřizování zobrazení

K definování operace správy výstupních barev jádra zobrazení je potřeba přesná data z profilu MHC ICC. Proto jsou pro automatickou správu barev způsobilé pouze zobrazení SDR, která byla výslovně zřízena výrobcem nebo poskytovatelem kalibrace displeje s platným profilem. Chování profilu ICC s Pokročilou barvou, podrobnosti naleznete zde.

Požadavky na systém a podpora operačního systému

Windows 10 verze 1709 byla poprvé dodána podpora rozšířených barev pro displeje HDR. Windows 11, verze 22H2 přidává podporu pokročilých barev pro SDR displeje s přesnými daty pro zajišťování.

V tomto tématu se předpokládá, že vaše aplikace cílí na windows 10 verze 2004 (nebo novější) pro displeje HDR a pro displeje SDR ve Windows 11 verze 22H2 (nebo novější).

Ukázat

Displej s vysokým dynamickým rozsahem musí implementovat standard HDR10 nebo BT.2100 ST.2084. Kvalita hdr displeje se může výrazně lišit a důrazně doporučujeme, aby byly certifikované, například VESA DisplayHDR. Od verze Windows 11 verze 22H2 zobrazí Windows stav certifikace známých displejů v aplikaci Settings.

Standardní zobrazení dynamického rozsahu musí mít přesná data nastavení barev pro podporu pro pokročilé barvy. Ve verzi 22H2 systému Windows 11 je jedinou podporovanou metodou přepsání těchto dat prostřednictvím profilu MHC ICC, kromě toho musí mít uživatel nebo výrobce displeje povolenu automatickou správu barev. Další informace najdete v části Chování profilu ICC s pokročilými barvami.

Grafický procesor (GPU)

Pro plnou rozšířenou funkci barev na displejích SDR i HDR se vyžaduje nedávný GPU:

  • AMD Radeon RX 400 série (Polaris) nebo novější
  • ŘADA NVIDIA GeForce 10 (Pascal) nebo novější
  • Výběr Intel Core 10. generace (Ice Lake) nebo novější*

Poznámka

Čipové sady s názvem kódu Intel Comet Lake (5místný kód modelu) neposkytují plnou funkčnost.

V závislosti na scénářích, včetně akcelerace hardwarového kodeku (10 bitů HEVC, 10bitové VP9 atd.) a podpory PlayReady (SL3000), můžou platit další požadavky na hardware. Pokud potřebujete podrobnější informace, obraťte se na dodavatele GPU.

Grafický ovladač (WDDM)

Nejnovější dostupný grafický ovladač se důrazně doporučuje, ať už ze služby Windows Update, nebo od dodavatele GPU nebo z webu výrobce počítače. Toto téma spoléhá na funkce ovladačů z WDDM 2.7 (Windows 10 verze 2004) pro displeje HDR a WDDM 3.0 (Windows 11, verze 21H2) pro displeje SDR.

Podporovaná rozhraní API pro vykreslování

Windows 10 podporuje širokou škálu rozhraní API a architektur vykreslování. Pokročilá podpora barev v podstatě spoléhá na to, že vaše aplikace dokáže provádět moderní prezentace pomocí rozhraní DXGI nebo rozhraní API vizuální vrstvy.

Proto jakékoli rozhraní API pro vykreslování, které může vyvést výstup do některé z těchto metod prezentace, může podporovat pokročilou barvu. To zahrnuje (ale není omezeno) níže.

  • Direct3D 11
  • Direct3D 12
  • Direct2D
  • Win2D
    • Vyžaduje použití nižší úrovně rozhraní API CanvasSwapChain nebo CanvasSwapChainPanel.
  • windows.UI.Input.Inking
    • Podporuje vlastní vykreslování suchých inkoustů pomocí directX.
  • XAML
    • Podporuje přehrávání videí HDR pomocí MediaPlayerElement.
    • Podporuje dekódování obrázků JPEG XR pomocí elementu Image.
    • Podporuje propojení DirectX pomocí SwapChainPanel.

Zpracování možností dynamického zobrazení

Windows 10 podporuje obrovský rozsah displejů podporujících pokročilé barvy, od výkonných integrovaných panelů až po vysoce výkonné herní monitory a televizory. Uživatelé Windows očekávají, že vaše aplikace bude bez problémů zpracovávat všechny tyto varianty, včetně všudypřítomných existujících zobrazení SDR.

Windows 10 poskytuje uživatelům kontrolu nad funkcemi HDR a Advanced Color. Vaše aplikace musí rozpoznat konfiguraci aktuálního zobrazení a dynamicky reagovat na všechny změny ve schopnosti. K tomu může dojít z mnoha důvodů, například proto, že uživatel povolil nebo zakázal funkci, nebo přesunul aplikaci mezi různými displeji nebo se změnil stav napájení systému.

Možnost 1: AdvancedColorInfo

Poznámka

AdvancedColorInfo rozhraní API prostředí Windows Runtime může být použito nezávisle na vykreslovacím rozhraní API, podporuje pokročilé barvy pro zobrazení SDR a používá události k signalizaci při změně schopností. Je však k dispozici pouze pro aplikace pro Univerzální platformu Windows (UPW). desktopové aplikace (které nemají CoreWindow) ho nemůžou používat. Další informace najdete v tématu rozhraní API prostředí Windows Runtime, která nejsou podporována v desktopových aplikacích.

Nejprve získejte instanci AdvancedColorInfo z DisplayInformation::GetAdvancedColorInfo.

Chcete-li zkontrolovat, jaký druh rozšířené barvy je aktuálně aktivní, použijte vlastnost AdvancedColorInfo::CurrentAdvancedColorKind. To je nejdůležitější vlastnost, kterou je třeba zkontrolovat; měli byste nakonfigurovat zpracovatelský řetězec vykreslování a prezentace v reakci na aktivní typ:

Rozšířený druh barvy Možnosti zobrazení
SDR Zobrazení SDR bez rozšířených barevných možností
WCG Zobrazení SDR s vysokou bitovou hloubkou a automatickou správou barev
HDR HDR displej se všemi možnostmi rozšířené barvy

Chcete-li zkontrolovat, jaké typy rozšířených barev jsou podporovány, ale nemusí být nutně aktivní, zavolejte AdvancedColorInfo::IsAdvancedColorKindAvailable. Tyto informace můžete použít například k zobrazení výzvy, aby uživatel přešel do aplikace Nastavení windows , aby mohl povolit HDR nebo automatickou správu barev.

Ostatní členové AdvancedColorInfo poskytují kvantitativní informace o fyzickém barevném objemu panelu (světelnost a chrominance), které odpovídají statickým metadatům HDR SMPTE ST.2086. I když byl ST.2086 původně navržen pro hdr displeje, jsou tyto informace užitečné a jsou k dispozici pro HDR i SDR displeje. Tyto informace byste měli použít ke konfiguraci mapování tónů aplikace a mapování gamutů.

Pokud chcete zpracovávat změny v rozšířených možnostech barev, zaregistrujte událost DisplayInformation::AdvancedColorInfoChanged. Tato událost se vyvolá, pokud se z nějakého důvodu změní některý parametr možností rozšířené barvy zobrazení.

Tuto událost zpracujte získáním nové instance AdvancedColorInfoa kontrolou, které hodnoty se změnily.

IDXGIOutput6

Poznámka

Grafická infrastruktura Rozhraní DirectX IDXGIOutput6 je k dispozici pro libovolnou aplikaci, která používá Rozhraní DirectX bez ohledu na to, jestli se jedná o desktopovou nebo univerzální platformu Windows (UPW). IDXGIOutput6ale nepodporuje zobrazení SDR s rozšířenými možnostmi barev, jako je automatická správa barev; dokáže identifikovat pouze displeje HDR.

Pokud píšete desktopovou aplikaci Win32 a k vykreslení používáte DirectX, použijte k získání možností zobrazení DXGI_OUTPUT_DESC1. Získejte instanci této struktury prostřednictvím IDXGIOutput6::GetDesc1.

Chcete-li zkontrolovat, jaký druh rozšířené barvy je aktuálně aktivní, použijte vlastnost ColorSpace, která je typu DXGI_COLOR_SPACE_TYPEa obsahuje jednu z následujících hodnot:

DXGI_COLOR_SPACE_TYPE Možnosti zobrazení
DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709 Zobrazení SDR bez rozšířených barevných možností
DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020 HDR displej se všemi možnostmi rozšířené barvy

Poznámka

SDR displeje s technologií Pokročilé barvy jsou také hlášeny jako DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709; DXGI neumožňuje rozlišovat mezi těmito dvěma typy.

Poznámka

DXGI neumožňuje zkontrolovat, jaké typy rozšířených barev jsou v tuto chvíli podporované, ale v tuto chvíli nejsou aktivní.

Většina ostatních členů DXGI_OUTPUT_DESC1 poskytuje kvantitativní informace o fyzickém barevném objemu panelu (světelnost a chrominance), které odpovídají statickým metadatům HDR SMPTE ST.2086. I když byl ST.2086 původně navržen pro hdr displeje, jsou tyto informace užitečné a jsou k dispozici pro HDR i SDR displeje. Tyto informace byste měli použít ke konfiguraci mapování tónů aplikace a mapování gamutů.

Desktopové aplikace Win32 nemají nativní mechanismus pro reakci na změny funkcí Advanced Color. Pokud vaše aplikace používá smyčku vykreslování, měli byste dotazovat IDXGIFactory1::IsCurrent pro každý snímek. Pokud hlásí false, měli byste získat nový DXGI_OUTPUT_DESC1a zkontrolovat, které hodnoty se změnily.

Kromě toho by vaše čerpadlo zpráv Win32 mělo zpracovat WM_SIZE zprávu, která indikuje, že se vaše aplikace mohla přesouvat mezi různými displeji.

Poznámka

Chcete-li získat nový DXGI_OUTPUT_DESC1, je nutné získat aktuální zobrazení. Neměli byste však volat IDXGISwapChain::GetContainingOutput. Je to proto, že swap chainy vrací zastaralý výstup DXGI, jakmile DXGIFactory::IsCurrent je neplatný; a opětovným vytvořením swap chainu k získání aktuálního výstupu dochází k dočasnému zobrazení černé obrazovky. Místo toho doporučujeme vytvořit výčet přes hranice všech výstupů DXGI a určit, který z nich má největší průsečík s hranicemi okna aplikace.

Následující ukázkový kód pochází z ukázkové aplikace Direct3D 12 HDR na GitHubu.

// Retrieve the current default adapter.
ComPtr<IDXGIAdapter1> dxgiAdapter;
ThrowIfFailed(m_dxgiFactory->EnumAdapters1(0, &dxgiAdapter));

// Iterate through the DXGI outputs associated with the DXGI adapter,
// and find the output whose bounds have the greatest overlap with the
// app window (i.e. the output for which the intersection area is the
// greatest).

UINT i = 0;
ComPtr<IDXGIOutput> currentOutput;
ComPtr<IDXGIOutput> bestOutput;
float bestIntersectArea = -1;

while (dxgiAdapter->EnumOutputs(i, &currentOutput) != DXGI_ERROR_NOT_FOUND)
{
    // Get the retangle bounds of the app window
    int ax1 = m_windowBounds.left;
    int ay1 = m_windowBounds.top;
    int ax2 = m_windowBounds.right;
    int ay2 = m_windowBounds.bottom;

    // Get the rectangle bounds of current output
    DXGI_OUTPUT_DESC desc;
    ThrowIfFailed(currentOutput->GetDesc(&desc));
    RECT r = desc.DesktopCoordinates;
    int bx1 = r.left;
    int by1 = r.top;
    int bx2 = r.right;
    int by2 = r.bottom;

    // Compute the intersection
    int intersectArea = ComputeIntersectionArea(ax1, ay1, ax2, ay2, bx1, by1, bx2, by2);
    if (intersectArea > bestIntersectArea)
    {
        bestOutput = currentOutput;
        bestIntersectArea = static_cast<float>(intersectArea);
    }

    i++;
}

// Having determined the output (display) upon which the app is primarily being 
// rendered, retrieve the HDR capabilities of that display by checking the color space.
ComPtr<IDXGIOutput6> output6;
ThrowIfFailed(bestOutput.As(&output6));

DXGI_OUTPUT_DESC1 desc1;
ThrowIfFailed(output6->GetDesc1(&desc1));

Nastavení swap chainu DirectX

Jakmile zjistíte, že zobrazení aktuálně podporuje možnosti rozšířené barvy, nakonfigurujte swap řetězec následujícím způsobem.

Použití efektu překlopení prezentačního modelu

Při vytváření swap řetězce pomocí jedné z metod CreateSwapChainFor[Hwnd|Složení|CoreWindow] musíte použít DXGI model překlopení výběrem buď možnosti DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, nebo DXGI_SWAP_EFFECT_FLIP_DISCARD, takže váš swap řetězec bude způsobilý pro pokročilé zpracování barev DWM a různé optimalizace pro celou obrazovku. Další informace naleznete v tématu Pro nejlepší výkon použijte DXGI flip model.

Možnost 1. Použití formátu FP16 pixelů a barevného prostoru SCRGB

Windows 10 podporuje dvě hlavní kombinace formátu pixelů a barevného prostoru pro pokročilou barvu. Vyberte jednu z nich na základě konkrétních požadavků vaší aplikace.

Doporučujeme, aby aplikace pro obecné účely používaly možnost 1. Je to jediná možnost, která funguje pro všechny typy rozšířených barevných zobrazení, obsahu a vykreslovacích rozhraní API. Při vytváření řetězce prohození zadejte DXGI_FORMAT_R16G16B16A16_FLOAT v DXGI_SWAP_CHAIN_DESC1. Ve výchozím nastavení se řetězec výměny, vytvořený s plovoucím formátem pixelů, považuje za používající barevný prostor DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709. To je stejný formát pixelů a barevný prostor používaný DWM.

Tato kombinace poskytuje číselný rozsah a přesnost k určení jakékoli fyzicky možné barvy a provedení libovolného zpracování včetně prolnutí.

Tato možnost ale využívá 64 bitů na pixel, což ve srovnání s tradičními formáty pixelů UINT8 zdvojnásobuje šířku pásma a paměť GPU. Kromě toho scRGB používá číselné hodnoty, které jsou mimo normalizovaný rozsah [0, 1], aby představovaly barvy, které jsou mimo gamut sRGB a/nebo větší než 80 nitů světelnosti. Například scRGB (1.0, 1.0, 1.0) kóduje standardní bílou D65 na 80 nits; ale scRGB (12.5, 12.5, 12.5) kóduje stejnou D65 bílou na mnohem jasnější 1000 nits. Některé grafické operace vyžadují normalizovaný číselný rozsah a je nutné upravit operaci nebo znovu normalizovat hodnoty barev.

Způsob, jakým jsou hodnoty světelnosti interpretovány pomocí této možnosti, se liší mezi zobrazeními SDR a HDR; viz níže.

Možnost 2: Použití formátu UINT10/RGB10 pixelů a barevného prostoru HDR10/BT.2100

Možnost 2 je optimalizace výkonu, která je dostupná jenom v případě, že vaše aplikace splňuje všechny následující podmínky:

  • Cílí na displej HDR.
  • Používá Direct3D 12 nebo Direct3D 11.
  • Řetězec swap nevyžaduje míchání s alfou/průhledností.

Pokud vaše aplikace nesplňuje všechny tyto podmínky, musíte použít možnost 1.

Pokud se ale vaše aplikace kvalifikuje pro možnost 2, může to zajistit lepší výkon, pokud vaše aplikace využívá obsah s kódováním HDR10, jako je přehrávač videa, nebo pokud se bude používat hlavně ve scénářích na celou obrazovku, jako je hra. Při vytváření swap chainu byste měli zvážit použití DXGI_FORMAT_R10G10B10A2_UNORM v DXGI_SWAP_CHAIN_DESC1. Ve výchozím nastavení se to považuje za použití barevného prostoru sRGB; proto musíte explicitně volat IDXGISwapChain3::SetColorSpace1a nastavit jako barevný prostor DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020, označovaný také jako HDR10/BT.2100.

Tato možnost využívá stejných 32 bitů na pixel jako tradiční formáty pixelů UINT8 SDR. Kromě toho na určitých GRAFICKÝch procesorech se eliminuje zpracování potřebné k převodu obsahu na formát drátu HDR10.

Použití řetězce pro pokročilé výměny barev při zobrazení v režimu SDR

Řetěz prohození rozšířených barev můžete použít i v případě, že zobrazení nepodporuje všechny možnosti Rozšířené barvy. V takových případech správce okna plochy (DWM) převede obsah na nižší kvalitu, aby odpovídal schopnostem zobrazení, a to provedením číselného výřezu. Pokud například vykreslujete na scRGB FP16 swap chain a cílíte na standardní displej, hodnoty mimo číselný rozsah [0, 1] jsou ořezány.

K tomuto chování převodu dolů dojde také, pokud je okno vaší aplikace přesahující dva nebo více displejů s různými pokročilými barevnými schopnostmi. AdvancedColorInfo a IDXGIOutput6 jsou abstrahovány k tomu, aby vykazovaly pouze vlastnosti hlavního zobrazení (hlavní je definováno jako zobrazení obsahující střed okna).

Porovnejte referenční bílou vaší aplikace s úrovní referenční bílé SDR v operačním systému.

Poznámka

Referenční bílá platí pouze pro displeje HDR; Pro zobrazení SDR Advanced Color (1.0, 1.0, 1.0) vždy znamená maximální bílou světelnost, kterou může displej reprodukovat.

V mnoha scénářích bude vaše aplikace chtít vykreslit obsah SDR i HDR; Například vykreslování titulků nebo ovládacích prvků přenosu přes video HDR nebo uživatelské rozhraní do herní scény. Je důležité pochopit koncept referenční úrovně SDR , abyste měli jistotu, že váš obsah SDR na displeji HDR vypadá správně. Odkaz bíle označuje jas, při kterém se ve scéně HDR zobrazuje difuzní bílý objekt (například list papíru nebo uživatelské rozhraní). Vzhledem k tomu, že hodnoty barev HDR mají jas odkazovaný na scénu, měla by se konkrétní hodnota barvy zobrazit na absolutní úrovni světelnosti, a ne vzhledem k maximální možné hodnotě panelu. Například scRGB (1.0, 1.0, 1.0) a HDR10 (497, 497, 497) kódují přesně D65 bílou při světelnosti 80 nitů. Systém Windows umožňuje uživateli upravit referenční bílou úroveň SDR na hodnotu podle svých preferencí, což je světelnost, při které Windows vykreslí sRGB (1.0, 1.0, 1.0). Na stolních monitorech HDR jsou referenční bílé úrovně SDR obvykle nastaveny na přibližně 200 nits.

Aplikace HDR musí uživateli povolit nastavení požadované referenční bílé úrovně nebo čtení hodnoty nakonfigurované systémem. Musíte namapovat difúzní bílé barevné hodnoty ve své scéně na referenční bílou úroveň SDR. To znamená vynásobení vyrovnávací paměti vaší aplikace v lineárním gama prostoru.

Poznámka

Na displeji, který podporuje ovládací prvek jasu, například na přenosném počítači, systém Windows také upraví jas obsahu HDR (odkazované na scénu) tak, aby odpovídal požadované úrovni jasu uživatele, ale to je pro aplikaci neviditelné. Pokud se nesnažíte zaručit bitově přesnou reprodukci signálu HDR, můžete to obecně ignorovat.

Pokud vaše aplikace vždy vykresluje SDR a HDR na samostatné povrchy a spoléhá na složení operačního systému, Windows automaticky provede správnou úpravu pro zvýšení obsahu SDR na požadovanou bílou úroveň. Pokud například vaše aplikace používá XAML a vykresluje obsah HDR na vlastní SwapChainPanel.

Pokud ale vaše aplikace provádí vlastní složení obsahu SDR a HDR na jednu plochu, zodpovídáte za úpravu referenční úrovně bílé v SDR sami. Jinak se obsah SDR může v typických podmínkách zobrazení plochy zobrazovat příliš šedě. Nejprve musíte získat aktuální referenční bílou úroveň SDR a poté musíte upravit hodnoty barev veškerého obsahu SDR, který vykreslujete.

Krok 1. Získání aktuální referenční úrovně bílé pro SDR

Aktuální úroveň bílé referenční úrovně SDR můžete získat jedním z těchto způsobů:

Krok 2. Úprava hodnot barev obsahu SDR

Systém Windows definuje nominální, tedy výchozí, referenční bílou úroveň při 80 nitech. Proto pokud byste chtěli vykreslit standardní sRGB (1.0, 1.0, 1.0) bílou na FP16 swap chain, pak by se reprodukovala při svítivosti 80 nits. Chcete-li, aby obsah SDR odpovídal skutečné uživatelsky definované referenční bílé úrovni, je nutné upravit jej z 80 nits na úroveň určenou prostřednictvím AdvancedColorInfo.SdrWhiteLevelInNits.

Pokud vykreslujete pomocí FP16 a scRGB nebo libovolného barevného prostoru, který používá lineární gama (1,0), můžete jednoduše vynásobit hodnotu barvy SDR AdvancedColorInfo.SdrWhiteLevelInNits / 80. Pokud používáte Direct2D, existuje předdefinovaná konstanta D2D1_SCENE_REFERRED_SDR_WHITE_LEVEL, která má hodnotu 80.

D2D1_VECTOR_4F inputColor; // Input SDR color value.
D2D1_VECTOR_4F outputColor; // Output color adjusted for SDR white level.
auto acInfo = ...; // Obtain an AdvancedColorInfo.

float sdrAdjust = acInfo->SdrWhiteLevelInNits / D2D1_SCENE_REFERRED_SDR_WHITE_LEVEL;

// Normally in DirectX, color values are manipulated in shaders on GPU textures.
// This example performs scaling on a CPU color value.
outputColor.r = inputColor.r * sdrAdjust; // Assumes linear gamma color values.
outputColor.g = inputColor.g * sdrAdjust;
outputColor.b = inputColor.b * sdrAdjust;
outputColor.a = inputColor.a;

Pokud vykreslujete s použitím nelineárního gama v barevném prostoru, jako je HDR10, je provádění úprav úrovně bílé pro SDR složitější. Pokud píšete vlastní pixelový shader, zvažte převod na lineární gama, aby bylo možné použít úpravy.

Přizpůsobení obsahu HDR schopnostem zobrazení pomocí mapování tónu

Hdr a rozšířené barvy se výrazně liší z hlediska jejich schopností. Například v minimální a maximální světelnosti a barevném gamutu, které jsou schopné reprodukovat. V mnoha případech bude obsah HDR obsahovat barvy, které překračují možnosti zobrazení. Pro nejlepší kvalitu obrazu je důležité provést mapování tónu HDR, v podstatě komprimovat rozsah barev tak, aby se přizpůsobil zobrazení a co nejlépe zachová vizuální záměr obsahu.

Nejdůležitějším jediným parametrem, který se má přizpůsobit, je maximální světelnost, označovaná také jako MaxCLL (úroveň světla obsahu); důmyslnější mapovače tónů také přizpůsobí minimální světelnost (MinCLL) a/nebo barevné primarie.

Krok 1. Získání možností hlasitosti barev displeje

Aplikace pro Univerzální platformu Windows (UPW)

Pomocí AdvancedColorInfo získáte barevný objem zobrazení.

Win32 (desktopové) aplikace DirectX

Pomocí DXGI_OUTPUT_DESC1 získáte barevný rozsah zobrazení.

Krok 2. Získat informace o barevném objemu obsahu

V závislosti na tom, odkud váš obsah HDR pochází, existuje několik možných způsobů, jak určit její světelnost a informace o barevném gamutu. Některé soubory videa a obrázků HDR obsahují metadata SMPTE ST.2086. Pokud se obsah vykresloval dynamicky, možná budete moct extrahovat informace o scéně z interních fází vykreslování – například nejjasnější zdroj světla ve scéně.

Obecnější, ale výpočetně nákladné řešení je spuštění histogramu nebo jiné analýzy předávané na vykreslený rámec. Ukázková aplikace pro pokročilé vykreslování barevných obrázků pomocí Direct2D na GitHubu demonstruje, jak to provést pomocí Direct2D; Nejdůležitější úryvky kódu jsou uvedeny níže:

// Perform histogram pipeline setup; this should occur as part of image resource creation.
// Histogram results in no visual output but is used to calculate HDR metadata for the image.
void D2DAdvancedColorImagesRenderer::CreateHistogramResources()
{
    auto context = m_deviceResources->GetD2DDeviceContext();

    // We need to preprocess the image data before running the histogram.
    // 1. Spatial downscale to reduce the amount of processing needed.
    DX::ThrowIfFailed(
        context->CreateEffect(CLSID_D2D1Scale, &m_histogramPrescale)
        );

    DX::ThrowIfFailed(
        m_histogramPrescale->SetValue(D2D1_SCALE_PROP_SCALE, D2D1::Vector2F(0.5f, 0.5f))
        );

    // The right place to compute HDR metadata is after color management to the
    // image's native colorspace but before any tonemapping or adjustments for the display.
    m_histogramPrescale->SetInputEffect(0, m_colorManagementEffect.Get());

    // 2. Convert scRGB data into luminance (nits).
    // 3. Normalize color values. Histogram operates on [0-1] numeric range,
    //    while FP16 can go up to 65504 (5+ million nits).
    // Both steps are performed in the same color matrix.
    ComPtr<ID2D1Effect> histogramMatrix;
    DX::ThrowIfFailed(
        context->CreateEffect(CLSID_D2D1ColorMatrix, &histogramMatrix)
        );

    histogramMatrix->SetInputEffect(0, m_histogramPrescale.Get());

    float scale = sc_histMaxNits / sc_nominalRefWhite;

    D2D1_MATRIX_5X4_F rgbtoYnorm = D2D1::Matrix5x4F(
        0.2126f / scale, 0, 0, 0,
        0.7152f / scale, 0, 0, 0,
        0.0722f / scale, 0, 0, 0,
        0              , 0, 0, 1,
        0              , 0, 0, 0);
    // 1st column: [R] output, contains normalized Y (CIEXYZ).
    // 2nd column: [G] output, unused.
    // 3rd column: [B] output, unused.
    // 4th column: [A] output, alpha passthrough.
    // We explicitly calculate Y; this deviates from the CEA 861.3 definition of MaxCLL
    // which approximates luminance with max(R, G, B).

    DX::ThrowIfFailed(histogramMatrix->SetValue(D2D1_COLORMATRIX_PROP_COLOR_MATRIX, rgbtoYnorm));

    // 4. Apply a gamma to allocate more histogram bins to lower luminance levels.
    ComPtr<ID2D1Effect> histogramGamma;
    DX::ThrowIfFailed(
        context->CreateEffect(CLSID_D2D1GammaTransfer, &histogramGamma)
        );

    histogramGamma->SetInputEffect(0, histogramMatrix.Get());

    // Gamma function offers an acceptable tradeoff between simplicity and efficient bin allocation.
    // A more sophisticated pipeline would use a more perceptually linear function than gamma.
    DX::ThrowIfFailed(histogramGamma->SetValue(D2D1_GAMMATRANSFER_PROP_RED_EXPONENT, sc_histGamma));
    // All other channels are passthrough.
    DX::ThrowIfFailed(histogramGamma->SetValue(D2D1_GAMMATRANSFER_PROP_GREEN_DISABLE, TRUE));
    DX::ThrowIfFailed(histogramGamma->SetValue(D2D1_GAMMATRANSFER_PROP_BLUE_DISABLE, TRUE));
    DX::ThrowIfFailed(histogramGamma->SetValue(D2D1_GAMMATRANSFER_PROP_ALPHA_DISABLE, TRUE));

    // 5. Finally, the histogram itself.
    HRESULT hr = context->CreateEffect(CLSID_D2D1Histogram, &m_histogramEffect);
    
    if (hr == D2DERR_INSUFFICIENT_DEVICE_CAPABILITIES)
    {
        // The GPU doesn't support compute shaders and we can't run histogram on it.
        m_isComputeSupported = false;
    }
    else
    {
        DX::ThrowIfFailed(hr);
        m_isComputeSupported = true;

        DX::ThrowIfFailed(m_histogramEffect->SetValue(D2D1_HISTOGRAM_PROP_NUM_BINS, sc_histNumBins));

        m_histogramEffect->SetInputEffect(0, histogramGamma.Get());
    }
}

// Uses a histogram to compute a modified version of MaxCLL (ST.2086 max content light level).
// Performs Begin/EndDraw on the D2D context.
void D2DAdvancedColorImagesRenderer::ComputeHdrMetadata()
{
    // Initialize with a sentinel value.
    m_maxCLL = -1.0f;

    // MaxCLL is not meaningful for SDR or WCG images.
    if ((!m_isComputeSupported) ||
        (m_imageInfo.imageKind != AdvancedColorKind::HighDynamicRange))
    {
        return;
    }

    // MaxCLL is nominally calculated for the single brightest pixel in a frame.
    // But we take a slightly more conservative definition that takes the 99.99th percentile
    // to account for extreme outliers in the image.
    float maxCLLPercent = 0.9999f;

    auto ctx = m_deviceResources->GetD2DDeviceContext();

    ctx->BeginDraw();

    ctx->DrawImage(m_histogramEffect.Get());

    // We ignore D2DERR_RECREATE_TARGET here. This error indicates that the device
    // is lost. It will be handled during the next call to Present.
    HRESULT hr = ctx->EndDraw();
    if (hr != D2DERR_RECREATE_TARGET)
    {
        DX::ThrowIfFailed(hr);
    }

    float *histogramData = new float[sc_histNumBins];
    DX::ThrowIfFailed(
        m_histogramEffect->GetValue(D2D1_HISTOGRAM_PROP_HISTOGRAM_OUTPUT,
            reinterpret_cast<BYTE*>(histogramData),
            sc_histNumBins * sizeof(float)
            )
        );

    unsigned int maxCLLbin = 0;
    float runningSum = 0.0f; // Cumulative sum of values in histogram is 1.0.
    for (int i = sc_histNumBins - 1; i >= 0; i--)
    {
        runningSum += histogramData[i];
        maxCLLbin = i;

        if (runningSum >= 1.0f - maxCLLPercent)
        {
            break;
        }
    }

    float binNorm = static_cast<float>(maxCLLbin) / static_cast<float>(sc_histNumBins);
    m_maxCLL = powf(binNorm, 1 / sc_histGamma) * sc_histMaxNits;

    // Some drivers have a bug where histogram will always return 0. Treat this as unknown.
    m_maxCLL = (m_maxCLL == 0.0f) ? -1.0f : m_maxCLL;
}

Krok 3. Provedení operace tonemappingu HDR

Tonemapping je ze své podstaty ztrátový proces a je možné ho optimalizovat pro řadu perceptuálních nebo objektivních metrik, takže neexistuje žádný standardní algoritmus. Systém Windows poskytuje integrovaný efekt HDR tonemapper jako součást Direct2D a také v kanálu přehrávání videa MEDIA Foundation HDR. Mezi další běžně používané algoritmy patří ACES Filmic, Reinhard a ITU-R BT.2390-3 EETF (elektricko-elektrická přenosová funkce).

Zjednodušený operátor Reinhard tonemapper se zobrazí v tomto dalším příkladu kódu.

// This example uses C++. A typical DirectX implementation would port this to HLSL.
D2D1_VECTOR_4F simpleReinhardTonemapper(
    float inputMax, // Content's maximum luminance in scRGB values, e.g. 1.0 = 80 nits.
    float outputMax, // Display's maximum luminance in scRGB values, e.g. 1.0 = 80 nits.
    D2D1_VECTOR_4F input // scRGB color.
)
{
    D2D1_VECTOR_4F output = input;

    // Vanilla Reinhard normalizes color values to [0, 1].
    // This modification scales to the luminance range of the display.
    output.r /= inputMax;
    output.g /= inputMax;
    output.b /= inputMax;

    output.r = output.r / (1 + output.r);
    output.g = output.g / (1 + output.g);
    output.b = output.b / (1 + output.b);

    output.r *= outputMax;
    output.g *= outputMax;
    output.b *= outputMax;

    return output;
}

Zachycení obsahu obrazovky HDR a WCG

Rozhraní API, která podporují zadávání formátů pixelů, jako jsou ta v oboru názvů Windows.Graphics.Capture, a metodu IDXGIOutput5::DuplicateOutput1, poskytují možnost zachytit obsah HDR a WCG bez ztráty informací o pixelech. Všimněte si, že po získání rámců obsahu se vyžaduje další zpracování. Například mapování tónu HDR-to-SDR (například kopírování snímku obrazovky SDR pro sdílení internetu) a ukládání obsahu se správným formátem (například JPEG XR).

Změny starší správy barev a chování profilu ICC

Pokročilá správa barev a automatických barev zajišťuje konzistentní a barevně přesnou barvu zobrazení pro všechny aplikace, starší a moderní verze. Některé aplikace ale můžou provádět vlastní explicitní správu barev pomocí profilů barev International Color Consortium (ICC).

Pokud je Advanced Color aktivní na displejích SDR nebo HDR, chování profilů ICC zobrazení se změní způsobem, který není zpětně kompatibilní. Pokud vaše aplikace funguje se zobrazením profilů ICC, nabízí Windows pomocné rutiny kompatibility, aby se zajistilo, že vaše aplikace bude dál správně fungovat.

Další informace o změnách chování ICC profilů a o tom, jak můžete upravit svou aplikaci, aby byla maximálně kompatibilní s pokročilými barvami, naleznete v části chování ICC profilu u pokročilých barev.

Další zdroje informací