Para matemática do shader, por que o RGB linear deve manter a gama de sRGB?


13

O sRGB costuma ser contrastado com "RGB linear".

  • As imagens são armazenadas no disco e transmitidas para os displays em sRGB, que são aproximadamente perceptualmente uniformes em intensidade.
  • A matemática do sombreador é feita em RGB linear, que é fisicamente uniforme em intensidade.
  • A correção gama pode ser aplicada para converter entre os dois.

Agora, o sRGB tem um padrão que especifica colorimetricamente sua gama, dizendo exatamente onde estão o vermelho puro, o verde, o azul e o branco. Mas não existe um padrão correspondente para apenas "RGB linear". Pode-se dizer que qualquer triângulo em um diagrama de cromaticidade é linear e, de fato, existem várias gamas bem conhecidas para você escolher:

Gama RGB

Na prática, quando dizemos "RGB linear", queremos dizer "sRGB sem a correção gama". (Isso é implicitamente o que estamos fazendo quando aplicamos a correção gama sRGB como uma etapa final de pós-processamento, mas ignoramos os espaços de cores para o restante do pipeline de renderização.)

Mas por que esse RGB é o correto para usar nos cálculos de interpolação e iluminação? Parece arbitrário. Se desejar, não queremos usar a maior gama possível para cálculos internos e, em seguida, recortar ou dimensionar cores na gama do dispositivo de saída no final?

Será que a iluminação RGB será aproximada, não importa o quê? Por isso, não importa qual gama escolhemos, e também podemos escolher a mais próxima do que a tela suporta nativamente? É apenas negligência? Ou os cálculos nessas diferentes gamas produzem exatamente os mesmos resultados, de alguma forma?

Respostas:


13

As conversas sobre RGB linear devem ser evitadas, pois não informam nada sobre as intrínsecas do espaço de cores RGB, ou seja, funções de transferência de cores primárias, de ponto branco e de componente. Alguns anos atrás, assumindo que o sRGB era mediano, mas hoje em dia com o DCI-P3 e o BT.2020 sendo muito comuns, deve ser descartado.

A gama ideal para renderização é a que minimizará erros em relação a uma referência do mundo real ou, mais convenientemente, uma renderização espectral de verdade no solo. A primeira conclusão desta frase é que os vários espaços de cores RGB não são equivalentes e não produzirão resultados semelhantes.

Pode-se pensar que a execução de duas renderizações com as mesmas cores base, mas uma onde elas são codificadas com sRGB / BT.709 e a outra onde elas são codificadas com DCI-P3 e depois converter as duas imagens resultantes, por exemplo, ACES2065-1 produzir as mesmas imagens, mas não é o caso. Algumas operações matemáticas, devido à natureza da álgebra e das matrizes lineares, dependem das primárias de espaço de cores RGB especificadas, ou seja, com base nos espaços de cores. As mesmas operações executadas em diferentes espaços de cores RGB produzirão diferentes valores de tristímulos, uma vez convertidos novamente no espaço de cores CIE XYZ. Por exemplo, operações de multiplicação, divisão e potência são primárias do espaço de cores RGB dependentes, enquanto adição e subtração não são.

Espaços de cor RGB e exponenciação

Esta imagem ilustra o efeito de multiplicar várias cores por si mesmas em diferentes espaços de cores RGB: as cores resultantes são diferentes. As várias amostras são geradas da seguinte forma: 3 valores aleatórios do espaço de cor do sRGB são selecionados e convertidos nos três espaços de cor RGB estudados, são exponenciados, convertidos novamente em espaço de cor do sRGB, plotados no diagrama de cromaticidade CIE 1931 à esquerda e exibidos como amostras no certo.

Testes e pesquisas realizados por Ward e Eydelberg-Vileshin (2002) , Langlands e Mansencal (2014) e Mansencal (2014) mostraram que as gamas com primárias mais próximas do locus espectral, ou seja, primárias espectralmente nítidas, tendem a minimizar os erros em comparação com o solo espectral a verdade rende.

Aqui está uma imagem que renderizei recentemente com a Mitsuba para re-validar nossas descobertas com Anders:

Renderização de espaços de cores

Essas são renderizações da mesma cena usando primárias BT.709 (primeira linha), 47 caixas espectrais (segunda linha), primárias BT.2020 (terceira linha), menos espectrais BT.709 primárias processa resíduos (quarta linha), espectral menos BT .2020 primárias processam resíduos (quinta linha). A última linha mostra imagens compostas montadas com três faixas verticais, respectivamente, das primárias BT.709, primaria espectral e BT.2020. A iluminação direta tende a corresponder entre as renderizações. Áreas que mostram o efeito de múltiplas oscilações de luz, ou seja, o teto, nas renderizações primárias BT.709 e BT.2020 tendem a exibir saturação aumentada, especialmente nas primárias BT.709, que produzem ou apresentam leve perda de energia, especialmente na BT .2020 render. Excluindo valores discrepantes, por exemplo, a fonte de luz visível, o RMSE com a renderização espectral são 0,0083e 0,0116 para, respectivamente, as primárias BT.2020 e BT.709 primárias.

Agora, isso não significa que eles sempre terão um desempenho melhor, e é possível produzir exemplos que exibirão um viés em relação ao BT.709 / sRGB. O principal argumento é que as renderizações RGB não podem corresponder às renderizações espectrais e as gamas amplas e nítidas tendem a ter um desempenho melhor. Quanto à escolha de um espaço de cores de renderização, eu escolheria um com uma ampla gama que engloba o Gamut do Pointer e o DCI-P3, BT.2020 ou ACEScg são excelentes candidatos para isso.


5

Na prática, quando dizemos "RGB linear", queremos dizer "sRGB sem a correção gama".

Seria mais correto dizer que existe o "espaço de cores sRGB" e o "espaço de cores sRGB linearizado", com a definição de especificação sRGB a conversão de um para outro.

Sim, existem infinitos espaços de cores "linear RGB". Mas o que todos esses espaços de cores "lineares RGB" têm em comum é que são lineares . Isso significa que, se você duplicar o valor de qualquer componente, duplicará a intensidade da luz que o componente representa. Isso é essencialmente o que significa ser "linear": existe um mapeamento linear entre os valores das cores e a intensidade resultante dessa cor clara.

Isso é importante porque as equações de iluminação não funcionam se os valores das cores não mapearem linearmente para as intensidades da luz. Mas as equações não se importam com o espaço de cores linear que você usa; você só precisa escolher um.

Portanto, o espaço de cores sRGB linearizado não é mais correto que um espaço de cores Adobe RGB linearizado ou um espaço de cores SWOP CMYK linearizado. O que importa são precisamente duas coisas:

  1. O espaço de cores representa um mapeamento linear de valores para intensidades de luz.
  2. O espaço de cores escolhido é usado consistentemente na equação da iluminação. Ou seja, todas as cores usadas na equação de iluminação vêm do mesmo espaço de cores (linear).

Será que a iluminação RGB será aproximada, não importa o quê? Por isso, não importa qual gama escolhemos, e também podemos escolher a mais próxima do que a tela suporta nativamente?

Isso e o fato de que a conversão de sRGB é incorporada ao hardware atualmente, enquanto outras conversões no espaço de cores frequentemente não são. Portanto, se você quiser usar o espaço de cores linearizado do Adobe RGB, precisará fazer muito trabalho em seus sombreadores para linearizar os valores texel e executar a interpolação bilinear / trilinear neles corretamente (o que precisa ser feito após a linearização) antes que você possa aplicar para a equação da iluminação. E então você deve fazer a conversão do Adobe RGB linearizado em sRGB linearizado, para poder gravar em uma imagem de buffer de quadro sRGB para exibição.

Ou você pode simplesmente usar sRGB linearizado em qualquer lugar e ter desempenho. Este último tende a vencer.


O que você acha deste artigo? Se eu estou lendo isso direito, ele demonstra que os cálculos em diferentes espaços de cor lineares fazer levar a resultados diferentes.
Maxpm

@ Maxpm: Isso é interessante. Minha leitura desse artigo é que o problema se resume ao fato de que a luz não se encaixa no nosso modelo de espaço de cores RGB. Isso causa resultados visuais divergentes no que deveria ser matematicamente a mesma coisa. Lá, a única solução parece ser parar de usar RGB e começar a usar renderização espectral.
Nicol Bolas

@ Maxpm, mas é claro que eles fazem depois que todos os outros espaços são diferentes. Mas então RGB não é cor, então existe isso. Mas depois há a pergunta correta: você quer ser. Os ganhos se tornam cada vez menores,
joojaa

0

Existem dois lados do porquê do sRGB em particular. Para imagens não HDR de entrada, alega-se que elas devam ser comprimidas para sRGB (se essa afirmação é precisa é uma história diferente). Portanto, antes de poder executar qualquer operação matemática linear com eles, é necessário descompactá-los do sRGB. Também é possível que uma imagem tenha sido capturada e compactada para uma representação diferente que não seja sRGB; nesse caso, você precisará descompactar essa representação específica. De qualquer forma, a codificação implica em uma certa gama que a imagem de entrada nunca escapa (porque as imagens armazenadas em sRGB são normalmente truncadas para 8 bits por canal), mas a matemática do sombreador não precisa permanecer nessa gama após a entrada a imagem está descompactada. Mas, no final, você deve considerar a exibição.

Se você tiver uma imagem e estiver na hora de exibi-la, codifique-a em uma representação exigida pelo dispositivo de exibição. Os CRTs escolheram sRGB e os LCDs emularam que, portanto, a compactação de sRGB para a tela do monitor tem sido a escolha comum nas últimas décadas e que restringia a saída a ficar dentro da gama de sRGB, caso contrário, ocorreria um recorte. Os monitores de maior alcance não precisam seguir exatamente essa gama.

(Eu acho que a base para a alegação de que imagens criadas pelo homem são codificadas por sRGB é porque essas imagens foram criadas como sendo criadas em monitores sRGB)

Portanto, agora você provavelmente pode entender melhor por que o sRGB, em particular, foi suportado no hardware para entrada matemática do shader e exibição de imagens. É o caso comum. Além disso, possui bons méritos para reduzir artefatos de faixas de cores perceptivas, portanto, é uma boa maneira de compactar cores em 8 bits e mantê-las plausíveis para os seres humanos.


0

Se você permitir valores fora do intervalo 0..1, mesmo com as primárias bastante limitadas do sRGB, ainda será possível abordar toda a gama visual humana. Portanto, para armazenar valores de cores claras de ponto flutuante, não importa muito quais primárias você usa. No entanto, fazer qualquer tipo de matemática multiplicativa fica um pouco estranho, pois as coordenadas arbitrárias das primárias atuam como o 'pivô' da escala. As primárias sRGB geralmente são usadas porque, tradicionalmente, os dados de entrada são codificados por sRGB e a exibição de saída é sRGB ou rec709 ... Com o rec2020, metade disso foi alterada, mas, por enquanto, a maioria dos dados de entrada ainda é provavelmente codificada por sRGB, portanto, use as mesmas primárias do seu armazenamento são apenas a opção mais fácil.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.