Pedalando pelas cores com o mesmo brilho

8

Está bem. Então, eu tenho um jogo no qual estou trabalhando com um monte de partículas coloridas. Cada um deles tem sua própria cor, no entanto, todos estão próximos de um tom específico.

Para explicar melhor, estou usando o espaço de cores HSV e tenho uma variável global que varia de 0 a 360 (H) e cada uma das partículas específicas adiciona ou subtrai uma quantidade aleatória disso.

insira a descrição da imagem aqui Eu uso o HSV porque é a maneira mais fácil de percorrer as cores, porque você pode mudar H.

Parece muito bom e tudo, no entanto, as partículas devem ser pura luz colorida. No momento, tudo o que são são círculos coloridos com a sombra, mas mais tarde eu poderia adicionar efeitos de brilho e outras técnicas de sombreamento.

O problema é que nem todas as tonalidades (eu não mexo com H ou V) são iguais quanto ao brilho que nossos olhos vêem, e isso causa problemas. Por exemplo, quando todos eles são tons de azul, as coisas parecem bem escuras.

Obviamente, no shader, tenho que converter essas cores HSV em cores RGB e, ao fazer algumas contas, rapidamente vi o que estava errado ... as cores não tinham a mesma luminância!

Pelo que entendi, a luminância é mais (0.2126*color.r + 0.7152*color.g + 0.0722*color.b)ou menos e é por isso que tudo está desligado.

É uma maneira de obtê-lo para que eu ainda possa obter todos os cromas diferentes (cores nos graus das rodas), mantendo uma alta luminância? Talvez eu deva trabalhar com um tipo de cor diferente do HSV, ou talvez seja uma fórmula que encontre uma cor no grau x na roda de cores com luminância de y?

Muito obrigado!

J.Doe
fonte
Infelizmente, existem limites para isso. Se você observar um espaço de cores perceptualmente uniforme como o sistema de cores Munsell, verá que o amarelo brilhante tem um valor percebido muito mais alto do que o azul forte . Isso significa que se você quiser manter uniforme valor percebido / luminância, então você pode obter tanto um rico azul royal emparelhado com um ocre escuro na cor amarela, ou um amarelo brilhante com azul pálido bebê. De qualquer maneira, você sacrifica alguma saturação em algum lugar da roda de cores.
DMGregory
11
Como você observou, RGB e HSL são projetados em torno de possíveis cores da tela e não em torno dos olhos humanos. Dê uma olhada no HUSL e HCL . Às vezes eu vou usar L * a * b * também.
Amitp
@amitp esses espaços de cores parecem ser relativamente novos e estou vendo algumas diferenças em como eles são definidos e como são convertidos. Qual fonte seria a mais confiável para isso?
J.Doe
Estou em um ônibus, por isso é melhor não escrever uma resposta formal, mas aqui está o que está por trás do problema: você precisará resolver um sistema de equações onde plugue três variáveis: Matiz, Luminância e Saturação. Então, aqui você está procurando um valor específico, dados H e S, que atenda à condição de ter certa luminância. Não é muito difícil. Mas em breve você descobrirá que algumas cores não podem ficar tão luminosas quanto algumas (tente encontrar um azul tão luminoso quanto um amarelo de 100V); portanto, convém fixar os valores para obter valores representáveis ​​na tela.
Gustavo Maciel
Sim, eu tenho trabalhado nisso. Eu tenho uma fórmula recursiva em andamento ... E uma fórmula não recursiva (que não está funcionando bem).
J.Doe

Respostas:

2

HCY poderia ser melhor para suas necessidades. De acordo com a página HSL e HSV da Wikipedia , o problema que você está tendo com o HSV - que o mesmo "V" com matizes diferentes não corresponde à percepção humana - é semelhante ao HSL, mas o HCY pode atender às suas necessidades - o "Y" em HCY é para "luma":

Luma é aproximadamente similar [em leveza à imagem colorida original], mas difere um pouco em alta croma. HSL L e HSV V, por outro lado, divergem substancialmente da leveza perceptiva.

HCY é descrito na página da Wikipedia como "luma / chroma / hue". Esta página , por outro lado, parece usar a abreviação "HCY" e mostra como convertê-la para e de RGB.

Jibb Smart
fonte
2
Sua sugestão de divisão alternativa não funcionará para cores como azul (0, 0, 1) - porque podemos acabar saturando o alcance de nossas primárias antes de atingir a luma desejada. Um fósforo azul na tela do player não pode ser conduzido arbitrariamente de maneira brilhante (embora o HDR possa escurecer o resto da tela para tentar dar a ilusão de que o azul é tão brilhante. Ou você pode definir seu objetivo de luma para 0,0722 para poder dividir qualquer cor para que luma, ao custo de cores muito escuras em geral)
DMGregory
Bom ponto. Vou melhorar essa parte da resposta.
Jibb Smart
Existem várias maneiras de melhorar a sugestão alternativa, mas ela fica bastante complexa antes de realmente obter o tipo de resultado que o OP provavelmente deseja, então removi minha alternativa. HCY deve ser suficiente.
Jibb inteligente
Estou fazendo algumas experiências com tudo isso. Estarei atualizando em alguns dias para ver como esses espaços de cores se pré-formam. Muito obrigado pessoal!
J.Doe
@DMGregory, você poderia explicar mais sobre o que você quer dizer com "defina sua meta de luma para 0,0722 para poder dividir qualquer cor nessa luma, ao custo de cores muito escuras no geral"?
J.Doe