Compartilhar via


Pipeline de calibração 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 Windows 10, versão 2004 (20H1) e posterior. O pipeline fornece precisão de cores significativamente aprimorada em relação aos caminhos existentes, como o pipeline de rampa de gama GDI, e adiciona suporte para exibições HDR.

Este tópico é destinado a fabricantes de monitores e PCs e provedores de calibração de monitores que desejam calibrar melhor os monitores de seus clientes. A maioria dos aplicativos do Windows não precisa fazer nada para se beneficiar do pipeline; Mas se você desenvolve aplicativos gerenciados por cores, talvez queira estar ciente de como essa tecnologia funciona.

O novo pipeline de cores está 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 Use DirectX com Cor Avançada em exibições de faixa dinâmica alta/padrão.

Introdução

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

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

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

Windows 10, versão 2004 fornece funcionalidade aprimorada para as etapas 3 e 4, enquanto os fabricantes de exibição e 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 capazes. As arquiteturas de GPU suportadas incluem:

  • AMD:
    • AMD RX 500 Série 400 ou posterior
    • Processadores AMD Ryzen com gráficos Radeon
  • Inteligência:
    • 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

Os chipsets Intel codinome Comet Lake (código de modelo de 5 dígitos) não são suportados.

É necessário um driver WDDM (Modelo de Driver de Exibição) 2.6 ou posterior (lançado com 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 da GPU

Windows 10, versão 2004 expõe um pipeline de transformação de cores de exibição acelerado 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 exatidão, precisão e suporte superiores para exibições de ampla gama de cores. Além disso, adiciona suporte para novas tecnologias, como monitores HDR que usam sinalização BT.2100.

O pipeline não é programável diretamente por aplicativos e, em vez disso, é exposto apenas por meio de perfis MHC; veja abaixo para mais detalhes. Outros recursos do sistema operacional (SO), como luz noturna, também podem usar esse pipeline, e o sistema operacional gerencia como compartilhar (compor) 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 é baseado no modelo conceitual padrão para conversões de espaço de cores:

Diagrama de blocos: degamma de origem, matriz de cores, regamma de destino

O modelo pode converter entre quaisquer dois espaços de cores RGB (ou outros 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 (regama de destino) em subestágios e expõe um subconjunto dos estágios (2b e 3b, em verde) para os aplicativos programarem, deixando o restante (branco) controlado pelo driver:

diagrama de blocos: degama de origem; matriz de cores decomposta em RGB de origem para XYZ, XYZ para XYZ e XYZ para RGB de destino; regamma alvo decomposto em função de transferência de fio, ajuste de 1DLUT

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

Estágio 0: Fonte (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 quadro a quadro.

Estágio 1: Fonte DeGamma

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.

Etapa 2: Matriz de conversão de espaço de cores

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

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

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

  • 2c: Converta de CIEXYZ para o espaço de cores RGB de destino (gama linear). O espaço de cores RGB de destino é definido como a codificação usada ao transmitir cores pelo fio de exibição, normalmente BT.709 ou BT.2020 primários. 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 do monitor; Somente a matriz 2b é acessível aos 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 pelas conversões de origem RGB para XYZ e XYZ para RGB de destino, a matriz que você programa (estágio 2b) também não deve incluir.

Exemplo 1: Se você não estiver realizando ajustes nas cores (passagem), sua matriz deverá ser a identidade, independentemente do tipo de exibição para a qual você está enviando.

Exemplo 2: se você estiver enviando para uma exibição SDR P3 D65 e estiver implementando um perfil de "prova sRGB" que emula sRGB no painel, sua matriz deverá consistir em uma rotação primária de sRGB para P3 D65.

Estágio 3: Target ReGamma

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

  • 3a: Codifique os dados RGB lineares do stage 2c na função de transferência/gama do sinal pelo fio de exibição.

  • 3b: Execute quaisquer ajustes no espaço gama alvo, como calibração.

1DLUT 3a é determinado pelo espaço de cores do formato do fio de exibição; mais comumente é sRGB para monitores SDR e ST.2084 para monitores HDR. 3b é programável por aplicativos e ocorre após a aplicação da função de transferência de formato de fio. 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 realizando ajustes nas cores (passagem), sua 1DLUT deverá ser identidade, independentemente do espaço de cores do formato do fio de exibição.

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

Este é o framebuffer a ser verificado pela GPU; no espaço de cores nativo da tela e após quaisquer ajustes que você tenha programado. Operações adicionais, como a codificação YCbCr, podem ocorrer posteriormente.

Maior precisão e exatidão

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

O estágio de ajuste 1DLUT é conceitualmente semelhante à rampa gama 1DLUT existente, mas oferece precisão aprimorada, com até 4096 entradas LUT com 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 monitores HDR (BT.2100)

Uma limitação do pipeline de rampa gama existente é que ele tem um comportamento indefinido quando a exibição está usando a sinalização HDR (BT.2100 ST.2084). O novo pipeline de transformação de cores oferece suporte explícito à sinalização SDR (BT.1886 ou sRGB) e HDR e é dimensionado para oferecer suporte a futuros espaços de cores de formato de fio. Ele faz isso por meio dos estágios "XYZ para RGB de destino" e "Função de transferência de fio" (azul) no diagrama de blocos:

Diagrama de blocos que identifica XYZ para direcionar RGB e estágios de função de transferência de fio

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 do 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 tag "MHC2" para perfis ICC

O Windows não fornece uma API para controlar diretamente o novo pipeline de transformação de cores em runtime. Em vez disso, seu aplicativo acessa o pipeline escrevendo um perfil de cores ICC (International Color Consortium) formatado corretamente com dados extras armazenados em uma nova marca privada "Microsoft Hardware Calibration" ("MHC2"). É um modelo semelhante ao pipeline de rampa gama existente, que usa tags ICC privadas "VCGT". Os perfis ICC com dados de tag 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; O MHC1 foi lançado em uma versão anterior do Windows com PCs OEM específicos.

Metadados estáticos suplementares ST.2086 HDR

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

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

O ponto branco, a luminância máxima de quadro completo e as cores primárias RGB são descritas usando tags ICC padrão. A luminância de pico e mínima é descrita na etiqueta MHC2. Um perfil deve conter todas essas informações para que o sistema operacional aceite o perfil e o use para cenários de Cores Avançadas.

O Windows racionaliza os metadados ST.2086 de várias fontes, incluindo o perfil MHC ICC, o driver gráfico e o firmware EDID ou DisplayID. Os perfis 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 o DirectX com Cores Avançadas em exibições de intervalo dinâmico alto/padrão — dessa forma, os aplicativos HDR recebem as melhores informações de exibição HDR disponíveis.

Definição de luminância ST.2086 para displays de luz de fundo ajustáveis

Um monitor 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 sobre como os valores de luminância ST.2086 devem ser interpretados.

Para monitores em que o Windows tem controle sobre a luz de fundo (normalmente para laptops e dispositivos de painel integrado), 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 monitores 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 ICC

Um perfil ICC do MHC 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 MHC ICC deve ser um perfil de dispositivo de exibição.

Um perfil 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 MHC ICC deve incluir metadados ST.2086. Um perfil contendo apenas metadados ST.2086 e nenhum dado de transformação é usado para cenários de calibração de exibição HDR — nesse caso, a calibração 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 tags públicas existentes

Os perfis MHC ICC usam tags públicas existentes para definir alguns dos valores de metadados ST.2086. Todas essas tags já são necessárias para perfis de dispositivos de exibição. As definições de tag e tipo de dados podem ser encontradas nas especificações ICC.

Nome da marca Tipo de dados Valor ST.2086 Unidade reportada pelo Windows
vermelhoColorantTag XYZNúmero Primário vermelho Cromaticidade (xy)
verdeColoranteTag XYZNúmero Primário verde Cromaticidade (xy)
azulColorantTag XYZNúmero Primário azul Cromaticidade (xy)
mediaWhitePointTag XYZNúmero Ponto branco Cromaticidade (xy)
luminanceTag XYZNúmero Luminância máxima full frame Luminância (nits)

Definição de marca privada "MHC2"

Um perfil MHC ICC deve conter uma estrutura de tag MHC2. Os elementos de transformação de cor da matriz e 1DLUT podem ser definidos como 0 (NULL), que indicam 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 do byte Comprimento do campo (bytes) Sumário Tipo de dados
0 a 3 4 'MHC2' (4D484332h) Assinatura de tipo Tipo MHC2
4 a 7 4 Deslocamento para o início do elemento de dados da tag uInt32Número
8 a 13 4 Tamanho do elemento de dados da tag uInt32Número

MHC2Definição de estrutura do tipo

Posição do byte Comprimento do campo (bytes) Sumário Tipo de dados
0 a 3 4 'MHC2' (4D484332h) Assinatura de tipo
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
uInt32Número
12 a 15 4 ST.2086 luminância mínima em lêndeas S15Fixo16Número
16 a 19 anos 4 ST.2086 luminância de pico em lêndeas S15Fixo16Número
20 a 23 4 Deslocamento em bytes para matriz [2]
OPCIONAL: 0 = Transformação de identidade
uInt32Número
24 a 27 4 Deslocamento em bytes para vermelho 1DLUT [2] uInt32Número
28 a 31 4 Deslocamento em bytes para verde 1DLUT [2] uInt32Número
32 a 35 4 Deslocamento em bytes para azul 1DLUT [2] uInt32Número

[1] O sistema operacional interpolará os dados para a contagem de entradas suportadas por 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 do byte Comprimento do campo (bytes) Sumário Tipo de dados
0 a 47 48 Matriz de ajuste 3x4 XYZ para XYZ
armazenado na ordem principal da linha, a coluna 4 é ignorada [1]
s15Fixo16Número

[1] A estrutura da matriz é dimensionada para caber 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, armazenando 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 em Matriz de conversão de espaço de cores, não inclua o RGB de origem para XYZ ou XYZ para transformações de matriz RGB de destino, pois elas são tratadas automaticamente pelo driver. O RGB de destino é definido como a codificação usada ao transmitir cores pelo fio da tela; normalmente primárias BT.709 ou BT.2020.

Definição de 1DLUT

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

Observação

Conforme descrito em Target ReGamma, essa LUT opera no espaço de cores do formato de fio depois que a função de transferência é codificada.

Observação

Se suas medições ou curva de calibração precisarem de menos de 4096 entradas LUT, armazene apenas a contagem de entradas que você realmente precisa e especifique a contagem na estrutura MHC2Type. Por exemplo, a LUT de identidade mais simples requer apenas duas entradas definidas como 0,0 e 1,0. O sistema operacional interpolará para a contagem de entradas com suporte de hardware.

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

Observação

A orientação nesta seção se aplica a qualquer perfil ICC de exibição, independentemente de conter ou não dados MHC.

Depois de gerar um perfil MHC ICC, você o provisiona no sistema Windows para a exibição de destino. Em versões anteriores do Windows, você usaria as 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 no gerenciamento de perfis de cores ICC de exibição. Todas essas APIs são prefixadas com "ColorProfile":

  • ColorProfileAddDisplayAssociation
  • ColorProfileRemoveDisplayAssociation
  • ColorProfileSetDisplayDefaultAssociation
  • ColorProfileGetDeviceCapabilities

Observação

A API acima fornece funcionalidades para as quais não há equivalente existente à API do WCS.

  • ColorProfileGetDisplayList
  • ColorProfileGetDisplayDefault
  • ColorProfileGetDisplayUserScope

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

  1. Use ColorProfileGetDeviceCapabilities para determinar se o sistema dá suporte ao novo pipeline de transformação de cores. Mesmo que isso não aconteça, ainda pode ser benéfico provisionar o perfil para fornecer metadados ST.2086 suplementares.
  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 cores a uma exibição (tornar um perfil instalado selecionável para essa exibição) e, opcionalmente, defina o perfil como padrão (o perfil ativo no momento).

Carregador de calibração de exibição do Windows aprimorado

O Windows oferece um carregador de calibração de cores de exibição da caixa de entrada desde o Windows 7. Esse carregador de calibração suporta a leitura de perfis ICC com dados de pipeline de rampa gama armazenados em tags de perfil ICC privadas VCGT ou MS00. O carregador de rampa gama deve ser ativado explicitamente chamando WcsSetCalibrationManagementState.

Windows 10, versão 2004 aprimora o carregador de calibração da caixa de entrada adicionando suporte para perfis MHC ICC e o novo pipeline de transformação de cores. Escrever e provisionar um perfil 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 MHC ICC está sempre habilitada, portanto, uma vez que um perfil MHC ICC é definido como padrão em um sistema capaz, seu estado de calibração é carregado automaticamente.

Cenários HDR e Advanced Color 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 cores superior e acesso a gamas de cores de exibição muito maiores; para obter mais informações, consulte Usar o DirectX com Cores Avançadas em exibições de intervalo dinâmico alto/padrão.

O gerenciamento avançado de cores e cores automáticas garante cores de exibição consistentes e colorimetricamente precisas para todos os aplicativos: legados e modernos. No entanto, alguns aplicativos podem executar seu próprio gerenciamento de cores explícito usando perfis de cores ICC (International Color Consortium).

Quando a Cor Avançada está ativa em monitores SDR ou HDR, o comportamento dos perfis ICC do monitor muda de maneiras não compatíveis com versões anteriores. Se o 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 ICC e como você pode adaptar seu aplicativo para maximizar a compatibilidade com a Cor Avançada, consulte Comportamento do perfil ICC com a Cor Avançada.