Pipeline de calibragem de cores de exibição de hardware do Windows

Este tópico aborda a calibragem de cores de exibição usando um novo pipeline de transformação de cores de exibição de GPU compatível com o Windows 10, versão 2004 (20H1) e posterior. O pipeline fornece uma precisão de cor significativamente aprimorada em relação aos caminhos existentes, como o pipeline de rampa gama GDI, e adiciona suporte para telas HDR.

Este tópico é para fabricantes de vídeo e computador e provedores de calibragem de vídeo que desejam calibrar melhor as telas de seus clientes. A maioria dos aplicativos do Windows não precisa fazer nada para se beneficiar do pipeline; mas se você desenvolver aplicativos gerenciados por cores, talvez queira estar ciente de como essa tecnologia funciona.

O novo pipeline de cores estará disponível para qualquer exibição se a GPU atender aos requisitos do sistema. Se a tela for HDR ou usar o gerenciamento automático de cores, haverá considerações e requisitos adicionais. que pode ser encontrado em Usar DirectX com Cor Avançada em exibições de intervalo dinâmico de alto/padrão.

Introdução

A calibragem de cores de exibição é o processo de garantir que uma exibição corresponda com precisão ao espaço de cor relatado; por exemplo, sRGB ou DCI-P3 D65. Devido a variações no processo de fabricação e em outras fontes, um painel de exibição individual pode se desviar de sua especificação. Depois que uma exibição tiver sido calibrada, seus aplicativos e conteúdo poderão direcionar com confiança o espaço de cores da exibição sem se preocupar com essa variabilidade ou imprecisão.

Em um alto nível, a calibragem de cores de exibição envolve estas etapas:

  1. Execute medidas ópticas da saída de cor real de uma exibição ao renderizar um conjunto de valores de cores conhecidos.
  2. Com base nos dados de medida, gere uma transformação de cor que corrija as imprecisões na exibição e gere metadados que descrevam o volume de cores resultante da exibição.
  3. Armazene os dados de transformação de cores e exiba metadados para uso posterior.
  4. Em runtime, carregue e aplique a transformação de cor ao cofre de quadros de exibição (valores de cor enviados para a exibição) e relate os metadados de exibição aos aplicativos.

O Windows 10, versão 2004, fornece funcionalidade aprimorada para as etapas 3 e 4, enquanto os fabricantes de vídeo e os provedores de calibragem são responsáveis pelas etapas 1 e 2.

Requisitos do sistema

O novo pipeline de transformação de cores requer uma GPU e um driver de exibição compatíveis. As arquiteturas de GPU com suporte incluem:

  • AMD:
    • AMD RX 500 Série 400 ou posterior
    • Processadores AMD Ryzen com elementos gráficos Radeon
  • Intel:
    • Integrado: GPU intel de 10ª geração (Ice Lake) ou posterior
    • Discreto: Intel DG1 ou posterior
  • NVIDIA GTX 10xx ou posterior (Pascal+)
  • Qualcomm 8CX Gen 3 ou posterior; 7C Gen 3 ou posterior

Observação

Não há suporte para chipsets Comet Lake (código de modelo de cinco dígitos) intel.

Um driver WDDM (Windows Display Driver Model) 2.6 ou posterior é necessário (lançado com o Windows 10, versão 1903). Alguns fornecedores de GPU precisam de um driver mais recente, potencialmente tão novo quanto o WDDM 3.0 (lançado com Windows 11, versão 21H2).

Consulte Novas APIs de gerenciamento de perfil ICC de exibição para obter informações sobre como um aplicativo pode determinar se o novo pipeline de transformação de cores está disponível em um sistema.

Novo pipeline de transformação de cores de GPU

O Windows 10, versão 2004, expõe um pipeline de transformação de cores de exibição acelerada por GPU que consiste em uma matriz de cores gama linear e 1DLUT. Em comparação com o pipeline de rampa gama existente, ele oferece precisão, precisão e suporte superiores para exibições de gama de cores largas. Além disso, ele adiciona suporte para novas tecnologias, como telas HDR que usam sinalização BT.2100.

O pipeline não é diretamente programável por aplicativos e, em vez disso, é exposto somente por meio de perfis MHC; veja abaixo para obter mais detalhes. Outros recursos do so (sistema operacional), como luz noturna, também podem usar esse pipeline, e o sistema operacional gerencia como compartilhar (redigir) e/ou racionalizar o acesso ao pipeline entre vários cenários.

Descrição do pipeline de transformação de cores

O pipeline de transformação de cores baseia-se no modelo conceitual padrão para conversões de espaço em cores:

diagrama de bloco: degamma de origem, matriz de cores, regamma de destino

O modelo pode converter entre dois espaços de cor RGB (ou outros de 3 canais), como sRGB para P3 D65. Ele também pode corrigir os tipos mais comuns de variação de cor do painel.

O pipeline de transformação de cores do Windows usa o modelo conceitual, expande os estágios 2 (matriz de cores) e 3 (regamma de destino) em sub-estágios e expõe um subconjunto dos estágios (2b e 3b, em verde) para os aplicativos programar, deixando o restante (branco) controlado pelo driver:

diagrama de bloco: degamma de origem; matriz de cores decomposta em RGB de origem para XYZ, XYZ para XYZ e XYZ para RGB de destino; regamma de destino decomposto em função de transferência eletrônica, ajuste de 1DLUT

Essas modificações permitem que o pipeline de cores seja independente do espaço de cor do conteúdo de origem, o que pode mudar de quadro para quadro. Além disso, ele melhora a compatibilidade com espaços de cor de exibição, como BT.2100 ST.2084, que exigem otimizações opacas para preservar a precisão.

Estágio 0: origem (entrada gráfica)

A entrada é o framebuffer renderizado do sistema operacional. Ele pode estar em um dos vários espaços de cores, dependendo do cenário, incluindo sRGB, sYCC, HDR10 ou scRGB, e pode mudar de quadro para quadro.

Estágio 1: Degamma de origem

O driver de exibição converte automaticamente o conteúdo de origem em gama linear e esse estágio não é programável por aplicativos.

Estágio 2: matriz de conversão de espaço em cores

No modelo de conversão de espaço de cor padrão, o estágio de matriz pode ser dividido em três matrizes, que são compostas (multiplicadas) juntas:

  • 2a: Converter do espaço de cor RGB do conteúdo de origem (gama linear) em um espaço de cor absoluto; no pipeline do Windows, o espaço de cor absoluto é CIEXYZ.

  • 2b: Execute quaisquer ajustes no espaço CIEXYZ, como calibragem.

  • 2c: Converter de CIEXYZ para o espaço de cor RGB de destino (gama linear). O espaço de cor RGB de destino é definido como a codificação usada ao transmitir cores sobre o fio de exibição, normalmente as primárias BT.709 ou BT.2020. Não são as primárias reais e medidas do painel físico.

A matriz 2a é determinada pelo conteúdo de origem e a matriz 2c é determinada pelo modo de sinalização da exibição; somente a matriz 2b é acessível para aplicativos. O driver multiplica os três juntos para gerar a matriz real a ser executada no hardware:

FinalMatrix = SourceRGBtoXYZ * XYZtoXYZAdjust * XYZtoTargetRGB

Observação

Como o driver de exibição é responsável pelo RGB de origem para XYZ e tem como destino conversões XYZ para RGB, a matriz que você programa (estágio 2b) também não deve incluir.

Exemplo 1: Se você não estiver executando nenhum ajuste nas cores (passagem), sua matriz deverá ser identidade, independentemente do tipo de exibição para o qual você está gerando saída.

Exemplo 2: Se você estiver fazendo a saída para uma exibição SDR P3 D65 e estiver implementando um perfil de "revisão de sRGB" que emula sRGB no painel, sua matriz deverá consistir em uma rotação de primárias de sRGB para P3 D65.

Estágio 3: ReGamma de destino

Esse estágio pode ser dividido em dois RGB 1DLUTs, que são compostos juntos:

  • 3a: Codifique os dados RGB lineares do estágio 2c para a função de transferência/gama do sinal sobre o fio de exibição.

  • 3b: Execute quaisquer ajustes no espaço gama de destino, como calibragem.

1DLUT 3a é determinado pelo espaço de cor do formato de fio de exibição; geralmente é sRGB para telas SDR e ST.2084 para telas HDR. 3b é programável por aplicativos e ocorre depois que a função de transferência de formato de transmissão é aplicada. O driver compõe os dois 1DLUTs para gerar o 1DLUT real a ser executado no hardware:

Final1DLUT = Adjustment1DLUT(TargetReGamma(input))

Observação

Como o driver é responsável por programar a função de transferência de sinal de exibição, o 1DLUT que você programa (3b) não deve incluir essa codificação. Por exemplo, se você não estiver executando nenhum ajuste nas cores (passagem), o 1DLUT deverá ser a identidade, independentemente do espaço de cor do formato de fio de exibição.

Estágio 4: Destino (saída para verificação)

Este é o cofre de quadros a ser verificado sobre o fio pela GPU; no espaço de cores nativo da tela e depois de todos os ajustes que você programou. Operações adicionais, como a codificação YCbCr, podem ocorrer posteriormente.

Precisão e precisão mais altas

A funcionalidade de estágio de matriz gama linear (ajuste de XYZ para XYZ) foi introduzida no Windows 10, versão 1709. A funcionalidade permite que você execute ajustes em primárias de cores e ponto branco, bem como conversões arbitrárias de espaço em cores RGB.

O estágio de ajuste 1DLUT é conceitualmente semelhante à rampa gama existente 1DLUT, mas oferece precisão aprimorada, com até 4096 entradas LUT em precisão de ponto fixo de até 16 bits.

Observação

Nem todo hardware dá suporte à contagem completa de entradas ou precisão exposta pelo pipeline de cores.

Suporte para telas HDR (BT.2100)

Uma limitação do pipeline de rampa gama existente é que ele tem um comportamento indefinido quando a tela está usando a sinalização HDR (BT.2100 ST.2084). O novo pipeline de transformação de cores dá suporte explicitamente à sinalização SDR (BT.1886 ou sRGB) e à sinalização HDR e é dimensionado para dar suporte a espaços de cor de formato de fio futuros. Ele faz isso por meio dos estágios "XYZ to Target RGB" e "Wire transfer function" (blue) no diagrama de bloco:

diagrama de bloco identificando xyz para direcionar os estágios de função rgb e transferência eletrônica

Esses dois estágios, que são controlados automaticamente pelo driver, são responsáveis por codificar cores no espaço de cores do formato de fio: por exemplo, sRGB ou BT.2020 ST.2084.

Portanto, ao programar o pipeline de transformação de cores, você obtém um comportamento bem definido com base no espaço de cores do formato de fio ativo da exibição.

Nova marca "MHC2" para perfis ICC

O Windows não fornece uma API para controlar diretamente o novo pipeline de transformação de cores no runtime. Em vez disso, seu aplicativo acessa o pipeline escrevendo um perfil de cor do ICC (International Color Consortium) formatado corretamente com dados extras armazenados em uma nova marca privada "Calibragem de Hardware da Microsoft" ("MHC2"). É um modelo semelhante ao pipeline de rampa gama existente, que usa marcas ICC privadas "VCGT". Perfis ICC com dados de marca MHC2 válidos são chamados de "perfis MHC ICC" ou "perfis MHC".

Observação

MHC2 refere-se à segunda versão da marca privada, que está disponível para todos os dispositivos Windows 10, versão 2004; MHC1 enviado em uma versão anterior do Windows com PCs OEM específicos.

Metadados estáticos do ST.2086 HDR complementares

Além de programar o novo pipeline de transformação de cores, os perfis do MHC ICC também contêm metadados estáticos do HDR ST.2086. Esses são valores que descrevem o intervalo dinâmico (luminância) e a gama de cores de uma exibição. Eles são amplamente implementados com telas HDR, mas são úteis para qualquer exibição. Os valores são:

  • Luminância de pico (nits)
  • Luminância máxima de quadro completo (nits)
  • Luminância mínima (nits)
  • Primárias de cores RGB (coordenadas xy)
  • Ponto em branco (coordenadas xy)

O ponto branco, a luminância máxima de quadro completo e as primárias de cores RGB são descritos usando marcas PADRÃO ICC. O pico e a luminância mínima são descritos na marca MHC2. Um perfil deve conter todas essas informações para o sistema operacional aceitar o perfil e usá-lo para cenários de Cor Avançada.

O Windows racionaliza metadados ST.2086 de várias fontes, incluindo o perfil do MHC ICC, o driver gráfico e o firmware EDID ou DisplayID. Os perfis do MHC ICC são tratados como a fonte mais confiável e substituirão outras fontes. O Windows expõe essas informações por meio das APIs de funcionalidade hdr, conforme descrito em Usar DirectX com Cor Avançada em telas de alto/padrão de intervalo dinâmico— dessa forma, os aplicativos HDR recebem as melhores informações de exibição hdr disponíveis.

Definição de luminância ST.2086 para exibições de luz de fundo ajustável

Uma exibição pode ter uma luz de fundo ajustável, por exemplo, controlada pelo usuário ou controlada automaticamente por um sensor de luz ambiente. Isso introduz ambiguidade com a forma como os valores de luminância ST.2086 devem ser interpretados.

Para exibições em que o Windows tem controle sobre a luz de fundo (normalmente para laptops e dispositivos de painel integrados), os valores de luminância devem descrever quando essa luz de fundo controlada pelo sistema operacional está em sua configuração máxima ou mais brilhante.

Para exibições em que o Windows não tem controle sobre a luz de fundo (normalmente para monitores externos), os valores de luminância são precisos apenas para o estado de exibição no momento da medição.

Requisitos de perfil do ICC

Um perfil do MHC ICC deve usar a especificação ICC versão 2 (ICC.1:2001-04) ou a versão 4 (ICC.1:2010-12/ISO 15076-1:2010). Um perfil do MHC ICC deve ser um perfil de dispositivo de exibição.

Um perfil do MHC ICC pode incluir dados de pipeline de transformação de cores. As partes da estrutura MHC2 que definem a transformação de cor podem estar vazias, o que indica explicitamente uma transformação de identidade.

Um perfil do MHC ICC deve incluir metadados ST.2086. Um perfil que contém apenas metadados ST.2086 e nenhum dado de transformação é usado para cenários de calibragem de exibição hdr– nesse caso, a calibragem do HDR significa fornecer informações mais precisas de luminância mínima/máxima e gama de cores para aplicativos e jogos HDR.

Reutilização de marcas públicas existentes

Os perfis do MHC ICC usam marcas públicas existentes para definir alguns dos valores de metadados st.2086. Todas essas marcas já são necessárias para exibir perfis de dispositivo. Definições de marca e tipo de dados podem ser encontradas nas especificações do ICC.

Nome da marca Tipo de dados Valor st.2086 Unidade relatada pelo Windows
redColorantTag XYZNumber Primário vermelho Chromaticity (xy)
greenColorantTag XYZNumber Primária verde Chromaticity (xy)
blueColorantTag XYZNumber Primário azul Chromaticity (xy)
mediaWhitePointTag XYZNumber Ponto branco Chromaticity (xy)
luminanceTag XYZNumber Luminância máxima de quadro completo Luminância (nits)

Definição de marca privada "MHC2"

Um perfil do MHC ICC deve conter uma estrutura de marcas MHC2. A matriz e os elementos de transformação de cor 1DLUT podem ser definidos como 0 (NULL), o que indica explicitamente uma transformação de identidade para o respectivo estágio. Os valores de metadados ST.2086 devem ser preenchidos com dados válidos.

Posição de byte Comprimento do campo (bytes) Conteúdo Tipo de dados
0 a 3 4 Assinatura do tipo 'MHC2' (4D484332h) MHC2Type
4 a 7 4 Deslocamento para o início do elemento de dados de marca uInt32Number
8 a 13 4 Tamanho do elemento de dados de marca uInt32Number

Definição da estrutura MHC2Type

Posição de byte Comprimento do campo (bytes) Conteúdo Tipo de dados
0 a 3 4 Assinatura do tipo 'MHC2' (4D484332h)
4 a 7 4 Reservado, definido como 0
8 a 11 4 Número de entradas 1DLUT (4096 ou menos) [1]
OPCIONAL: 0 = Transformação de Identidade
uInt32Number
12 a 15 4 ST.2086 min luminance in nits S15Fixed16Number
16 a 19 4 Luminância de pico st.2086 em nits S15Fixed16Number
20 a 23 4 Deslocamento em bytes para matriz [2]
OPCIONAL: 0 = Transformação de Identidade
uInt32Number
24 a 27 4 Deslocamento em bytes para vermelho 1DLUT [2] uInt32Number
28 a 31 4 Deslocamento em bytes para 1DLUT verde [2] uInt32Number
32 a 35 4 Deslocamento em bytes para azul 1DLUT [2] uInt32Number

[1] O sistema operacional interpolará os dados para a contagem de entradas com suporte de hardware.

[2] Os deslocamentos dentro da estrutura MHC2Type são relativos ao início da estrutura, não ao arquivo.

Definição de matriz

Posição de byte Comprimento do campo (bytes) Conteúdo Tipo de dados
0 a 23 24 Matriz de ajuste 3x4 XYZ para XYZ
armazenada na ordem principal da linha, a coluna 4 é ignorada [1]
s15Fixed16Number

[1] A estrutura de matriz é dimensionada para ajustar 12 elementos para uma matriz 3x4 na ordem principal da linha. No entanto, o Windows usa apenas dados das três colunas esquerdas, definindo efetivamente uma matriz 3x3. Por exemplo, armazenar esses 12 valores em ordem linear:

[a, b, c, 0, d, e, f, 0, g, h, i, 0]

produz a seguinte matriz:

Primeira coluna Segunda Coluna Terceira Coluna
um b c
d e f
g h i

Observação

Conforme descrito na matriz de conversão de espaço em cores, não inclua o RGB de origem para XYZ ou XYZ para direcionar transformações de matriz RGB, pois elas são tratadas automaticamente pelo driver. O RGB de destino é definido como a codificação usada ao transmitir cores pelo fio de exibição; normalmente bt.709 ou bt.2020 primárias.

Definição de 1DLUT

Posição de byte Comprimento do campo (bytes) Conteúdo Tipo de dados
0 a 3 4 Assinatura do tipo 'sf32' (73663332h)
4 a 7 4 Reservado, definido como 0
8 para terminar Variável (0 a 16384) Valores lut de calibragem normalizados para [0,0, 1,0] s15Fixed16Number

Observação

Conforme descrito em ReGamma de destino, esse LUT opera no espaço de cor de formato de fio depois que a função de transferência é codificada.

Observação

Se as medidas ou a curva de calibragem precisarem de menos de 4096 entradas LUT, armazene apenas a contagem de entradas de que você realmente precisa e especifique a contagem na estrutura MHC2Type. Por exemplo, o LUT de identidade mais simples requer apenas duas entradas definidas como 0.0 e 1.0. O sistema operacional será interpolado para a contagem de entradas com suporte de hardware.

Novas APIs de gerenciamento de perfil do ICC de exibição

Observação

As diretrizes nesta seção se aplicam a qualquer perfil icc de exibição, independentemente de conter ou não dados MHC.

Depois de gerar um perfil do MHC ICC, você o provisionará no sistema Windows para a exibição de destino. Em versões anteriores do Windows, você usaria funções de gerenciamento de perfil do WCS (Sistema de Cores do Windows) para fazer isso. Embora você possa continuar a usar essas APIs existentes, o Windows 10, versão 2004, adiciona um conjunto de APIs novas e modernizadas ao WCS especializadas para gerenciar perfis de cores do ICC de exibição. Todas essas APIs são prefixadas com "ColorProfile":

  • ColorProfileAddDisplayAssociation
  • ColorProfileRemoveDisplayAssociation
  • ColorProfileSetDisplayDefaultAssociation
  • ColorProfileGetDeviceCapabilities

Observação

A API acima fornece uma funcionalidade para a qual não há equivalente à API do WCS existente.

  • ColorProfileGetDisplayList
  • ColorProfileGetDisplayDefault
  • ColorProfileGetDisplayUserScope

Um fluxo de trabalho típico usando as APIs ColorProfile para provisionar um perfil do MHC ICC no sistema é:

  1. Use ColorProfileGetDeviceCapabilities para determinar se o sistema dá suporte ao novo pipeline de transformação de cores. Mesmo que não o faça, ainda pode ser benéfico provisionar o perfil para fornecer metadados complementares st.2086.
  2. Use InstallColorProfile (uma API WCS existente) para instalar o perfil de cores. Isso adiciona o perfil à lista de perfis disponíveis para uso no sistema.
  3. Use ColorProfileGetDisplayUserScope para determinar se o usuário do Windows substituiu as associações de perfil padrão do sistema e está usando suas próprias listas de associação por usuário.
  4. Use ColorProfileAddDisplayAssociation para associar o perfil de cor a uma exibição (tornar um perfil instalado selecionável para essa exibição) e, opcionalmente, definir o perfil como padrão (o perfil ativo no momento).

Carregador avançado de calibragem de exibição do Windows

O Windows oferece um carregador de calibragem de cor de exibição de caixa de entrada desde o Windows 7. Esse carregador de calibragem dá suporte à leitura de perfis ICC com dados de pipeline de rampa gama armazenados em marcas de perfil DO ICC privadas VCGT ou MS00. O carregador de rampa de gama deve ser ativado explicitamente chamando WcsSetCalibrationManagementState.

O Windows 10, versão 2004, aprimora o carregador de calibragem de caixa de entrada adicionando suporte para perfis DO MHC ICC e o novo pipeline de transformação de cores. Escrever e provisionar um perfil do MHC ICC e fazer com que o carregador do Windows aplique seu estado é o único método para os aplicativos acessarem o pipeline de transformação de cores: não há APIs de acesso direto. Ao contrário dos perfis de rampa gama , a leitura dos perfis do MHC ICC é sempre habilitada, portanto, uma vez que um perfil do MHC ICC é definido como padrão em um sistema compatível, seu estado de calibragem é carregado automaticamente.

Cenários de Cores Avançadas e HDR com gerenciamento automático de cores do sistema

Novas tecnologias de Cores Avançadas, como HDR e gerenciamento automático de cores, adicionam novos recursos ao Windows, incluindo precisão de cor superior e acesso a gamas de cores de exibição muito maiores; para obter mais informações, consulte Usar DirectX com Cor Avançada em telas de intervalo dinâmico de alto/padrão.

O gerenciamento avançado de cores e cores automáticas garante uma cor de exibição consistente e colorimétricamente precisa para todos os aplicativos: herdados e modernos. No entanto, alguns aplicativos podem executar seu próprio gerenciamento explícito de cores usando perfis de cores do ICC (International Color Consortium).

Quando a Cor Avançada está ativa em exibições de SDR ou HDR, o comportamento de exibir perfis ICC muda de maneiras não compatíveis com versões anteriores. Se seu aplicativo funcionar com perfis ICC de exibição, o Windows oferecerá comportamentos de compatibilidade para garantir que seu aplicativo continue a obter o comportamento correto.

Para obter informações sobre as alterações no comportamento do perfil DO ICC e como você pode adaptar seu aplicativo para maximizar a compatibilidade com a Cor Avançada, consulte o comportamento do perfil DO ICC com Cor Avançada.