Uso de DirectX con pantallas de alto rango dinámico y color avanzado

En este tema se muestra cómo usar DirectX con escenarios de color avanzado, incluidos el alto rango dinámico (HDR), la amplia gama de colores (WCG) con la administración automática de colores del sistema y la profundidad de bits alta. Las pantallas premium del equipo personal (PC) con al menos una de las mejoras anteriores se están volviendo generalizadas, lo que proporciona una fidelidad de color significativamente mayor que las pantallas de rango dinámico estándar (SDR) tradicionales.

En este tema, obtendrá información general sobre los conceptos técnicos clave que subyacen a la compatibilidad con Windows Advanced Color. Obtendrá información sobre los requisitos y las instrucciones para representar contenido HDR, WCG y directX de gran profundidad de bits en una de estas pantallas. Si tiene una aplicación administrada por colores (por ejemplo, mediante perfiles ICC), aprenderá cómo la administración automática de colores permite una mejor precisión de color para sus escenarios.

Introducción al color avanzado en Windows

Advanced Color es un término general de tecnologías del sistema operativo (SO) para pantallas con una fidelidad de color significativamente mayor que las pantallas estándar. Las funcionalidades extendidas predominantes se describen en las secciones siguientes. Las funcionalidades avanzadas de color se introdujeron por primera vez para pantallas HDR con Windows 10, versión 1709 (Fall Creators Update) y para pantallas SDR especialmente aprovisionadas con el Windows 11, versión 22H2 (10.0; Versión de compilación 22621.

Rango dinámico alto

Rango dinámico hace referencia a la diferencia entre la luminancia máxima y mínima en una escena; esto se mide a menudo en nits (candelas por centímetros cuadrados). Las escenas reales, como esta puesta de sol, suelen tener rangos dinámicos de 10 órdenes de magnitud de luminancia; el ojo humano puede distinguir un rango aún mayor después de la adaptación.

imagen de una puesta de sol con brillo y puntos más oscuros en la escena etiquetada

Desde Direct3D 9, los motores gráficos han podido representar internamente sus escenas con este nivel de fidelidad físicamente precisa. Sin embargo, una pantalla de rango dinámico estándar típica puede reproducir solo un poco más de 3 órdenes de magnitud de luminancia y, por lo tanto, cualquier contenido representado por HDR tenía que ser de tono (comprimido) en el intervalo limitado de la pantalla. Nuevas pantallas HDR, incluidas las que cumplen con el estándar HDR10 (BT.2100), rompen esta limitación; por ejemplo, las pantallas autoemisivas de alta calidad pueden lograr más de 6 órdenes de magnitud.

Amplia gama de colores

La gama de colores hace referencia al intervalo y la saturación de tonos que una pantalla puede reproducir. Los colores naturales más saturados que el ojo humano puede percibir constan de luz pura monocromática, como la producida por láseres. Sin embargo, las pantallas de consumidor estándar a menudo solo pueden reproducir colores dentro de la gama sRGB, que representa solo el 35 % de todos los colores percebibles por humanos. El diagrama siguiente es una representación del "locus espectral" humano o de todos los colores percebibles (en un nivel de luminancia determinado), donde el triángulo más pequeño es la gama sRGB.

diagrama del locus espectral humano y la gama sRGB

Las pantallas de pc profesionales de gama alta tienen largas gamas de colores compatibles que son significativamente más anchas que sRGB, como Adobe RGB y DCI-P3 que cubren alrededor de la mitad de los colores percebibles humanos. Y estas pantallas de amplia gama son cada vez más comunes.

Administración automática de colores del sistema

La gestión de colores es la tecnología y la práctica de garantizar una reproducción de colores precisa y coherente en todos los dispositivos. Si es un creador de contenido digital, es fundamental para los colores de su contenido visual (como una foto, una imagen de producto o un logotipo) para que aparezcan iguales en la pantalla que en la amplia variedad de dispositivos digitales de su audiencia.

Windows ha proporcionado API de compatibilidad con la administración de colores desde Windows 2000 con las API Image Color Management (ICM) y versiones posteriores del Sistema de colores de Windows (WCS). Sin embargo, esas API solo eran asistentes para las aplicaciones que deseaban o requerían realizar la administración de colores; aunque la mayoría de las aplicaciones y el contenido digital simplemente asumieron el espacio de colores sRGB estándar del sector y nunca fueron administrados por el sistema operativo. Eso fue una suposición razonable en el pasado, pero las pantallas de gama ancha de alta calidad se están volviendo mucho más comunes.

Las nuevas versiones de Windows admiten la administración automática de colores del sistema; que garantiza que todos los colores de cada aplicación de Windows, tanto si tienen o no reconocimiento de colores, aparecen de forma precisa y coherente en cada pantalla compatible.

Nota:

La administración automática de colores no es una propiedad del hardware de pantalla; en su lugar, es una característica de Windows para admitir correctamente pantallas que tienen una gama de colores mayor que sRGB.

Profundidad de precisión y bits profundas

Precisión numérica, o profundidad de bits, hace referencia a la cantidad de información utilizada para identificar de forma única los colores. La profundidad de bits superior significa que puede distinguir entre colores muy similares sin artefactos como bandas. Los equipos estándar admiten 8 bits por canal de color, mientras que el ojo humano requiere al menos 10-12 bits de precisión para evitar distorsiones percebibles.

imagen de molinos de viento en un canal simulado de 2 bits por canal de color frente a 8 bits por canal

Antes de Advanced Color, las aplicaciones con ventanas restringidas del Administrador de ventanas de escritorio (DWM) para generar contenido solo en 8 bits por canal de color, incluso si la pantalla admitía una profundidad de bits mayor. Cuando el color avanzado está habilitado, DWM realiza su composición mediante el punto flotante de precisión media IEEE (FP16), lo que elimina los cuellos de botella y permite usar la precisión completa de la pantalla.

Arquitectura del sistema De color avanzado de Windows

La información de esta sección es opcional para crear aplicaciones de color avanzado; pero resulta útil comprender cómo funciona la tecnología para optimizar la representación y el comportamiento de la aplicación.

En esta sección, usaremos un diagrama simplificado para describir los componentes pertinentes de la pila de gráficos de Windows:

diagrama de bloques de la pila de gráficos de Windows: aplicación a DWM para mostrar el kernel

Windows existente: muestras de 8 bits/sRGB

Durante décadas, las pantallas de consumidor y la pila de gráficos de Windows se basaron alrededor de 8 bits por canal (24 bits por píxel) contenido sRGB. Las aplicaciones que usan API de gráficos como DirectX podrían realizar una representación interna mediante profundidades de bits altas y espacios de color extendidos; sin embargo, el sistema operativo solo admite enteros de 8 bits con sRGB implícito y sin administración de colores del sistema:

diagrama de bloques de la pila de visualización de SDR: limitado a sRGB, de 8 bits, sin administración de colores

Eso significaba que los datos de color adicionales representados por una aplicación se perderían al mostrarse; y que la aplicación tuvo que realizar la gestión de colores para garantizar una reproducción precisa en una pantalla.

Windows 10, versión 1703: pantallas HDR con color avanzado

Windows 10, versión 1703, introdujo la primera versión de las funcionalidades de color avanzado para pantallas HDR. Esto requería varios avances significativos en la pila de gráficos del sistema operativo:

  • Compatibilidad con señalización de pantalla HDR
  • Composición del sistema mediante un espacio de colores canónico y de gran profundidad de bits
  • Administración automática de colores del sistema

diagrama de bloques de la pila de pantalla HDR: FP16, scRGB, con administración automática de colores

Cada avance se trata en las subsecciones siguientes. El resultado neto es que los datos extendidos de color de la aplicación ahora se conservan correctamente por el sistema operativo y se reproducen con precisión en pantallas HDR.

Compatibilidad con señalización de pantalla HDR

La señalización HDR sobre conectores de pantalla, como DisplayPort y HDMI, usa principalmente 10 bits por precisión de canal (o superior) y el espacio de colores BT.2100 ST.2084. El kernel de pantalla, el controlador de pantalla y el hardware de GPU subyacentes deben admitir la detección, selección y conducción de este modo de señalización.

Composición del sistema mediante un espacio de colores canónico y de gran profundidad de bits

El espacio de colores BT.2100 ST.2084 es un estándar eficaz para codificar colores HDR, pero no es adecuado para muchas operaciones de representación y composición (mezcla). También queremos probar en el futuro el sistema operativo para admitir tecnologías y espacios de color más allá de BT.2100, que cubre menos de 2/3 de colores visibles para personas. Por último, siempre que sea posible, queremos minimizar el consumo de recursos de GPU para mejorar la potencia y el rendimiento.

Cuando está en modo HDR, el Administrador de ventanas de escritorio (DWM) usa un espacio de colores de composición canónico (CCCS) definido como:

  • espacio de colores scRGB (BT.709/sRGB principalmente con gamma lineal)
  • Precisión media ieee (profundidad de bits FP16)

Esto proporciona un buen equilibrio entre todos los objetivos anteriores. CCCS permite valores de color fuera del rango numérico [0, 1] ; dado el intervalo de valores FP16 válidos, puede representar órdenes de magnitud más colores que el intervalo visual humano natural, incluidos los valores de luminancia de más de 5 millones de nits. FP16 tiene una excelente precisión para las operaciones lineales de mezcla gamma, pero cuesta la mitad del consumo de memoria gpu y el ancho de banda de precisión única tradicional (FP32) sin pérdida de calidad percebible.

Administración automática de colores del sistema

Windows es un entorno multitarea en el que el usuario puede ejecutar cualquier número de aplicaciones SDR y HDR al mismo tiempo con ventanas superpuestas. Por lo tanto, es fundamental que todos los tipos de contenido se vean correctos y con la máxima calidad cuando la salida a una pantalla; por ejemplo, una aplicación de productividad sRGB (SDR) con una ventana de vídeo BT.2100 ST.2084 (HDR) que se reproduce sobre ella.

Cuando está en modo HDR, Windows realiza operaciones de administración de colores en dos fases:

  1. DwM convierte cada aplicación de su espacio de color nativo en CCCS antes de mezclarse.
  2. El kernel de pantalla convierte el búfer de fotogramas del sistema operativo de CCCS al espacio de color de formato de cable (BT.2100 ST.2084).

diagrama de bloques de administración automática de colores que se produce en DWM y diagrama de bloques de kernelde visualización de la administración automática de colores que se produce en DWM y kernel de visualización, parte 2

Nota:

En ambas fases, la operación de administración de colores consta de una conversión de espacio de color (matriz y 1DLUT). Los colores que superan la gama de colores de destino de la pantalla se recortan numéricamente.

Windows 11, versión 22H2: SDR muestra con color avanzado

Aunque la prevalencia de las pantallas HDR está creciendo rápidamente, las pantallas de SDR seguirán siendo importantes durante años. La compatibilidad hdr en Windows 10, versión 1703, estableció la mayor parte de la base necesaria para mejorar también las pantallas SDR. Windows 11, la versión 22H2 amplía las funcionalidades avanzadas de administración de color y color automático a determinadas pantallas de SDR aptas. El diagrama de bloques gráficos para pantallas de SDR de color avanzado tiene un aspecto muy similar a HDR:

diagrama de bloques de la pila de visualización de SDR AC: FP16, scRGB, con administración automática de colores

Compatibilidad con señalización de pantalla de SDR con profundidad de bits alta

La señalización subyacente para las pantallas de SDR no cambia, aunque la versión de Windows 11, versión 22H2 admite 10 bits por canal y versiones posteriores, en función de las funcionalidades de la pantalla.

Composición del sistema mediante un espacio de colores canónico y de gran profundidad de bits

La funcionalidad de color avanzado DWM, incluida la combinación en CCCS, no cambia completamente de las pantallas HDR. La principal diferencia es que DWM usa la luminancia a la que se hace referencia en la pantalla con pantallas SDR y la luminancia a la que se hace referencia en la escena con pantallas HDR. Esto cambia la forma en que el sistema operativo interpreta el contenido representado por el color avanzado:

Tipo de presentación Comportamiento de la luminancia Cómo se interpreta la versión 1.0f
SDR Visualización a la que se hace referencia Como nivel blanco de referencia de la pantalla
HDR Escena a la que se hace referencia Como 80 nits (blanco de referencia nominal)

Administración automática de colores del sistema

Las funcionalidades de administración de colores del sistema del sistema operativo también no se modifican principalmente en las pantallas HDR. La principal diferencia es que el kernel de pantalla se convierte en el espacio de colores al que se hace referencia como se define en los datos de color y calibración de la pantalla, en lugar del espacio de color BT.2100 ST.2084 estándar para pantallas HDR.

Visualización del aprovisionamiento necesario

Se necesitan datos precisos de un perfil ICC de MHC para definir la operación de administración de colores de salida del kernel de visualización. Por lo tanto, solo SDR muestra que el fabricante o un proveedor de calibración de pantalla con un perfil válido son aptos para la administración automática de colores. Consulte Comportamiento del perfil icc con color avanzado para obtener más información.

Requisitos del sistema y compatibilidad con el sistema operativo

Windows 10, versión 1709, se envió por primera vez compatibilidad con colores avanzados para pantallas HDR. La versión Windows 11, versión 22H2, agrega compatibilidad con colores avanzados para pantallas SDR que tienen datos de aprovisionamiento precisos.

En este tema se supone que la aplicación tiene como destino Windows 10, versión 2004 (o posterior) para pantallas HDR y la versión Windows 11, versión 22H2 (o posterior) para pantallas SDR.

Pantalla

Una pantalla de alto rango dinámico debe implementar HDR10, o BT.2100 ST.2084, estándar. La calidad de la pantalla HDR puede variar considerablemente y recomendamos encarecidamente pantallas certificadas, como VESA DisplayHDR. A partir del Windows 11, versión 22H2, Windows muestra el estado de certificación de las pantallas conocidas en la aplicación Configuración.

Una pantalla de intervalo dinámico estándar debe tener datos de aprovisionamiento de colores precisos para la compatibilidad con colores avanzados. En el Windows 11, versión 22H2, el único método admitido para invalidar estos datos es a través de un perfil DE ICC de MHC; además, el usuario o el fabricante de la pantalla deben tener habilitada la administración automática de colores. Para obtener más información, consulta Comportamiento del perfil icc con color avanzado.

Procesador de gráficos (GPU)

Para obtener una funcionalidad completa de color avanzado en pantallas SDR y HDR, se requiere una GPU reciente:

  • Serie AMD Rx 400 (Polaris) o posterior
  • Serie NVIDIA GeForce 10 (Pascal) o posterior
  • Intel Core 10th gen (Ice Lake) seleccionado o versiones posteriores*

Nota:

Los conjuntos de chips de nombre de código Intel Comet Lake (código de modelo de 5 dígitos) no proporcionan funcionalidad completa.

Se pueden aplicar requisitos de hardware adicionales, en función de los escenarios, incluida la aceleración de códecs de hardware (HEVC de 10 bits, VP9 de 10 bits, etc.) y la compatibilidad con PlayReady (SL3000). Póngase en contacto con el proveedor de GPU para obtener información más específica.

Controlador de gráficos (WDDM)

Se recomienda encarecidamente el controlador de gráficos más reciente disponible, ya sea desde Windows Update o desde el sitio web del fabricante de GPU o del fabricante del equipo. Este tema se basa en la funcionalidad del controlador de WDDM 2.7 (Windows 10, versión 2004) para pantallas HDR y WDDM 3.0 (Windows 11, versión 21H2) para pantallas SDR.

API de representación admitidas

Windows 10 admite una amplia variedad de API y marcos de representación. La compatibilidad avanzada con colores se basa fundamentalmente en que la aplicación pueda realizar una presentación moderna mediante DXGI o las API de capa visual.

Por lo tanto, cualquier API de representación que pueda generar en uno de esos métodos de presentación puede admitir el color avanzado. Esto incluye (pero no está limitado a) lo siguiente.

  • Direct3D 11
  • Direct3D 12
  • Direct2D
  • Win2D
    • Requiere el uso de las API CanvasSwapChain o CanvasSwapChainPanel de nivel inferior.
  • Windows.UI.Input.Inking
    • Admite la representación de tinta seca personalizada mediante DirectX.
  • XAML
    • Admite la reproducción de vídeos HDR con MediaPlayerElement.
    • Admite la descodificación de imágenes XR JPEG mediante el elemento Image .
    • Admite la interoperabilidad de DirectX mediante SwapChainPanel.

Control de las funcionalidades de visualización dinámica

Windows 10 admite una enorme gama de pantallas compatibles con colores avanzados, desde paneles integrados eficientes hasta monitores de juegos de alto nivel y televisores. Los usuarios de Windows esperan que la aplicación controle sin problemas todas esas variaciones, incluidas las pantallas de SDR existentes ubicuas.

Windows 10 proporciona control sobre las funcionalidades HDR y Advanced Color para el usuario. La aplicación debe detectar la configuración de la pantalla actual y responder dinámicamente a los cambios en la funcionalidad. Esto puede ocurrir por muchas razones, por ejemplo, porque el usuario habilitó o deshabilitó una característica, o movió la aplicación entre diferentes pantallas o cambió el estado de energía del sistema.

Opción 1: AdvancedColorInfo

Nota:

AdvancedColorInfo Windows Runtime API se puede usar independientemente de la API de representación, admite pantallas de color avanzado para SDR y usa eventos para indicar cuándo cambian las funcionalidades. Sin embargo, solo está disponible para aplicaciones de Plataforma universal de Windows (UWP); las aplicaciones de escritorio (que no tienen coreWindow) no pueden usarlas. Para obtener más información, consulta Windows Runtime API no compatibles con aplicaciones de escritorio.

En primer lugar, obtenga una instancia de AdvancedColorInfo de DisplayInformation::GetAdvancedColorInfo.

Para comprobar qué tipo de color avanzado está activo actualmente, utilice la propiedad AdvancedColorInfo::CurrentAdvancedColorKind . Esa es la propiedad más importante que se va a comprobar y debe configurar la canalización de representación y presentación en respuesta al tipo activo:

Tipo de color avanzado Funcionalidades de visualización
SDR Visualización de SDR sin funcionalidades avanzadas de color
WCG Pantalla SDR con alta profundidad de bits y administración automática de colores
HDR Pantalla HDR con todas las funcionalidades avanzadas de color

Para comprobar qué tipos de colores avanzados se admiten, pero no necesariamente activos, llame a AdvancedColorInfo::IsAdvancedColorKindAvailable. Puede usar esa información, por ejemplo, para pedir al usuario que vaya a la aplicación Configuración de Windows para que pueda habilitar la administración de colores HDR o automático.

Los demás miembros de AdvancedColorInfo proporcionan información cuantitativa sobre el volumen de color físico del panel (luminancia y cromo), correspondiente a los metadatos HDR estáticos de SMPTE ST.2086. Aunque ST.2086 se diseñó originalmente para pantallas HDR, esa información es útil y está disponible para pantallas HDR y SDR. Debes usar esa información para configurar la asignación de tono de la aplicación y la asignación de gama.

Para controlar los cambios en las funcionalidades avanzadas de color, regístrese para el evento DisplayInformation::AdvancedColorInfoChanged . Ese evento se genera si cambia cualquier parámetro de las funcionalidades de color avanzado de la pantalla por cualquier motivo.

Controle ese evento mediante la obtención de una nueva instancia de AdvancedColorInfo y compruebe qué valores han cambiado.

IDXGIOutput6

Nota:

La interfaz IDXGIOutput6 de la infraestructura de gráficos de DirectX está disponible para cualquier aplicación que use DirectX, ya sea de escritorio o de Plataforma universal de Windows (UWP). Sin embargo, IDXGIOutput6no admite pantallas SDR con funcionalidades avanzadas de color, como la administración automática de colores; solo puede identificar pantallas HDR.

Si va a escribir una aplicación de escritorio Win32 y usa DirectX para representarla, use DXGI_OUTPUT_DESC1 para obtener funcionalidades de visualización. Obtenga una instancia de esa estructura a través de IDXGIOutput6::GetDesc1.

Para comprobar qué tipo de color avanzado está activo actualmente, use la propiedad ColorSpace , que es de tipo DXGI_COLOR_SPACE_TYPE y contiene uno de los siguientes valores:

DXGI_COLOR_SPACE_TYPE Funcionalidades de visualización
DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709 Visualización de SDR sin funcionalidades avanzadas de color
DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020 Pantalla HDR con todas las funcionalidades avanzadas de color

Nota:

Las pantallas SDR con funcionalidades de color avanzado también se notifican como DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709; DXGI no permite distinguir entre los dos tipos.

Nota:

DXGI no permite comprobar qué tipos de colores avanzados son compatibles, pero no activos en este momento.

La mayoría de los demás miembros de DXGI_OUTPUT_DESC1 proporcionan información cuantitativa sobre el volumen de color físico del panel (luminancia y cromo), correspondiente a los metadatos HDR estáticos de SMPTE ST.2086. Aunque ST.2086 se diseñó originalmente para pantallas HDR, esa información es útil y está disponible para pantallas HDR y SDR. Debes usar esa información para configurar la asignación de tono de la aplicación y la asignación de gama.

Las aplicaciones de escritorio win32 no tienen un mecanismo nativo para responder a los cambios de funcionalidad de color avanzado. En su lugar, si la aplicación usa un bucle de representación, debe consultar IDXGIFactory1::IsCurrent con cada fotograma. Si notifica FALSE, debe obtener un nuevo DXGI_OUTPUT_DESC1 y comprobar qué valores han cambiado.

Además, la bomba de mensajes Win32 debe controlar el mensaje de WM_SIZE , lo que indica que la aplicación podría haberse movido entre diferentes pantallas.

Nota:

Para obtener un nuevo DXGI_OUTPUT_DESC1, debe obtener la pantalla actual. Sin embargo, no debe llamar a IDXGISwapChain::GetContainingOutput. Esto se debe a que las cadenas de intercambio devuelven una salida DXGI obsoleta una vez DXGIFactory::IsCurrent es false; y volver a crear la cadena de intercambio para obtener una salida actual da como resultado una pantalla temporalmente negra. En su lugar, se recomienda enumerar los límites de todas las salidas de DXGI y determinar cuál tiene la mayor intersección con los límites de la ventana de la aplicación.

El código de ejemplo siguiente procede de la aplicación de ejemplo HDR de Direct3D 12 en GitHub.

// 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));

Configuración de la cadena de intercambio de DirectX

Una vez que haya determinado que la pantalla admite actualmente funcionalidades de color avanzado, configure la cadena de intercambio como se indica a continuación.

Uso de un efecto de modelo de presentación invertida

Al crear la cadena de intercambio mediante una de las clases CreateSwapChainFor[Hwnd|Composición|Los métodos CoreWindow] deben usar el modelo de volteo DXGI seleccionando la opción DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL o DXGI_SWAP_EFFECT_FLIP_DISCARD , lo que hace que la cadena de intercambio sea apta para el procesamiento avanzado de color de DWM y varias optimizaciones de pantalla completa. Para obtener más información, consulte Para obtener el mejor rendimiento, use el modelo de volteo DXGI.

Opción 1. Uso del formato de píxel FP16 y el espacio de color scRGB

Windows 10 admite dos combinaciones principales de formato de píxeles y espacio de colores para Color avanzado. Seleccione uno en función de los requisitos específicos de la aplicación.

Se recomienda que las aplicaciones de uso general usen la opción 1. Es la única opción que funciona para todos los tipos de pantallas de color avanzado, contenido y API de representación. Al crear la cadena de intercambio, especifique DXGI_FORMAT_R16G16B16A16_FLOAT en el DXGI_SWAP_CHAIN_DESC1. De forma predeterminada, una cadena de intercambio creada con un formato de píxel de punto flotante se trata como si usara el espacio de color DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709 . Ese es el mismo formato de píxeles y espacio de color que usa DWM.

Esta combinación proporciona el intervalo numérico y la precisión para especificar cualquier color físicamente posible y realizar un procesamiento arbitrario, incluida la combinación.

Sin embargo, esa opción consume 64 bits por píxel, lo que duplica el ancho de banda de GPU y el consumo de memoria en comparación con los formatos de píxeles UINT8 tradicionales. Además, scRGB usa valores numéricos que están fuera del intervalo normalizado [0, 1] para representar colores que están fuera de la gama sRGB o superior a 80 nits de luminancia. Por ejemplo, scRGB (1.0, 1.0, 1.0) codifica el blanco estándar D65 en 80 nits; pero scRGB (12.5, 12.5, 12.5) codifica el mismo blanco D65 en un 1000 nits mucho más brillante. Algunas operaciones de gráficos requieren un intervalo numérico normalizado y debe modificar la operación o volver a normalizar los valores de color.

La manera en que se interpretan los valores de luminancia con esa opción difiere entre las pantallas SDR y HDR; consulte a continuación.

Opción 2: Usar formato de píxeles UINT10/RGB10 y espacio de colores HDR10/BT.2100

La opción 2 es una optimización de rendimiento que solo está disponible si la aplicación cumple todas las condiciones siguientes:

  • Tiene como destino una pantalla HDR
  • Usa Direct3D 12 o Direct3D 11
  • La cadena de intercambio no requiere la combinación con alfa/transparencia

Si la aplicación no cumple todas esas condiciones, debes usar la opción 1.

Pero si la aplicación cumple los requisitos de la opción 2, esto podría proporcionar un mejor rendimiento si la aplicación consume contenido codificado en HDR10, como un reproductor de vídeo, o si se usará principalmente en escenarios de pantalla completa, como un juego. Al crear la cadena de intercambio, debe considerar la posibilidad de especificar DXGI_FORMAT_R10G10B10A2_UNORM en DXGI_SWAP_CHAIN_DESC1. De forma predeterminada, se trata como utilizando el espacio de colores sRGB; Por lo tanto, debes llamar explícitamente a IDXGISwapChain3::SetColorSpace1 y establecer como tu espacio de color DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020, también conocido como HDR10/BT.2100.

Esta opción consume los mismos 32 bits por píxel que los formatos de píxeles de SDR de UINT8 tradicionales. Además, en determinadas GPU, esto elimina algún procesamiento necesario para convertir el contenido al formato de conexión HDR10.

Usar una cadena de intercambio de color avanzada cuando la pantalla está en modo SDR

Puede usar una cadena de intercambio de color avanzado incluso si la pantalla no admite todas las funcionalidades de color avanzado. En esos casos, el Administrador de ventanas de escritorio (DWM) cambiará el contenido para que se ajuste a las funcionalidades de la pantalla realizando el recorte numérico. Por ejemplo, si se representa en una cadena de intercambio fp16 scRGB y se dirige a una pantalla estándar, se recorta todo lo que está fuera del intervalo numérico [0, 1].

Ese comportamiento de reducción de la inversión también se producirá si la ventana de la aplicación está estrabando dos o más pantallas con diferentes funcionalidades de color avanzadas. AdvancedColorInfo e IDXGIOutput6 se abstraen para notificar solo las características de la pantalla principal (principal que se define como la pantalla que contiene el centro de la ventana).

Hacer coincidir la referencia de la aplicación en blanco con el nivel de blanco de referencia de SDR del sistema operativo

Nota:

El blanco de referencia solo se aplica a las pantallas HDR; para las pantallas de color avanzado de SDR, (1.0, 1.0, 1.0) siempre significa la luminancia blanca máxima que la pantalla puede reproducir.

En muchos escenarios, la aplicación querrá representar contenido SDR y HDR; por ejemplo, representar subtítulos o controles de transporte sobre vídeo HDR o interfaz de usuario en una escena del juego. Es importante comprender el concepto de nivel blanco de referencia de SDR para asegurarse de que el contenido de SDR sea correcto en una pantalla HDR. El blanco de referencia indica el brillo en el que aparece un objeto blanco difuso (como una hoja de papel o a veces ui) en una escena HDR. Dado que los valores de color HDR tienen brillo al que se hace referencia a la escena, se debe mostrar un valor de color determinado en un nivel de luminancia absoluto y no en relación con el valor máximo posible del panel. Por ejemplo, scRGB (1.0, 1.0, 1.0) y HDR10 (497, 497, 497) codifican exactamente blanco D65 en 80 nits luminancia. Windows permite al usuario ajustar el nivel blanco de referencia de SDR a su preferencia; es la luminancia en la que Windows representará sRGB (1.0, 1.0, 1.0). En los monitores HDR de escritorio, los niveles blancos de referencia de SDR normalmente se establecen en alrededor de 200 nits.

La aplicación HDR debe permitir al usuario establecer su nivel blanco de referencia deseado o leer el valor configurado por el sistema. Debe asignar los valores de color blanco difusos de la escena al nivel blanco de referencia de SDR. Esto implica multiplicar el búfer de fotogramas de la aplicación en el espacio gamma lineal.

Nota:

En una pantalla que admite un control de brillo, como en un portátil, Windows también ajusta la luminancia del contenido HDR (a la que se hace referencia a la escena) para que coincida con el nivel de brillo deseado del usuario, pero eso es invisible para la aplicación. A menos que estés intentando garantizar una reproducción bit precisa de la señal HDR, generalmente puedes ignorarlo.

Si la aplicación siempre representa SDR y HDR en superficies independientes y se basa en la composición del sistema operativo, Windows realizará automáticamente el ajuste correcto para aumentar el contenido de SDR al nivel de blanco deseado. Por ejemplo, si la aplicación usa XAML y representa el contenido HDR en su propio SwapChainPanel.

Sin embargo, si tu aplicación realiza su propia composición de contenido SDR y HDR en una sola superficie, entonces eres responsable de realizar el ajuste de nivel blanco de referencia de SDR tú mismo. De lo contrario, el contenido de SDR podría aparecer demasiado atenuado en condiciones típicas de visualización de escritorio. En primer lugar, debe obtener el nivel de blanco de referencia de SDR actual y, a continuación, debe ajustar los valores de color de cualquier contenido de SDR que esté representando.

Paso 1. Obtención del nivel blanco de referencia de SDR actual

Puede obtener el nivel blanco de referencia de SDR actual de una de estas maneras:

Paso 2. Ajuste de los valores de color del contenido de SDR

Windows define el nivel de blanco nominal o predeterminado en 80 nits. Por lo tanto, si fuera a representar un sRGB estándar (1.0, 1.0, 1.0) blanco en una cadena de intercambio FP16, se reproduciría en 80 nits luminancia. Para que coincida con el nivel de blanco de referencia definido por el usuario real, debe ajustar el contenido de SDR de 80 nits al nivel especificado a través de AdvancedColorInfo.SdrWhiteLevelInNits.

Si va a representar con FP16 y scRGB, o cualquier espacio de color que use gamma lineal (1,0), simplemente puede multiplicar el valor de color SDR por AdvancedColorInfo.SdrWhiteLevelInNits / 80. Si usa Direct2D, hay una constante predefinida D2D1_SCENE_REFERRED_SDR_WHITE_LEVEL, que tiene un valor de 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;

Si estás representando con un espacio de color gamma no lineal, como HDR10, realizar un ajuste de nivel blanco de SDR es más complejo. Si está escribiendo su propio sombreador de píxeles, considere la posibilidad de convertir en gamma lineal para aplicar el ajuste.

Adaptación del contenido HDR a las funcionalidades de la pantalla mediante la asignación de tono

Las pantallas HDR y Advanced Color varían considerablemente en términos de sus capacidades. Por ejemplo, en la luminancia mínima y máxima y la gama de colores que son capaces de reproducirse. En muchos casos, el contenido HDR contendrá colores que superen las capacidades de la pantalla. Para obtener la mejor calidad de imagen, es importante que realices una asignación de tono HDR, comprimiendo esencialmente la gama de colores para adaptarte a la pantalla, a la vez que conserva mejor la intención visual del contenido.

El parámetro único más importante para adaptarse es la luminancia máxima, también conocida como MaxCLL (nivel de luz de contenido); Los asignadores de tono más sofisticados también adaptarán la luminancia mínima (MinCLL) o los colores principales.

Paso 1. Obtención de las funcionalidades de volumen de color de la pantalla

Aplicaciones de la Plataforma universal de Windows (UWP)

Use AdvancedColorInfo para obtener el volumen de color de la pantalla.

Aplicaciones DirectX de Win32 (escritorio)

Use DXGI_OUTPUT_DESC1 para obtener el volumen de color de la pantalla.

Paso 2. Obtener la información del volumen de color del contenido

Dependiendo de dónde procede el contenido HDR, hay varias formas posibles de determinar su información de la luminaria y la gama de colores. Algunos archivos de imagen y vídeo HDR contienen metadatos de SMPTE ST.2086. Si el contenido se representa dinámicamente, es posible que pueda extraer información de la escena de las fases de representación internas, por ejemplo, la fuente de luz más brillante de una escena.

Una solución más general pero costosa de cálculo es ejecutar un histograma u otro paso de análisis en el marco representado. La aplicación de ejemplo de representación avanzada de imágenes de color de Direct2D en GitHub muestra cómo hacerlo mediante Direct2D; a continuación se incluyen los fragmentos de código más relevantes:

// 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;
}

Paso 3. Realizar la operación de tono HDR

El tono es inherentemente un proceso de pérdida y se puede optimizar para una serie de métricas perceptuales o objetivas, por lo que no hay ningún algoritmo estándar único. Windows proporciona un efecto integrado de tono HDR como parte de Direct2D, así como en la canalización de reproducción de vídeo HDR de Media Foundation. Algunos otros algoritmos usados habitualmente incluyen ACES Filmic, Reinhard y ITU-R BT.2390-3 EETF (función de transferencia eléctrica).

En este ejemplo de código siguiente se muestra un operador Reinhard tonemapper simplificado.

// 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;
}

Captura de contenido de pantalla HDR y WCG

Las API que admiten la especificación de formatos de píxeles, como las del espacio de nombres Windows.Graphics.Capture , y el método IDXGIOutput5::D uplicateOutput1 , proporcionan la capacidad de capturar contenido HDR y WCG sin perder información de píxeles. Tenga en cuenta que después de adquirir fotogramas de contenido, se requiere procesamiento adicional. Por ejemplo, la asignación de tono HDR a SDR (por ejemplo, copia de captura de pantalla de SDR para el uso compartido de Internet) y el guardado de contenido con el formato adecuado (por ejemplo, JPEG XR).

Cambios en la administración de colores heredada y el comportamiento del perfil ICC

La administración avanzada de colores y colores automáticos garantizan un color de visualización coherente y colorimétricomente preciso para todas las aplicaciones, heredadas y modernas. Sin embargo, algunas aplicaciones pueden realizar su propia administración de colores explícita mediante perfiles de color international Color Consortium (ICC).

Cuando el color avanzado está activo en pantallas SDR o HDR, el comportamiento de los perfiles icc cambia de maneras no compatibles con versiones anteriores. Si la aplicación funciona con perfiles de ICC para mostrar, Windows ofrece asistentes de compatibilidad para asegurarse de que la aplicación sigue teniendo un comportamiento correcto.

Más información sobre los cambios en el comportamiento del perfil icc y cómo puedes adaptar tu aplicación para maximizar la compatibilidad con el color avanzado, consulta comportamiento del perfil ICC con color avanzado.

Recursos adicionales